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}; +};