1import { useEffect, type ReactNode } from 'react';2import { Navigate, Route, Routes, useLocation } from 'react-router-dom';3import { useAuth } from '@/stores/auth';4import { useChat } from '@/stores/chat';5import { AppShell } from '@/components/layout/app-shell';6import { ChatView } from '@/components/chat/chat-view';7import { LoginPage } from '@/features/auth/login-page';8import { PrivacyPage } from '@/features/auth/privacy-page';9import { ProfessorPage } from '@/features/professor/professor-page';10import { AdminCostsPage } from '@/features/professor/admin-costs-page';11import { Spinner } from '@/components/ui/spinner';1213function Guard({ children, role }: { children: ReactNode; role?: 'professor' | 'admin' }) {14 const { user, loading } = useAuth();15 const loc = useLocation();16 if (loading) return <div className="h-[100dvh] flex items-center justify-center"><Spinner size={28} /></div>;17 if (!user) return <Navigate to="/connexion" replace state={{ from: loc }} />;18 if (role === 'professor' && !(user.role === 'professor' || user.role === 'admin')) return <Navigate to="/" replace />;19 if (role === 'admin' && user.role !== 'admin') return <Navigate to="/" replace />;20 return <>{children}</>;21}2223export function AppRouter() {24 const { user, load } = useAuth();25 const loadConversations = useChat((s) => s.loadConversations);26 useEffect(() => {27 load();28 }, [load]);29 useEffect(() => {30 if (user) loadConversations().catch(() => undefined);31 }, [user, loadConversations]);32 return (33 <Routes>34 <Route path="/connexion" element={<LoginPage />} />35 <Route path="/confidentialite" element={<PrivacyPage />} />36 <Route path="/professeur" element={<Guard role="professor"><ProfessorPage /></Guard>} />37 <Route path="/admin" element={<Guard role="admin"><AdminCostsPage /></Guard>} />38 <Route element={<Guard><AppShell /></Guard>}>39 <Route path="/" element={<ChatView />} />40 <Route path="/c/:id" element={<ChatView />} />41 </Route>42 <Route path="*" element={<Navigate to="/" replace />} />43 </Routes>44 );45}46