"use client"; import { ChevronRight, Clock, Heart, HelpCircle, History, Home, LayoutGrid, LogIn, LogOut, MessageCircle, PlusCircle, Settings, ShieldCheck, TrendingUp, User as UserIcon, } from "lucide-react"; import Image from "next/image"; import Link from "next/link"; import { usePathname, useSearchParams } from "next/navigation"; import { useTheme } from "next-themes"; import * as React from "react"; import { ModeToggle } from "@/components/mode-toggle"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from "@/components/ui/collapsible"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupLabel, SidebarHeader, SidebarMenu, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarRail, SidebarTrigger, } from "@/components/ui/sidebar"; import { useAuth } from "@/providers/auth-provider"; import { useSocket } from "@/providers/socket-provider"; import { CategoryService } from "@/services/category.service"; import { MessageService } from "@/services/message.service"; import type { Category } from "@/types/content"; const mainNav = [ { title: "Accueil", url: "/", icon: Home, }, { title: "Tendances", url: "/trends", icon: TrendingUp, }, { title: "Nouveautés", url: "/recent", icon: Clock, }, ]; export function AppSidebar() { const pathname = usePathname(); const searchParams = useSearchParams(); const { user, logout, isAuthenticated } = useAuth(); const { socket } = useSocket(); const { resolvedTheme } = useTheme(); const [categories, setCategories] = React.useState([]); const [mounted, setMounted] = React.useState(false); const [unreadMessages, setUnreadMessages] = React.useState(0); React.useEffect(() => { setMounted(true); CategoryService.getAll().then(setCategories).catch(console.error); }, []); // Gérer le compteur de messages non-lus React.useEffect(() => { if (isAuthenticated) { MessageService.getUnreadCount().then(setUnreadMessages).catch(console.error); } }, [isAuthenticated]); React.useEffect(() => { if (socket && isAuthenticated) { socket.on("new_message", () => { // Incrémenter si on n'est pas sur la page messages if (pathname !== "/messages") { setUnreadMessages((prev) => prev + 1); } }); return () => { socket.off("new_message"); }; } }, [socket, isAuthenticated, pathname]); // Remettre à zéro si on arrive sur la page messages React.useEffect(() => { if (pathname === "/messages") { setUnreadMessages(0); } }, [pathname]); const logoSrc = React.useMemo(() => { if (!mounted) return "/memegoat-color.svg"; return resolvedTheme === "dark" ? "/memegoat-white.svg" : "/memegoat-black.svg"; }, [resolvedTheme, mounted]); return (
MemeGoat Logo
MemeGoat
{mainNav.map((item) => ( {item.title} ))} Explorer Catégories {categories.map((category) => ( {category.name} ))} Communauté Publier {isAuthenticated && ( Messages {unreadMessages > 0 && ( {unreadMessages > 9 ? "9+" : unreadMessages} )} )} Ma Bibliothèque Mes Favoris Mes Mèmes {isAuthenticated && user?.role === "admin" && ( Administration Admin )} {isAuthenticated && user ? ( {user.username.slice(0, 2).toUpperCase()}
{user.displayName || user.username} {user.role}
{user.username.slice(0, 2).toUpperCase()}
{user.displayName || user.username} {user.role}
Profil Paramètres logout()}> Déconnexion
) : ( Se connecter )}
Thème
Aide
); }