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 마스터 플랜 전 페이즈 로컬 완료
1 line
No EOL
11 KiB
JavaScript
1 line
No EOL
11 KiB
JavaScript
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[32],{5299:(e,t,o)=>{o.d(t,{A:()=>A});var a=o(7620),r=o(2902),l=o(7138),n=o(9274),i=o(8613),s=o(1774),c=o(9468),d=o(5120),p=o(7626),u=o(8020),v=o(3664);function g(e){return(0,v.Ay)("MuiPaper",e)}(0,u.A)("MuiPaper",["root","rounded","outlined","elevation","elevation0","elevation1","elevation2","elevation3","elevation4","elevation5","elevation6","elevation7","elevation8","elevation9","elevation10","elevation11","elevation12","elevation13","elevation14","elevation15","elevation16","elevation17","elevation18","elevation19","elevation20","elevation21","elevation22","elevation23","elevation24"]);var m=o(4568);let f=(0,i.default)("div",{name:"MuiPaper",slot:"Root",overridesResolver:(e,t)=>{let{ownerState:o}=e;return[t.root,t[o.variant],!o.square&&t.rounded,"elevation"===o.variant&&t["elevation".concat(o.elevation)]]}})((0,c.A)(e=>{let{theme:t}=e;return{backgroundColor:(t.vars||t).palette.background.paper,color:(t.vars||t).palette.text.primary,transition:t.transitions.create("box-shadow"),variants:[{props:e=>{let{ownerState:t}=e;return!t.square},style:{borderRadius:t.shape.borderRadius}},{props:{variant:"outlined"},style:{border:"1px solid ".concat((t.vars||t).palette.divider)}},{props:{variant:"elevation"},style:{boxShadow:"var(--Paper-shadow)",backgroundImage:"var(--Paper-overlay)"}}]}})),A=a.forwardRef(function(e,t){var o;let a=(0,d.b)({props:e,name:"MuiPaper"}),i=(0,s.default)(),{className:c,component:u="div",elevation:v=1,square:A=!1,variant:h="elevation",...y}=a,b={...a,component:u,elevation:v,square:A,variant:h},x=(e=>{let{square:t,elevation:o,variant:a,classes:r}=e;return(0,l.A)({root:["root",a,!t&&"rounded","elevation"===a&&"elevation".concat(o)]},g,r)})(b);return(0,m.jsx)(f,{as:u,ownerState:b,className:(0,r.A)(x.root,c),ref:t,...y,style:{..."elevation"===h&&{"--Paper-shadow":(i.vars||i).shadows[v],...i.vars&&{"--Paper-overlay":null==(o=i.vars.overlays)?void 0:o[v]},...!i.vars&&"dark"===i.palette.mode&&{"--Paper-overlay":"linear-gradient(".concat((0,n.X4)("#fff",(0,p.A)(v)),", ").concat((0,n.X4)("#fff",(0,p.A)(v)),")")}},...y.style}})})},6032:(e,t,o)=>{o.d(t,{A:()=>T});var a=o(7620),r=o(2902),l=o(7138),n=o(8613),i=o(9468),s=o(5120),c=o(7972),d=o(9407),p=o(8177),u=o(5299),v=o(8020),g=o(3664);function m(e){return(0,g.Ay)("MuiAlert",e)}let f=(0,v.A)("MuiAlert",["root","action","icon","message","filled","colorSuccess","colorInfo","colorWarning","colorError","filledSuccess","filledInfo","filledWarning","filledError","outlined","outlinedSuccess","outlinedInfo","outlinedWarning","outlinedError","standard","standardSuccess","standardInfo","standardWarning","standardError"]);var A=o(3361),h=o(1370),y=o(5663);function b(e){return(0,g.Ay)("MuiIconButton",e)}let x=(0,v.A)("MuiIconButton",["root","disabled","colorInherit","colorPrimary","colorSecondary","colorError","colorInfo","colorSuccess","colorWarning","edgeStart","edgeEnd","sizeSmall","sizeMedium","sizeLarge","loading","loadingIndicator","loadingWrapper"]);var C=o(4568);let M=(0,n.default)(h.A,{name:"MuiIconButton",slot:"Root",overridesResolver:(e,t)=>{let{ownerState:o}=e;return[t.root,o.loading&&t.loading,"default"!==o.color&&t["color".concat((0,d.A)(o.color))],o.edge&&t["edge".concat((0,d.A)(o.edge))],t["size".concat((0,d.A)(o.size))]]}})((0,i.A)(e=>{let{theme:t}=e;return{textAlign:"center",flex:"0 0 auto",fontSize:t.typography.pxToRem(24),padding:8,borderRadius:"50%",color:(t.vars||t).palette.action.active,transition:t.transitions.create("background-color",{duration:t.transitions.duration.shortest}),variants:[{props:e=>!e.disableRipple,style:{"--IconButton-hoverBg":t.alpha((t.vars||t).palette.action.active,(t.vars||t).palette.action.hoverOpacity),"&:hover":{backgroundColor:"var(--IconButton-hoverBg)","@media (hover: none)":{backgroundColor:"transparent"}}}},{props:{edge:"start"},style:{marginLeft:-12}},{props:{edge:"start",size:"small"},style:{marginLeft:-3}},{props:{edge:"end"},style:{marginRight:-12}},{props:{edge:"end",size:"small"},style:{marginRight:-3}}]}}),(0,i.A)(e=>{let{theme:t}=e;return{variants:[{props:{color:"inherit"},style:{color:"inherit"}},...Object.entries(t.palette).filter((0,p.A)()).map(e=>{let[o]=e;return{props:{color:o},style:{color:(t.vars||t).palette[o].main}}}),...Object.entries(t.palette).filter((0,p.A)()).map(e=>{let[o]=e;return{props:{color:o},style:{"--IconButton-hoverBg":t.alpha((t.vars||t).palette[o].main,(t.vars||t).palette.action.hoverOpacity)}}}),{props:{size:"small"},style:{padding:5,fontSize:t.typography.pxToRem(18)}},{props:{size:"large"},style:{padding:12,fontSize:t.typography.pxToRem(28)}}],["&.".concat(x.disabled)]:{backgroundColor:"transparent",color:(t.vars||t).palette.action.disabled},["&.".concat(x.loading)]:{color:"transparent"}}})),z=(0,n.default)("span",{name:"MuiIconButton",slot:"LoadingIndicator"})(e=>{let{theme:t}=e;return{display:"none",position:"absolute",visibility:"visible",top:"50%",left:"50%",transform:"translate(-50%, -50%)",color:(t.vars||t).palette.action.disabled,variants:[{props:{loading:!0},style:{display:"flex"}}]}}),I=a.forwardRef(function(e,t){let o=(0,s.b)({props:e,name:"MuiIconButton"}),{edge:a=!1,children:n,className:i,color:c="default",disabled:p=!1,disableFocusRipple:u=!1,size:v="medium",id:g,loading:m=null,loadingIndicator:f,...h}=o,x=(0,A.A)(g),I=null!=f?f:(0,C.jsx)(y.A,{"aria-labelledby":x,color:"inherit",size:16}),S={...o,edge:a,color:c,disabled:p,disableFocusRipple:u,loading:m,loadingIndicator:I,size:v},j=(e=>{let{classes:t,disabled:o,color:a,edge:r,size:n,loading:i}=e,s={root:["root",i&&"loading",o&&"disabled","default"!==a&&"color".concat((0,d.A)(a)),r&&"edge".concat((0,d.A)(r)),"size".concat((0,d.A)(n))],loadingIndicator:["loadingIndicator"],loadingWrapper:["loadingWrapper"]};return(0,l.A)(s,b,t)})(S);return(0,C.jsxs)(M,{id:m?x:g,className:(0,r.A)(j.root,i),centerRipple:!0,focusRipple:!u,disabled:p||m,ref:t,...h,ownerState:S,children:["boolean"==typeof m&&(0,C.jsx)("span",{className:j.loadingWrapper,style:{display:"contents"},children:(0,C.jsx)(z,{className:j.loadingIndicator,ownerState:S,children:m&&I})}),n]})});var S=o(8703);let j=(0,S.A)((0,C.jsx)("path",{d:"M20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4C12.76,4 13.5,4.11 14.2, 4.31L15.77,2.74C14.61,2.26 13.34,2 12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0, 0 22,12M7.91,10.08L6.5,11.5L11,16L21,6L19.59,4.58L11,13.17L7.91,10.08Z"}),"SuccessOutlined"),R=(0,S.A)((0,C.jsx)("path",{d:"M12 5.99L19.53 19H4.47L12 5.99M12 2L1 21h22L12 2zm1 14h-2v2h2v-2zm0-6h-2v4h2v-4z"}),"ReportProblemOutlined"),k=(0,S.A)((0,C.jsx)("path",{d:"M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"}),"ErrorOutline"),w=(0,S.A)((0,C.jsx)("path",{d:"M11,9H13V7H11M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20, 12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10, 10 0 0,0 12,2M11,17H13V11H11V17Z"}),"InfoOutlined"),L=(0,S.A)((0,C.jsx)("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"}),"Close"),B=(0,n.default)(u.A,{name:"MuiAlert",slot:"Root",overridesResolver:(e,t)=>{let{ownerState:o}=e;return[t.root,t[o.variant],t["".concat(o.variant).concat((0,d.A)(o.color||o.severity))]]}})((0,i.A)(e=>{let{theme:t}=e,o="light"===t.palette.mode?t.darken:t.lighten,a="light"===t.palette.mode?t.lighten:t.darken;return{...t.typography.body2,backgroundColor:"transparent",display:"flex",padding:"6px 16px",variants:[...Object.entries(t.palette).filter((0,p.A)(["light"])).map(e=>{let[r]=e;return{props:{colorSeverity:r,variant:"standard"},style:{color:t.vars?t.vars.palette.Alert["".concat(r,"Color")]:o(t.palette[r].light,.6),backgroundColor:t.vars?t.vars.palette.Alert["".concat(r,"StandardBg")]:a(t.palette[r].light,.9),["& .".concat(f.icon)]:t.vars?{color:t.vars.palette.Alert["".concat(r,"IconColor")]}:{color:t.palette[r].main}}}}),...Object.entries(t.palette).filter((0,p.A)(["light"])).map(e=>{let[a]=e;return{props:{colorSeverity:a,variant:"outlined"},style:{color:t.vars?t.vars.palette.Alert["".concat(a,"Color")]:o(t.palette[a].light,.6),border:"1px solid ".concat((t.vars||t).palette[a].light),["& .".concat(f.icon)]:t.vars?{color:t.vars.palette.Alert["".concat(a,"IconColor")]}:{color:t.palette[a].main}}}}),...Object.entries(t.palette).filter((0,p.A)(["dark"])).map(e=>{let[o]=e;return{props:{colorSeverity:o,variant:"filled"},style:{fontWeight:t.typography.fontWeightMedium,...t.vars?{color:t.vars.palette.Alert["".concat(o,"FilledColor")],backgroundColor:t.vars.palette.Alert["".concat(o,"FilledBg")]}:{backgroundColor:"dark"===t.palette.mode?t.palette[o].dark:t.palette[o].main,color:t.palette.getContrastText(t.palette[o].main)}}}})]}})),P=(0,n.default)("div",{name:"MuiAlert",slot:"Icon"})({marginRight:12,padding:"7px 0",display:"flex",fontSize:22,opacity:.9}),W=(0,n.default)("div",{name:"MuiAlert",slot:"Message"})({padding:"8px 0",minWidth:0,overflow:"auto"}),O=(0,n.default)("div",{name:"MuiAlert",slot:"Action"})({display:"flex",alignItems:"flex-start",padding:"4px 0 0 16px",marginLeft:"auto",marginRight:-8}),N={success:(0,C.jsx)(j,{fontSize:"inherit"}),warning:(0,C.jsx)(R,{fontSize:"inherit"}),error:(0,C.jsx)(k,{fontSize:"inherit"}),info:(0,C.jsx)(w,{fontSize:"inherit"})},T=a.forwardRef(function(e,t){let o=(0,s.b)({props:e,name:"MuiAlert"}),{action:a,children:n,className:i,closeText:p="Close",color:u,components:v={},componentsProps:g={},icon:f,iconMapping:A=N,onClose:h,role:y="alert",severity:b="success",slotProps:x={},slots:M={},variant:z="standard",...S}=o,j={...o,color:u,severity:b,variant:z,colorSeverity:u||b},R=(e=>{let{variant:t,color:o,severity:a,classes:r}=e,n={root:["root","color".concat((0,d.A)(o||a)),"".concat(t).concat((0,d.A)(o||a)),"".concat(t)],icon:["icon"],message:["message"],action:["action"]};return(0,l.A)(n,m,r)})(j),k={slots:{closeButton:v.CloseButton,closeIcon:v.CloseIcon,...M},slotProps:{...g,...x}},[w,T]=(0,c.A)("root",{ref:t,shouldForwardComponentProp:!0,className:(0,r.A)(R.root,i),elementType:B,externalForwardedProps:{...k,...S},ownerState:j,additionalProps:{role:y,elevation:0}}),[E,H]=(0,c.A)("icon",{className:R.icon,elementType:P,externalForwardedProps:k,ownerState:j}),[F,_]=(0,c.A)("message",{className:R.message,elementType:W,externalForwardedProps:k,ownerState:j}),[V,q]=(0,c.A)("action",{className:R.action,elementType:O,externalForwardedProps:k,ownerState:j}),[X,Z]=(0,c.A)("closeButton",{elementType:I,externalForwardedProps:k,ownerState:j}),[D,G]=(0,c.A)("closeIcon",{elementType:L,externalForwardedProps:k,ownerState:j});return(0,C.jsxs)(w,{...T,children:[!1!==f?(0,C.jsx)(E,{...H,children:f||A[b]||N[b]}):null,(0,C.jsx)(F,{..._,children:n}),null!=a?(0,C.jsx)(V,{...q,children:a}):null,null==a&&h?(0,C.jsx)(V,{...q,children:(0,C.jsx)(X,{size:"small","aria-label":p,title:p,color:"inherit",onClick:h,...Z,children:(0,C.jsx)(D,{fontSize:"small",...G})})}):null]})})}}]); |