Skip to content
File

Blob: src/client/hooks/useAdminSessionGuard.ts

typescript27 lines
1import { useCallback } from "react";
2import { useNavigate } from "react-router-dom";
3import { getErrorMessage, isAdminSessionError } from "@/client/lib/api";
4 
5export function useAdminSessionGuard(onSessionError?: (message?: string) => void) {
6 const navigate = useNavigate();
7 
8 return useCallback(
9 (error: unknown, onUnhandledError?: (message: string) => void) => {
10 const message = getErrorMessage(error);
11 
12 if (isAdminSessionError(error)) {
13 onSessionError?.(message);
14 // The httpOnly admin cookie has either expired or was rejected
15 // server-side. Navigate back to /admin so the page renders the
16 // tessera sign-in card from its own 401/403 fall-through.
17 navigate("/admin", { replace: true });
18 return true;
19 }
20 
21 onUnhandledError?.(message);
22 return false;
23 },
24 [navigate, onSessionError],
25 );
26}