"use client" import { useCallback, useEffect } from "react" import { usePathname, useRouter } 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 { useNativeRuntime } from "@/lib/platform" import { useAuthStore } from "@/lib/api/auth-store" import { cn } from "@/lib/utils" function isPublicPath(pathname: string) { return isAuthPublicPath(pathname) } export function SessionGuard() { const pathname = usePathname() const router = useRouter() const native = useNativeRuntime() const authenticated = useAuthStore((s) => Boolean(s.accessToken)) const status = useSessionGuardStore((s) => s.status) const returnTo = pathname.startsWith("/") ? pathname : "/mail/inbox" const loginHref = native ? `/login?returnTo=${encodeURIComponent(returnTo)}` : `/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 // NativeAuthGate handles login — don't block touches with an expired modal. if (native && !authenticated) 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. {native ? ( ) : ( Se reconnecter )} ) }