28 lines
931 B
TypeScript
28 lines
931 B
TypeScript
import type { ReactNode } from 'react'
|
||
import { Navigate, useLocation } from 'react-router-dom'
|
||
import { useAuth } from '@/auth/useAuth'
|
||
|
||
/**
|
||
* Обёртка для приватных маршрутов: пока идёт восстановление сессии —
|
||
* показывает лоадер, без сессии — редиректит на /login (сохраняя исходный
|
||
* путь, чтобы вернуться туда после входа).
|
||
*/
|
||
export function RequireAuth({ children }: { children: ReactNode }) {
|
||
const { status } = useAuth()
|
||
const location = useLocation()
|
||
|
||
if (status === 'loading') {
|
||
return (
|
||
<div className="app-loader" role="status" aria-live="polite">
|
||
Загрузка сессии…
|
||
</div>
|
||
)
|
||
}
|
||
|
||
if (status === 'unauthenticated') {
|
||
return <Navigate to="/login" state={{ from: location }} replace />
|
||
}
|
||
|
||
return <>{children}</>
|
||
}
|