d3ro-voice/apps/web/.next/static/chunks/473-2ce7daac11af0439.js
yunchan8804 61a96b3e9b feat(V2-6/V2-7/V2-8): Mobile MVP + Teams + Billing 스캐폴딩
V2-6 — Mobile (Expo) MVP
- apps/mobile/ 신규, npm workspace에서 제외 (Expo deps 부담 회피)
- Expo SDK 51 + Expo Router + AsyncStorage Supabase 클라이언트
- 화면: index/login/(tabs)/{meetings,record,profile}
- expo-av로 녹음 → Edge Function stt-proxy 호출
- expo-web-browser + expo-linking으로 OAuth 콜백 처리
- README에 setup/EAS build 가이드
- 루트 package.json workspaces를 명시 나열로 변경 (apps/mobile 제외)

V2-7 — 팀 기능 (Web)
- apps/web/src/app/teams/page.tsx — 가입한 팀 카드 그리드
- apps/web/src/app/teams/[id]/page.tsx — 멤버 + 공유 회의
- components/teams/create-team-form.tsx — 팀 생성 + owner 자동 team_members
- components/teams/invite-member-form.tsx — user_id 직접 초대 (V2-7b에서 invite flow)
- Sidebar에 Teams/Billing 메뉴 + 아이콘
- ko.json에 nav.teams/nav.billing 키 추가
- V2-2 teams/team_members RLS 활용

V2-8 — 결제 스캐폴딩
- apps/web/src/app/billing/page.tsx — Free/Pro/Team 가격표 + 현재 구독
- components/billing/checkout-button.tsx — Edge Function 호출 후 redirect
- server/supabase/functions/stripe-checkout/index.ts:
  - JWT 인증 -> 기존 customer 조회/생성 -> Checkout Session 생성
  - subscriptions 테이블에 customer_id upsert
- server/supabase/functions/stripe-webhook/index.ts:
  - checkout.session.completed -> subscriptions tier=pro/team active
  - customer.subscription.updated/created -> status/period 업데이트
  - customer.subscription.deleted -> tier=free, status=canceled
  - signature 검증은 placeholder (V2-8b에서 정식)
- server/supabase/config.toml에 두 함수 등록 (webhook verify_jwt=false)

검증:
- desktop typecheck OK (회귀 없음)
- web typecheck OK
- web next build OK (11 라우트)
- mobile은 별도 install 필요 (workspace 제외)

memory/project_status.md 갱신 — V2 마스터 플랜 전 페이즈 로컬 완료
2026-04-09 16:39:54 +09:00

1 line
No EOL
14 KiB
JavaScript

"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[473],{42:(e,t,r)=>{r.d(t,{A:()=>o});let o=r(7488).A},812:(e,t,r)=>{r.d(t,{A:()=>a});var o=r(8703),n=r(4568);let a=(0,o.A)((0,n.jsx)("path",{d:"M12 12.75c1.63 0 3.07.39 4.24.9 1.08.48 1.76 1.56 1.76 2.73V18H6v-1.61c0-1.18.68-2.26 1.76-2.73 1.17-.52 2.61-.91 4.24-.91M4 13c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2m1.13 1.1c-.37-.06-.74-.1-1.13-.1-.99 0-1.93.21-2.78.58C.48 14.9 0 15.62 0 16.43V18h4.5v-1.61c0-.83.23-1.61.63-2.29M20 13c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2m4 3.43c0-.81-.48-1.53-1.22-1.85-.85-.37-1.79-.58-2.78-.58-.39 0-.76.04-1.13.1.4.68.63 1.46.63 2.29V18H24zM12 6c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3"}),"Groups")},831:(e,t,r)=>{r.d(t,{A:()=>o});let o=r(7620).createContext({})},1084:(e,t,r)=>{r.d(t,{A:()=>a});var o=r(8703),n=r(4568);let a=(0,o.A)((0,n.jsx)("path",{d:"M3 13h8V3H3zm0 8h8v-6H3zm10 0h8V11h-8zm0-18v6h8V3z"}),"Dashboard")},1114:(e,t,r)=>{r.d(t,{A:()=>s,Y:()=>a});var o=r(8020),n=r(3664);function a(e){return(0,n.Ay)("MuiListItemButton",e)}let s=(0,o.A)("MuiListItemButton",["root","focusVisible","dense","alignItemsFlexStart","disabled","divider","gutters","selected"])},1166:(e,t,r)=>{r.d(t,{A:()=>a});var o=r(8703),n=r(4568);let a=(0,o.A)((0,n.jsx)("path",{d:"M20 4H4c-1.11 0-1.99.89-1.99 2L2 18c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V6c0-1.11-.89-2-2-2m0 14H4v-6h16zm0-10H4V6h16z"}),"Payment")},2010:(e,t,r)=>{r.d(t,{A:()=>a});var o=r(8703),n=r(4568);let a=(0,o.A)((0,n.jsx)("path",{d:"m17 7-1.41 1.41L18.17 11H8v2h10.17l-2.58 2.58L17 17l5-5zM4 5h8V3H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h8v-2H4z"}),"Logout")},2278:(e,t,r)=>{r.d(t,{A:()=>a});var o=r(8703),n=r(4568);let a=(0,o.A)((0,n.jsx)("path",{d:"M14 6v15H3v-2h2V3h9v1h5v15h2v2h-4V6zm-4 5v2h2v-2z"}),"MeetingRoom")},2471:(e,t,r)=>{r.d(t,{A:()=>o});let o=r(3904).A},2775:(e,t,r)=>{r.d(t,{A:()=>a});var o=r(8703),n=r(4568);let a=(0,o.A)((0,n.jsx)("path",{d:"M12 14c1.66 0 2.99-1.34 2.99-3L15 5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3m5.3-3c0 3-2.54 5.1-5.3 5.1S6.7 14 6.7 11H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c3.28-.48 6-3.3 6-6.72z"}),"Mic")},3775:(e,t,r)=>{r.d(t,{A:()=>h});var o=r(7620),n=r(2902),a=r(7138),s=r(4953),i=r(7226),l=r(831),d=r(8613),c=r(5120),u=r(8020),p=r(3664);function m(e){return(0,p.Ay)("MuiListItemText",e)}let v=(0,u.A)("MuiListItemText",["root","multiline","dense","inset","primary","secondary"]);var A=r(7972),y=r(4568);let g=(0,d.default)("div",{name:"MuiListItemText",slot:"Root",overridesResolver:(e,t)=>{let{ownerState:r}=e;return[{["& .".concat(v.primary)]:t.primary},{["& .".concat(v.secondary)]:t.secondary},t.root,r.inset&&t.inset,r.primary&&r.secondary&&t.multiline,r.dense&&t.dense]}})({flex:"1 1 auto",minWidth:0,marginTop:4,marginBottom:4,[".".concat(s.A.root,":where(& .").concat(v.primary,"), .").concat(s.A.root,":where(& .").concat(v.secondary,")")]:{display:"block"},variants:[{props:e=>{let{ownerState:t}=e;return t.primary&&t.secondary},style:{marginTop:6,marginBottom:6}},{props:e=>{let{ownerState:t}=e;return t.inset},style:{paddingLeft:56}}]}),h=o.forwardRef(function(e,t){let r=(0,c.b)({props:e,name:"MuiListItemText"}),{children:s,className:d,disableTypography:u=!1,inset:p=!1,primary:v,primaryTypographyProps:h,secondary:f,secondaryTypographyProps:x,slots:b={},slotProps:I={},...M}=r,{dense:L}=o.useContext(l.A),S=null!=v?v:s,R=f,C={...r,disableTypography:u,inset:p,primary:!!S,secondary:!!R,dense:L},w=(e=>{let{classes:t,inset:r,primary:o,secondary:n,dense:s}=e;return(0,a.A)({root:["root",r&&"inset",s&&"dense",o&&n&&"multiline"],primary:["primary"],secondary:["secondary"]},m,t)})(C),j={slots:b,slotProps:{primary:h,secondary:x,...I}},[k,N]=(0,A.A)("root",{className:(0,n.A)(w.root,d),elementType:g,externalForwardedProps:{...j,...M},ownerState:C,ref:t}),[V,P]=(0,A.A)("primary",{className:w.primary,elementType:i.A,externalForwardedProps:j,ownerState:C}),[T,z]=(0,A.A)("secondary",{className:w.secondary,elementType:i.A,externalForwardedProps:j,ownerState:C});return null==S||S.type===i.A||u||(S=(0,y.jsx)(V,{variant:L?"body2":"body1",component:(null==P?void 0:P.variant)?void 0:"span",...P,children:S})),null==R||R.type===i.A||u||(R=(0,y.jsx)(T,{variant:"body2",color:"textSecondary",...z,children:R})),(0,y.jsxs)(k,{...N,children:[S,R]})})},5431:(e,t,r)=>{r.d(t,{A:()=>A});var o=r(7620),n=r(2902),a=r(7138),s=r(8613),i=r(9468),l=r(5120),d=r(8020),c=r(3664);function u(e){return(0,c.Ay)("MuiListItemIcon",e)}(0,d.A)("MuiListItemIcon",["root","alignItemsFlexStart"]);var p=r(831),m=r(4568);let v=(0,s.default)("div",{name:"MuiListItemIcon",slot:"Root",overridesResolver:(e,t)=>{let{ownerState:r}=e;return[t.root,"flex-start"===r.alignItems&&t.alignItemsFlexStart]}})((0,i.A)(e=>{let{theme:t}=e;return{minWidth:56,color:(t.vars||t).palette.action.active,flexShrink:0,display:"inline-flex",variants:[{props:{alignItems:"flex-start"},style:{marginTop:8}}]}})),A=o.forwardRef(function(e,t){let r=(0,l.b)({props:e,name:"MuiListItemIcon"}),{className:s,...i}=r,d=o.useContext(p.A),c={...r,alignItems:d.alignItems},A=(e=>{let{alignItems:t,classes:r}=e;return(0,a.A)({root:["root","flex-start"===t&&"alignItemsFlexStart"]},u,r)})(c);return(0,m.jsx)(v,{className:(0,n.A)(A.root,s),ownerState:c,ref:t,...i})})},6262:(e,t,r)=>{r.d(t,{A:()=>g});var o=r(7620),n=r(2902),a=r(7138),s=r(8613),i=r(9468),l=r(5120),d=r(8039),c=r(1370),u=r(2471),p=r(1377),m=r(831),v=r(1114),A=r(4568);let y=(0,s.default)(c.A,{shouldForwardProp:e=>(0,d.A)(e)||"classes"===e,name:"MuiListItemButton",slot:"Root",overridesResolver:(e,t)=>{let{ownerState:r}=e;return[t.root,r.dense&&t.dense,"flex-start"===r.alignItems&&t.alignItemsFlexStart,r.divider&&t.divider,!r.disableGutters&&t.gutters]}})((0,i.A)(e=>{let{theme:t}=e;return{display:"flex",flexGrow:1,justifyContent:"flex-start",alignItems:"center",position:"relative",textDecoration:"none",minWidth:0,boxSizing:"border-box",textAlign:"left",paddingTop:8,paddingBottom:8,transition:t.transitions.create("background-color",{duration:t.transitions.duration.shortest}),"&:hover":{textDecoration:"none",backgroundColor:(t.vars||t).palette.action.hover,"@media (hover: none)":{backgroundColor:"transparent"}},["&.".concat(v.A.selected)]:{backgroundColor:t.alpha((t.vars||t).palette.primary.main,(t.vars||t).palette.action.selectedOpacity),["&.".concat(v.A.focusVisible)]:{backgroundColor:t.alpha((t.vars||t).palette.primary.main,"".concat((t.vars||t).palette.action.selectedOpacity," + ").concat((t.vars||t).palette.action.focusOpacity))}},["&.".concat(v.A.selected,":hover")]:{backgroundColor:t.alpha((t.vars||t).palette.primary.main,"".concat((t.vars||t).palette.action.selectedOpacity," + ").concat((t.vars||t).palette.action.hoverOpacity)),"@media (hover: none)":{backgroundColor:t.alpha((t.vars||t).palette.primary.main,(t.vars||t).palette.action.selectedOpacity)}},["&.".concat(v.A.focusVisible)]:{backgroundColor:(t.vars||t).palette.action.focus},["&.".concat(v.A.disabled)]:{opacity:(t.vars||t).palette.action.disabledOpacity},variants:[{props:e=>{let{ownerState:t}=e;return t.divider},style:{borderBottom:"1px solid ".concat((t.vars||t).palette.divider),backgroundClip:"padding-box"}},{props:{alignItems:"flex-start"},style:{alignItems:"flex-start"}},{props:e=>{let{ownerState:t}=e;return!t.disableGutters},style:{paddingLeft:16,paddingRight:16}},{props:e=>{let{ownerState:t}=e;return t.dense},style:{paddingTop:4,paddingBottom:4}}]}})),g=o.forwardRef(function(e,t){let r=(0,l.b)({props:e,name:"MuiListItemButton"}),{alignItems:s="center",autoFocus:i=!1,component:d="div",children:c,dense:g=!1,disableGutters:h=!1,divider:f=!1,focusVisibleClassName:x,selected:b=!1,className:I,...M}=r,L=o.useContext(m.A),S=o.useMemo(()=>({dense:g||L.dense||!1,alignItems:s,disableGutters:h}),[s,L.dense,g,h]),R=o.useRef(null);(0,u.A)(()=>{i&&R.current&&R.current.focus()},[i]);let C={...r,alignItems:s,dense:S.dense,disableGutters:h,divider:f,selected:b},w=(e=>{let{alignItems:t,classes:r,dense:o,disabled:n,disableGutters:s,divider:i,selected:l}=e,d=(0,a.A)({root:["root",o&&"dense",!s&&"gutters",i&&"divider",n&&"disabled","flex-start"===t&&"alignItemsFlexStart",l&&"selected"]},v.Y,r);return{...r,...d}})(C),j=(0,p.A)(R,t);return(0,A.jsx)(m.A.Provider,{value:S,children:(0,A.jsx)(y,{ref:j,href:M.href||M.to,component:(M.href||M.to)&&"div"===d?"button":d,focusVisibleClassName:(0,n.A)(w.focusVisible,x),ownerState:C,className:(0,n.A)(w.root,I),...M,classes:w,children:c})})})},6763:(e,t,r)=>{r.d(t,{Ay:()=>L});var o=r(7620),n=r(2902),a=r(7138),s=r(4620),i=r(8613),l=r(9468),d=r(5120),c=r(42),u=r(1377),p=r(7972),m=r(831),v=r(8020),A=r(3664);function y(e){return(0,A.Ay)("MuiListItem",e)}(0,v.A)("MuiListItem",["root","container","dense","alignItemsFlexStart","divider","gutters","padding","secondaryAction"]);var g=r(1114);function h(e){return(0,A.Ay)("MuiListItemSecondaryAction",e)}(0,v.A)("MuiListItemSecondaryAction",["root","disableGutters"]);var f=r(4568);let x=(0,i.default)("div",{name:"MuiListItemSecondaryAction",slot:"Root",overridesResolver:(e,t)=>{let{ownerState:r}=e;return[t.root,r.disableGutters&&t.disableGutters]}})({position:"absolute",right:16,top:"50%",transform:"translateY(-50%)",variants:[{props:e=>{let{ownerState:t}=e;return t.disableGutters},style:{right:0}}]}),b=o.forwardRef(function(e,t){let r=(0,d.b)({props:e,name:"MuiListItemSecondaryAction"}),{className:s,...i}=r,l=o.useContext(m.A),c={...r,disableGutters:l.disableGutters},u=(e=>{let{disableGutters:t,classes:r}=e;return(0,a.A)({root:["root",t&&"disableGutters"]},h,r)})(c);return(0,f.jsx)(x,{className:(0,n.A)(u.root,s),ownerState:c,ref:t,...i})});b.muiName="ListItemSecondaryAction";let I=(0,i.default)("div",{name:"MuiListItem",slot:"Root",overridesResolver:(e,t)=>{let{ownerState:r}=e;return[t.root,r.dense&&t.dense,"flex-start"===r.alignItems&&t.alignItemsFlexStart,r.divider&&t.divider,!r.disableGutters&&t.gutters,!r.disablePadding&&t.padding,r.hasSecondaryAction&&t.secondaryAction]}})((0,l.A)(e=>{let{theme:t}=e;return{display:"flex",justifyContent:"flex-start",alignItems:"center",position:"relative",textDecoration:"none",width:"100%",boxSizing:"border-box",textAlign:"left",variants:[{props:e=>{let{ownerState:t}=e;return!t.disablePadding},style:{paddingTop:8,paddingBottom:8}},{props:e=>{let{ownerState:t}=e;return!t.disablePadding&&t.dense},style:{paddingTop:4,paddingBottom:4}},{props:e=>{let{ownerState:t}=e;return!t.disablePadding&&!t.disableGutters},style:{paddingLeft:16,paddingRight:16}},{props:e=>{let{ownerState:t}=e;return!t.disablePadding&&!!t.secondaryAction},style:{paddingRight:48}},{props:e=>{let{ownerState:t}=e;return!!t.secondaryAction},style:{["& > .".concat(g.A.root)]:{paddingRight:48}}},{props:{alignItems:"flex-start"},style:{alignItems:"flex-start"}},{props:e=>{let{ownerState:t}=e;return t.divider},style:{borderBottom:"1px solid ".concat((t.vars||t).palette.divider),backgroundClip:"padding-box"}},{props:e=>{let{ownerState:t}=e;return t.button},style:{transition:t.transitions.create("background-color",{duration:t.transitions.duration.shortest}),"&:hover":{textDecoration:"none",backgroundColor:(t.vars||t).palette.action.hover,"@media (hover: none)":{backgroundColor:"transparent"}}}},{props:e=>{let{ownerState:t}=e;return t.hasSecondaryAction},style:{paddingRight:48}}]}})),M=(0,i.default)("li",{name:"MuiListItem",slot:"Container"})({position:"relative"}),L=o.forwardRef(function(e,t){let r=(0,d.b)({props:e,name:"MuiListItem"}),{alignItems:i="center",children:l,className:v,component:A,components:g={},componentsProps:h={},ContainerComponent:x="li",ContainerProps:{className:L,...S}={},dense:R=!1,disableGutters:C=!1,disablePadding:w=!1,divider:j=!1,secondaryAction:k,slotProps:N={},slots:V={},...P}=r,T=o.useContext(m.A),z=o.useMemo(()=>({dense:R||T.dense||!1,alignItems:i,disableGutters:C}),[i,T.dense,R,C]),B=o.useRef(null),G=o.Children.toArray(l),F=G.length&&(0,c.A)(G[G.length-1],["ListItemSecondaryAction"]),H={...r,alignItems:i,dense:z.dense,disableGutters:C,disablePadding:w,divider:j,hasSecondaryAction:F},O=(e=>{let{alignItems:t,classes:r,dense:o,disableGutters:n,disablePadding:s,divider:i,hasSecondaryAction:l}=e;return(0,a.A)({root:["root",o&&"dense",!n&&"gutters",!s&&"padding",i&&"divider","flex-start"===t&&"alignItemsFlexStart",l&&"secondaryAction"],container:["container"],secondaryAction:["secondaryAction"]},y,r)})(H),D=(0,u.A)(B,t),[_,E]=(0,p.A)("secondaryAction",{elementType:b,externalForwardedProps:{slots:V,slotProps:N},ownerState:H,className:O.secondaryAction}),W=V.root||g.Root||I,Y=N.root||h.root||{},q={className:(0,n.A)(O.root,Y.className,v),...P},J=A||"li";return F?(J=q.component||A?J:"div","li"===x&&("li"===J?J="div":"li"===q.component&&(q.component="div")),(0,f.jsx)(m.A.Provider,{value:z,children:(0,f.jsxs)(M,{as:x,className:(0,n.A)(O.container,L),ref:D,ownerState:H,...S,children:[(0,f.jsx)(W,{...Y,...!(0,s.A)(W)&&{as:J,ownerState:{...H,...Y.ownerState}},...q,children:G}),G.pop()]})})):(0,f.jsx)(m.A.Provider,{value:z,children:(0,f.jsxs)(W,{...Y,as:J,ref:D,...!(0,s.A)(W)&&{ownerState:{...H,...Y.ownerState}},...q,children:[G,k&&(0,f.jsx)(_,{...E,children:k})]})})})},6987:(e,t,r)=>{r.d(t,{A:()=>v});var o=r(7620),n=r(2902),a=r(7138),s=r(8613),i=r(5120),l=r(831),d=r(8020),c=r(3664);function u(e){return(0,c.Ay)("MuiList",e)}(0,d.A)("MuiList",["root","padding","dense","subheader"]);var p=r(4568);let m=(0,s.default)("ul",{name:"MuiList",slot:"Root",overridesResolver:(e,t)=>{let{ownerState:r}=e;return[t.root,!r.disablePadding&&t.padding,r.dense&&t.dense,r.subheader&&t.subheader]}})({listStyle:"none",margin:0,padding:0,position:"relative",variants:[{props:e=>{let{ownerState:t}=e;return!t.disablePadding},style:{paddingTop:8,paddingBottom:8}},{props:e=>{let{ownerState:t}=e;return t.subheader},style:{paddingTop:0}}]}),v=o.forwardRef(function(e,t){let r=(0,i.b)({props:e,name:"MuiList"}),{children:s,className:d,component:c="ul",dense:v=!1,disablePadding:A=!1,subheader:y,...g}=r,h=o.useMemo(()=>({dense:v}),[v]),f={...r,component:c,dense:v,disablePadding:A},x=(e=>{let{classes:t,disablePadding:r,dense:o,subheader:n}=e;return(0,a.A)({root:["root",!r&&"padding",o&&"dense",n&&"subheader"]},u,t)})(f);return(0,p.jsx)(l.A.Provider,{value:h,children:(0,p.jsxs)(m,{as:c,className:(0,n.A)(x.root,d),ref:t,ownerState:f,...g,children:[y,s]})})})},7488:(e,t,r)=>{r.d(t,{A:()=>n});var o=r(7620);function n(e,t){return o.isValidElement(e)&&-1!==t.indexOf(e.type.muiName??e.type?._payload?.value?.muiName)}}}]);