Python 64.6%
TypeScript 33.7%
CSS 0.8%
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 { SetPasswordPage } from '@/features/auth/set-password-page';10import { ProfessorPage } from '@/features/professor/professor-page';11import { AdminCostsPage } from '@/features/professor/admin-costs-page';12import { Spinner } from '@/components/ui/spinner';1314function Guard({ children, role }: { children: ReactNode; role?: 'professor' | 'admin' }) {15 const { user, loading } = useAuth();16 const loc = useLocation();17 if (loading) return <div className="h-[100dvh] flex items-center justify-center"><Spinner size={28} /></div>;18 if (!user) return <Navigate to="/connexion" replace state={{ from: loc }} />;19 if (role === 'professor' && !(user.role === 'professor' || user.role === 'admin')) return <Navigate to="/" replace />;20 if (role === 'admin' && user.role !== 'admin') return <Navigate to="/" replace />;21 return <>{children}</>;22}2324export function AppRouter() {25 const { user, load } = useAuth();26 const loadConversations = useChat((s) => s.loadConversations);27 useEffect(() => {28 load();29 }, [load]);30 useEffect(() => {31 if (user) loadConversations().catch(() => undefined);32 }, [user, loadConversations]);33 return (34 <Routes>35 <Route path="/connexion" element={<LoginPage />} />36 <Route path="/mot-de-passe" element={<SetPasswordPage />} />37 <Route path="/confidentialite" element={<PrivacyPage />} />38 <Route path="/professeur" element={<Guard role="professor"><ProfessorPage /></Guard>} />39 <Route path="/admin" element={<Guard role="admin"><AdminCostsPage /></Guard>} />40 <Route element={<Guard><AppShell /></Guard>}>41 <Route path="/" element={<ChatView />} />42 <Route path="/c/:id" element={<ChatView />} />43 </Route>44 <Route path="*" element={<Navigate to="/" replace />} />45 </Routes>46 );47}48