From bb1246df5e338b8252eba310bde5264420012cf0 Mon Sep 17 00:00:00 2001 From: kimminna Date: Fri, 17 Jul 2026 17:26:07 +0900 Subject: [PATCH] =?UTF-8?q?fix(web):=20=EC=98=A8=EB=B3=B4=EB=94=A9=20?= =?UTF-8?q?=EB=AF=B8=EC=99=84=EB=A3=8C=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EC=9D=98=20=ED=99=88=20=EC=A0=91=EA=B7=BC=EC=9D=84=20=EC=A0=9C?= =?UTF-8?q?=ED=95=9C=ED=95=9C=EB=8B=A4=20(#272)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 온보딩 미완료 사용자를 /onboarding으로 리다이렉트하는 OnboardingRequiredGuardProvider를 추가했습니다 - (main) 레이아웃에 해당 가드를 적용해 /home 등 메인 라우트 접근을 막았습니다 --- apps/timo-web/app/[locale]/(main)/layout.tsx | 5 ++- .../auth/OnboardingRequiredGuardProvider.tsx | 31 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 apps/timo-web/providers/auth/OnboardingRequiredGuardProvider.tsx diff --git a/apps/timo-web/app/[locale]/(main)/layout.tsx b/apps/timo-web/app/[locale]/(main)/layout.tsx index 88d9c6b0..fcc5efd6 100644 --- a/apps/timo-web/app/[locale]/(main)/layout.tsx +++ b/apps/timo-web/app/[locale]/(main)/layout.tsx @@ -2,6 +2,7 @@ import type { Metadata } from "next"; import { MainShellContainer } from "@/app/[locale]/(main)/_containers/MainShellContainer"; import { AuthGuardProvider } from "@/providers/auth/AuthGuardProvider"; +import { OnboardingRequiredGuardProvider } from "@/providers/auth/OnboardingRequiredGuardProvider"; export const metadata: Metadata = { robots: { @@ -18,7 +19,9 @@ export default function MainLayout({ children }: Readonly) { return (
- {children} + + {children} +
); diff --git a/apps/timo-web/providers/auth/OnboardingRequiredGuardProvider.tsx b/apps/timo-web/providers/auth/OnboardingRequiredGuardProvider.tsx new file mode 100644 index 00000000..38e25e6f --- /dev/null +++ b/apps/timo-web/providers/auth/OnboardingRequiredGuardProvider.tsx @@ -0,0 +1,31 @@ +"use client"; + +import { useEffect } from "react"; + +import { ROUTES } from "@/constants/routes"; +import { useRouter } from "@/i18n/navigation"; +import { useAuthStore } from "@/stores/auth/useAuthStore"; + +interface OnboardingRequiredGuardProviderProps { + children: React.ReactNode; +} + +export const OnboardingRequiredGuardProvider = ({ + children, +}: OnboardingRequiredGuardProviderProps) => { + const onboardingCompleted = useAuthStore( + (state) => state.onboardingCompleted, + ); + const isInitialized = useAuthStore((state) => state.isInitialized); + const router = useRouter(); + + useEffect(() => { + if (isInitialized && !onboardingCompleted) { + router.replace(ROUTES.ONBOARDING); + } + }, [isInitialized, onboardingCompleted, router]); + + if (!isInitialized || !onboardingCompleted) return null; + + return <>{children}; +};