"use client" import { useCallback, useEffect } from "react" import { usePathname } from "next/navigation" import { Icon } from "@iconify/react" import { AlertDialog, AlertDialogAction, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog" import { Button } from "@/components/ui/button" import { useSessionGuardStore } from "@/lib/auth/session-guard-store" import { tryRefreshSession } from "@/lib/auth/session-sync" import { isAuthPublicPath } from "@/lib/auth/public-paths" import { cn } from "@/lib/utils" function isPublicPath(pathname: string) { return isAuthPublicPath(pathname) } export function SessionGuard() { const pathname = usePathname() const status = useSessionGuardStore((s) => s.status) const returnTo = pathname.startsWith("/") ? pathname : "/mail/inbox" const loginHref = `/api/auth/login?returnTo=${encodeURIComponent(returnTo)}` const retrySession = useCallback(async () => { if (typeof navigator !== "undefined" && !navigator.onLine) return await tryRefreshSession() }, []) useEffect(() => { if (status !== "offline") return const onOnline = () => { void retrySession() } window.addEventListener("online", onOnline) return () => window.removeEventListener("online", onOnline) }, [status, retrySession]) if (isPublicPath(pathname)) return null return ( <>
Pas de connexion internet — session non vérifiable pour le moment.
event.preventDefault()} onPointerDownOutside={(event) => event.preventDefault()} > Vous avez été déconnecté Votre session a expiré ou n'est plus valide. Reconnectez-vous pour continuer à utiliser Ultimail. Se reconnecter ) }