import {QueryClientProvider} from '@tanstack/react-query'; import {useEffect, type ReactNode} from 'react'; import {Toaster} from 'sonner'; import {getAccessToken, me} from '@/api'; import {queryClient} from '@/lib/query-client'; import {toAuthUser, useAuthStore} from '@/stores/auth'; /** 저장된 액세스 토큰으로 세션을 복구한다. */ function useRestoreSession() { const setUser = useAuthStore((s) => s.setUser); const finishRestore = useAuthStore((s) => s.finishRestore); useEffect(() => { let alive = true; if (!getAccessToken()) { finishRestore(); return; } void me() .then((res) => { if (!alive || res.result?.success === false) return; // RemoveNoneResponse 라 신원 필드가 통째로 빠져 올 수 있다 — 반쪽짜리 사용자를 세우지 않는다. if (!res.user_id || !res.id) return; setUser(toAuthUser(res)); }) .catch(() => { /* 토큰이 죽었으면 비로그인 상태로 떨어뜨린다. */ }) .finally(() => { if (alive) finishRestore(); }); return () => { alive = false; }; }, [setUser, finishRestore]); } function SessionGate({children}: {children: ReactNode}) { useRestoreSession(); return <>{children}; } export function Providers({children}: {children: ReactNode}) { return ( {children} ); }