import { Navigate, Outlet, useLocation } from 'react-router'; import { ErrorNotice, LoadingNotice } from '@/components/ui/ErrorNotice'; import { useCurrentUser } from '@/lib/hooks'; import { isUnauthorized } from '@/lib/http'; interface AuthGuardProps { /** * Если `true`, пользователей с незавершённым онбордингом пускаем внутрь * (нужно для /onboarding и /settings). */ allowIncompleteOnboarding?: boolean; } /** * Защита маршрутов: проверяет GET /users/@me. * Неавторизованных отправляет на /login, не прошедших онбординг — на /onboarding. */ export function AuthGuard({ allowIncompleteOnboarding = false }: AuthGuardProps) { const location = useLocation(); const currentUser = useCurrentUser(); if (currentUser.isPending) { return (
); } if (currentUser.isError) { if (isUnauthorized(currentUser.error)) { return ; } return (
void currentUser.refetch()} />
); } const user = currentUser.data; if (!allowIncompleteOnboarding && !user.onboarding_completed) { return ; } return ; }