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
10 KiB
JavaScript
1 line
No EOL
10 KiB
JavaScript
"use strict";exports.id=245,exports.ids=[245],exports.modules={31933:(a,b,c)=>{c.d(b,{A:()=>r});var d=c(31768),e=c(79390),f=c(29040),g=c(26743),h=c(37217),i=c(53678),j=c(3927),k=c(89436),l=c(1688),m=c(75078),n=c(21726);function o(a){return(0,n.Ay)("MuiPaper",a)}(0,m.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 p=c(78157);let q=(0,h.default)("div",{name:"MuiPaper",slot:"Root",overridesResolver:(a,b)=>{let{ownerState:c}=a;return[b.root,b[c.variant],!c.square&&b.rounded,"elevation"===c.variant&&b[`elevation${c.elevation}`]]}})((0,j.A)(({theme:a})=>({backgroundColor:(a.vars||a).palette.background.paper,color:(a.vars||a).palette.text.primary,transition:a.transitions.create("box-shadow"),variants:[{props:({ownerState:a})=>!a.square,style:{borderRadius:a.shape.borderRadius}},{props:{variant:"outlined"},style:{border:`1px solid ${(a.vars||a).palette.divider}`}},{props:{variant:"elevation"},style:{boxShadow:"var(--Paper-shadow)",backgroundImage:"var(--Paper-overlay)"}}]}))),r=d.forwardRef(function(a,b){let c=(0,k.b)({props:a,name:"MuiPaper"}),d=(0,i.default)(),{className:h,component:j="div",elevation:m=1,square:n=!1,variant:r="elevation",...s}=c,t={...c,component:j,elevation:m,square:n,variant:r},u=(a=>{let{square:b,elevation:c,variant:d,classes:e}=a,g={root:["root",d,!b&&"rounded","elevation"===d&&`elevation${c}`]};return(0,f.A)(g,o,e)})(t);return(0,p.jsx)(q,{as:j,ownerState:t,className:(0,e.A)(u.root,h),ref:b,...s,style:{..."elevation"===r&&{"--Paper-shadow":(d.vars||d).shadows[m],...d.vars&&{"--Paper-overlay":d.vars.overlays?.[m]},...!d.vars&&"dark"===d.palette.mode&&{"--Paper-overlay":`linear-gradient(${(0,g.X4)("#fff",(0,l.A)(m))}, ${(0,g.X4)("#fff",(0,l.A)(m))})`}},...s.style}})})},32245:(a,b,c)=>{c.d(b,{A:()=>L});var d=c(31768),e=c(79390),f=c(29040),g=c(37217),h=c(3927),i=c(89436),j=c(60360),k=c(80745),l=c(48583),m=c(31933),n=c(75078),o=c(21726);function p(a){return(0,o.Ay)("MuiAlert",a)}let q=(0,n.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 r=c(81637),s=c(29667),t=c(87598);function u(a){return(0,o.Ay)("MuiIconButton",a)}let v=(0,n.A)("MuiIconButton",["root","disabled","colorInherit","colorPrimary","colorSecondary","colorError","colorInfo","colorSuccess","colorWarning","edgeStart","edgeEnd","sizeSmall","sizeMedium","sizeLarge","loading","loadingIndicator","loadingWrapper"]);var w=c(78157);let x=(0,g.default)(s.A,{name:"MuiIconButton",slot:"Root",overridesResolver:(a,b)=>{let{ownerState:c}=a;return[b.root,c.loading&&b.loading,"default"!==c.color&&b[`color${(0,k.A)(c.color)}`],c.edge&&b[`edge${(0,k.A)(c.edge)}`],b[`size${(0,k.A)(c.size)}`]]}})((0,h.A)(({theme:a})=>({textAlign:"center",flex:"0 0 auto",fontSize:a.typography.pxToRem(24),padding:8,borderRadius:"50%",color:(a.vars||a).palette.action.active,transition:a.transitions.create("background-color",{duration:a.transitions.duration.shortest}),variants:[{props:a=>!a.disableRipple,style:{"--IconButton-hoverBg":a.alpha((a.vars||a).palette.action.active,(a.vars||a).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,h.A)(({theme:a})=>({variants:[{props:{color:"inherit"},style:{color:"inherit"}},...Object.entries(a.palette).filter((0,l.A)()).map(([b])=>({props:{color:b},style:{color:(a.vars||a).palette[b].main}})),...Object.entries(a.palette).filter((0,l.A)()).map(([b])=>({props:{color:b},style:{"--IconButton-hoverBg":a.alpha((a.vars||a).palette[b].main,(a.vars||a).palette.action.hoverOpacity)}})),{props:{size:"small"},style:{padding:5,fontSize:a.typography.pxToRem(18)}},{props:{size:"large"},style:{padding:12,fontSize:a.typography.pxToRem(28)}}],[`&.${v.disabled}`]:{backgroundColor:"transparent",color:(a.vars||a).palette.action.disabled},[`&.${v.loading}`]:{color:"transparent"}}))),y=(0,g.default)("span",{name:"MuiIconButton",slot:"LoadingIndicator"})(({theme:a})=>({display:"none",position:"absolute",visibility:"visible",top:"50%",left:"50%",transform:"translate(-50%, -50%)",color:(a.vars||a).palette.action.disabled,variants:[{props:{loading:!0},style:{display:"flex"}}]})),z=d.forwardRef(function(a,b){let c=(0,i.b)({props:a,name:"MuiIconButton"}),{edge:d=!1,children:g,className:h,color:j="default",disabled:l=!1,disableFocusRipple:m=!1,size:n="medium",id:o,loading:p=null,loadingIndicator:q,...s}=c,v=(0,r.A)(o),z=q??(0,w.jsx)(t.A,{"aria-labelledby":v,color:"inherit",size:16}),A={...c,edge:d,color:j,disabled:l,disableFocusRipple:m,loading:p,loadingIndicator:z,size:n},B=(a=>{let{classes:b,disabled:c,color:d,edge:e,size:g,loading:h}=a,i={root:["root",h&&"loading",c&&"disabled","default"!==d&&`color${(0,k.A)(d)}`,e&&`edge${(0,k.A)(e)}`,`size${(0,k.A)(g)}`],loadingIndicator:["loadingIndicator"],loadingWrapper:["loadingWrapper"]};return(0,f.A)(i,u,b)})(A);return(0,w.jsxs)(x,{id:p?v:o,className:(0,e.A)(B.root,h),centerRipple:!0,focusRipple:!m,disabled:l||p,ref:b,...s,ownerState:A,children:["boolean"==typeof p&&(0,w.jsx)("span",{className:B.loadingWrapper,style:{display:"contents"},children:(0,w.jsx)(y,{className:B.loadingIndicator,ownerState:A,children:p&&z})}),g]})});var A=c(78384);let B=(0,A.A)((0,w.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"),C=(0,A.A)((0,w.jsx)("path",{d:"M12 5.99L19.53 19H4.47L12 5.99M12 2L1 21h22L12 2zm1 14h-2v2h2v-2zm0-6h-2v4h2v-4z"}),"ReportProblemOutlined"),D=(0,A.A)((0,w.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"),E=(0,A.A)((0,w.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"),F=(0,A.A)((0,w.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"),G=(0,g.default)(m.A,{name:"MuiAlert",slot:"Root",overridesResolver:(a,b)=>{let{ownerState:c}=a;return[b.root,b[c.variant],b[`${c.variant}${(0,k.A)(c.color||c.severity)}`]]}})((0,h.A)(({theme:a})=>{let b="light"===a.palette.mode?a.darken:a.lighten,c="light"===a.palette.mode?a.lighten:a.darken;return{...a.typography.body2,backgroundColor:"transparent",display:"flex",padding:"6px 16px",variants:[...Object.entries(a.palette).filter((0,l.A)(["light"])).map(([d])=>({props:{colorSeverity:d,variant:"standard"},style:{color:a.vars?a.vars.palette.Alert[`${d}Color`]:b(a.palette[d].light,.6),backgroundColor:a.vars?a.vars.palette.Alert[`${d}StandardBg`]:c(a.palette[d].light,.9),[`& .${q.icon}`]:a.vars?{color:a.vars.palette.Alert[`${d}IconColor`]}:{color:a.palette[d].main}}})),...Object.entries(a.palette).filter((0,l.A)(["light"])).map(([c])=>({props:{colorSeverity:c,variant:"outlined"},style:{color:a.vars?a.vars.palette.Alert[`${c}Color`]:b(a.palette[c].light,.6),border:`1px solid ${(a.vars||a).palette[c].light}`,[`& .${q.icon}`]:a.vars?{color:a.vars.palette.Alert[`${c}IconColor`]}:{color:a.palette[c].main}}})),...Object.entries(a.palette).filter((0,l.A)(["dark"])).map(([b])=>({props:{colorSeverity:b,variant:"filled"},style:{fontWeight:a.typography.fontWeightMedium,...a.vars?{color:a.vars.palette.Alert[`${b}FilledColor`],backgroundColor:a.vars.palette.Alert[`${b}FilledBg`]}:{backgroundColor:"dark"===a.palette.mode?a.palette[b].dark:a.palette[b].main,color:a.palette.getContrastText(a.palette[b].main)}}}))]}})),H=(0,g.default)("div",{name:"MuiAlert",slot:"Icon"})({marginRight:12,padding:"7px 0",display:"flex",fontSize:22,opacity:.9}),I=(0,g.default)("div",{name:"MuiAlert",slot:"Message"})({padding:"8px 0",minWidth:0,overflow:"auto"}),J=(0,g.default)("div",{name:"MuiAlert",slot:"Action"})({display:"flex",alignItems:"flex-start",padding:"4px 0 0 16px",marginLeft:"auto",marginRight:-8}),K={success:(0,w.jsx)(B,{fontSize:"inherit"}),warning:(0,w.jsx)(C,{fontSize:"inherit"}),error:(0,w.jsx)(D,{fontSize:"inherit"}),info:(0,w.jsx)(E,{fontSize:"inherit"})},L=d.forwardRef(function(a,b){let c=(0,i.b)({props:a,name:"MuiAlert"}),{action:d,children:g,className:h,closeText:l="Close",color:m,components:n={},componentsProps:o={},icon:q,iconMapping:r=K,onClose:s,role:t="alert",severity:u="success",slotProps:v={},slots:x={},variant:y="standard",...A}=c,B={...c,color:m,severity:u,variant:y,colorSeverity:m||u},C=(a=>{let{variant:b,color:c,severity:d,classes:e}=a,g={root:["root",`color${(0,k.A)(c||d)}`,`${b}${(0,k.A)(c||d)}`,`${b}`],icon:["icon"],message:["message"],action:["action"]};return(0,f.A)(g,p,e)})(B),D={slots:{closeButton:n.CloseButton,closeIcon:n.CloseIcon,...x},slotProps:{...o,...v}},[E,L]=(0,j.A)("root",{ref:b,shouldForwardComponentProp:!0,className:(0,e.A)(C.root,h),elementType:G,externalForwardedProps:{...D,...A},ownerState:B,additionalProps:{role:t,elevation:0}}),[M,N]=(0,j.A)("icon",{className:C.icon,elementType:H,externalForwardedProps:D,ownerState:B}),[O,P]=(0,j.A)("message",{className:C.message,elementType:I,externalForwardedProps:D,ownerState:B}),[Q,R]=(0,j.A)("action",{className:C.action,elementType:J,externalForwardedProps:D,ownerState:B}),[S,T]=(0,j.A)("closeButton",{elementType:z,externalForwardedProps:D,ownerState:B}),[U,V]=(0,j.A)("closeIcon",{elementType:F,externalForwardedProps:D,ownerState:B});return(0,w.jsxs)(E,{...L,children:[!1!==q?(0,w.jsx)(M,{...N,children:q||r[u]||K[u]}):null,(0,w.jsx)(O,{...P,children:g}),null!=d?(0,w.jsx)(Q,{...R,children:d}):null,null==d&&s?(0,w.jsx)(Q,{...R,children:(0,w.jsx)(S,{size:"small","aria-label":l,title:l,color:"inherit",onClick:s,...T,children:(0,w.jsx)(U,{fontSize:"small",...V})})}):null]})})}}; |