this repo has no description
at fix-ts-uint8array 95 lines 2.5 kB view raw
1import { Routes, Route, Navigate } from 'react-router-dom'; 2import { ThemeProvider } from '@mui/material/styles'; 3import CssBaseline from '@mui/material/CssBaseline'; 4import CircularProgress from '@mui/material/CircularProgress'; 5import Box from '@mui/material/Box'; 6import theme from './theme'; 7import { useAuth } from './hooks/useAuth'; 8import { AppShell } from './components/layout/AppShell'; 9import { LoginPage } from './pages/LoginPage'; 10import { RegisterPage } from './pages/RegisterPage'; 11import { HomePage } from './pages/HomePage'; 12import { LessonPage } from './pages/LessonPage'; 13import { ReviewPage } from './pages/ReviewPage'; 14import { SettingsPage } from './pages/SettingsPage'; 15import type { ReactNode } from 'react'; 16 17function ProtectedRoute({ children }: { children: ReactNode }) { 18 const { user, loading } = useAuth(); 19 20 if (loading) { 21 return ( 22 <Box 23 sx={{ 24 display: 'flex', 25 justifyContent: 'center', 26 alignItems: 'center', 27 minHeight: '100vh', 28 }} 29 > 30 <CircularProgress color="primary" /> 31 </Box> 32 ); 33 } 34 35 if (!user) { 36 return <Navigate to="/login" replace />; 37 } 38 39 return <>{children}</>; 40} 41 42function RootRedirect() { 43 const { user, loading } = useAuth(); 44 45 if (loading) { 46 return ( 47 <Box 48 sx={{ 49 display: 'flex', 50 justifyContent: 'center', 51 alignItems: 'center', 52 minHeight: '100vh', 53 }} 54 > 55 <CircularProgress color="primary" /> 56 </Box> 57 ); 58 } 59 60 return <Navigate to={user ? '/home' : '/login'} replace />; 61} 62 63function App() { 64 return ( 65 <ThemeProvider theme={theme}> 66 <CssBaseline /> 67 <Routes> 68 <Route path="/" element={<RootRedirect />} /> 69 <Route path="/login" element={<LoginPage />} /> 70 <Route path="/register" element={<RegisterPage />} /> 71 <Route 72 element={ 73 <ProtectedRoute> 74 <AppShell /> 75 </ProtectedRoute> 76 } 77 > 78 <Route path="/home" element={<HomePage />} /> 79 <Route path="/review" element={<ReviewPage />} /> 80 <Route path="/settings" element={<SettingsPage />} /> 81 </Route> 82 <Route 83 path="/lesson/:topicId/:lessonId" 84 element={ 85 <ProtectedRoute> 86 <LessonPage /> 87 </ProtectedRoute> 88 } 89 /> 90 </Routes> 91 </ThemeProvider> 92 ); 93} 94 95export default App;