// apps/web/src/app/(app)/layout.tsx // 공유 레이아웃 — auth 가드 + Sidebar // route group `(app)`은 URL에 영향을 주지 않고 하위 모든 라우트에 적용. import { headers } from 'next/headers' import { redirect } from 'next/navigation' import { Box } from '@mui/material' import { Sidebar } from '@/components/layout/sidebar' import { getSupabaseServerClient, isSupabaseConfiguredServer } from '@/lib/supabase-server' import { loginPath, RETURN_PATH_HEADER } from '@/lib/web-app-url' export default async function AppLayout({ children }: { children: React.ReactNode }): Promise { // 결제 진입(/billing?tier=…)처럼 proxy 가 경로를 넘긴 요청은 로그인 뒤 그 경로로 돌아온다. const returnPath = (await headers()).get(RETURN_PATH_HEADER) if (!isSupabaseConfiguredServer()) { redirect(loginPath(returnPath)) } const supabase = await getSupabaseServerClient() const { data: { user } } = await supabase.auth.getUser() if (!user) { redirect(loginPath(returnPath)) } return ( {children} ) }