"use client"; import { Home, Library, Settings, LogOut, RefreshCw, Star, Download, User, Shield, } from "lucide-react"; import { usePathname, useRouter } from "next/navigation"; import { cn } from "@/lib/utils"; import { signOut } from "next-auth/react"; import { useEffect, useState, useCallback } from "react"; import type { NormalizedLibrary, NormalizedSeries } from "@/lib/providers/types"; import { useToast } from "@/components/ui/use-toast"; import { useTranslate } from "@/hooks/useTranslate"; import { NavButton } from "@/components/ui/nav-button"; import { IconButton } from "@/components/ui/icon-button"; import logger from "@/lib/logger"; interface SidebarProps { isOpen: boolean; onClose: () => void; initialLibraries: NormalizedLibrary[]; initialFavorites: NormalizedSeries[]; userIsAdmin?: boolean; } export function Sidebar({ isOpen, onClose, initialLibraries, initialFavorites, userIsAdmin = false, }: SidebarProps) { const { t } = useTranslate(); const pathname = usePathname(); const router = useRouter(); const [libraries, setLibraries] = useState(initialLibraries || []); const [favorites, setFavorites] = useState(initialFavorites || []); const [isRefreshing, setIsRefreshing] = useState(false); const { toast } = useToast(); useEffect(() => { setLibraries(initialLibraries || []); }, [initialLibraries]); useEffect(() => { setFavorites(initialFavorites || []); }, [initialFavorites]); // Mettre à jour les favoris quand ils changent (mise à jour optimiste) useEffect(() => { const handleFavoritesChange = (event: Event) => { const customEvent = event as CustomEvent<{ seriesId?: string; action?: "add" | "remove"; series?: NormalizedSeries; }>; // Si on a les détails de l'action, faire une mise à jour optimiste locale if (customEvent.detail?.seriesId) { const { seriesId, action, series } = customEvent.detail; if (action === "add" && series) { setFavorites((prev) => { if (prev.some((s) => s.id === series.id)) { return prev; } return [...prev, series]; }); } else if (action === "remove") { setFavorites((prev) => prev.filter((s) => s.id !== seriesId)); } else { router.refresh(); } } else { router.refresh(); } }; window.addEventListener("favoritesChanged", handleFavoritesChange); return () => { window.removeEventListener("favoritesChanged", handleFavoritesChange); }; }, [router]); const handleRefresh = async () => { setIsRefreshing(true); // Revalider côté serveur via router.refresh() router.refresh(); // Petit délai pour laisser le temps au serveur setTimeout(() => setIsRefreshing(false), 500); }; const handleLogout = async () => { try { await signOut({ callbackUrl: "/login" }); setLibraries([]); setFavorites([]); onClose(); } catch (error) { logger.error({ err: error }, "Erreur lors de la déconnexion:"); toast({ title: "Erreur", description: "Une erreur est survenue lors de la déconnexion", variant: "destructive", }); } }; const handleLinkClick = useCallback( async (path: string) => { if (pathname === path) { onClose(); return; } window.dispatchEvent(new Event("navigationStart")); router.push(path); onClose(); // On attend que la page soit chargée await new Promise((resolve) => setTimeout(resolve, 300)); window.dispatchEvent(new Event("navigationComplete")); }, [pathname, router, onClose] ); const mainNavItems = [ { title: t("sidebar.home"), href: "/", icon: Home, }, { title: t("sidebar.downloads"), href: "/downloads", icon: Download, }, ]; return ( ); }