import { useEffect, useMemo, useState } from 'react'; import { Link, useNavigate, useParams } from 'react-router-dom'; import { Archive, BarChart3, LogOut, MoreHorizontal, Pencil, Pin, PinOff, Plus, Search, Settings, ShieldCheck, Trash2, X } from 'lucide-react'; import * as DM from '@radix-ui/react-dropdown-menu'; import { useChat } from '@/stores/chat'; import { useAuth } from '@/stores/auth'; import { useUI } from '@/stores/ui'; import { Logo } from '@/components/ui/logo'; import { cn } from '@/lib/cn'; import { fmtDate } from '@/lib/format'; import type { Conversation } from '@/lib/types'; function groupLabel(iso: string): string { const d = new Date(iso.endsWith('Z') ? iso : iso + 'Z'); const now = new Date(); const startToday = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime(); const diffDays = Math.floor((startToday - new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime()) / 86400000); if (diffDays <= 0) return "Aujourd'hui"; if (diffDays === 1) return 'Hier'; if (diffDays < 7) return '7 derniers jours'; if (diffDays < 30) return '30 derniers jours'; return 'Plus ancien'; } export function Sidebar({ onClose }: { onClose?: () => void }) { const { id } = useParams(); const nav = useNavigate(); const { conversations, loadConversations, updateConversation, deleteConversation } = useChat(); const user = useAuth((s) => s.user); const logout = useAuth((s) => s.logout); const { course, setSettings } = useUI(); const [q, setQ] = useState(''); const [renaming, setRenaming] = useState(null); const [draft, setDraft] = useState(''); useEffect(() => { const t = setTimeout(() => loadConversations(q || undefined).catch(() => undefined), q ? 250 : 0); return () => clearTimeout(t); }, [q, loadConversations]); const groups = useMemo(() => { const pinned = conversations.filter((c) => c.pinned); const rest = conversations.filter((c) => !c.pinned); const out: { label: string; items: Conversation[] }[] = []; if (pinned.length) out.push({ label: 'Épinglées', items: pinned }); for (const c of rest) { const label = groupLabel(c.updated_at); const g = out.find((x) => x.label === label); if (g) g.items.push(c); else out.push({ label, items: [c] }); } return out; }, [conversations]); const go = (path: string) => { nav(path); onClose?.(); }; const rename = async (cid: string) => { const title = draft.trim(); setRenaming(null); if (title) await updateConversation(cid, { title }); }; const remove = async (cid: string) => { if (!confirm('Supprimer définitivement cette conversation ?')) return; await deleteConversation(cid); if (id === cid) go('/'); }; const roleLabel = user?.role === 'professor' ? 'Professeur' : user?.role === 'admin' ? 'Administrateur' : 'Étudiant·e'; return ( ); }