"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 { cn } from "@/lib/utils" const PUBLIC_PREFIXES = ["/login", "/auth/", "/api/auth/"] function isPublicPath(pathname: string) { if (pathname.startsWith("/drive/s/")) return true return PUBLIC_PREFIXES.some( (prefix) => pathname === prefix || pathname.startsWith(prefix) ) } 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 ) }