| import React from 'react' |
| import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom' |
| import { Toaster } from 'react-hot-toast' |
| import { AuthProvider } from './context/AuthContext' |
| import { useAuth } from './hooks/useAuth' |
|
|
| |
| import Navbar from './components/Layout/Navbar' |
| import Sidebar from './components/Layout/Sidebar' |
| import Footer from './components/Layout/Footer' |
|
|
| |
| import Login from './components/Auth/Login' |
| import Register from './components/Auth/Register' |
| import Dashboard from './components/Dashboard/Dashboard' |
| import Learn from './components/Learn/Learn' |
| import Quiz from './components/Quiz/Quiz' |
| import Progress from './components/Progress/Progress' |
|
|
| |
| const ProtectedRoute = ({ children }) => { |
| const { user, loading } = useAuth() |
| |
| if (loading) { |
| return ( |
| <div className="min-h-screen flex items-center justify-center"> |
| <div className="animate-spin rounded-full h-16 w-16 border-t-4 border-b-4 border-primary-600"></div> |
| </div> |
| ) |
| } |
| |
| return user ? children : <Navigate to="/login" /> |
| } |
|
|
| |
| const MainLayout = ({ children }) => { |
| const [sidebarOpen, setSidebarOpen] = React.useState(true) |
| |
| return ( |
| <div className="min-h-screen flex"> |
| <Sidebar isOpen={sidebarOpen} /> |
| <div className="flex-1 flex flex-col"> |
| <Navbar onMenuClick={() => setSidebarOpen(!sidebarOpen)} /> |
| <main className="flex-1 overflow-auto"> |
| <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8"> |
| {children} |
| </div> |
| </main> |
| <Footer /> |
| </div> |
| </div> |
| ) |
| } |
|
|
| function App() { |
| return ( |
| <AuthProvider> |
| <Router> |
| <Toaster |
| position="top-right" |
| toastOptions={{ |
| duration: 3000, |
| style: { |
| background: '#fff', |
| color: '#1e293b', |
| padding: '16px', |
| borderRadius: '12px', |
| boxShadow: '0 10px 25px rgba(0,0,0,0.1)', |
| }, |
| success: { |
| iconTheme: { |
| primary: '#0ea5e9', |
| secondary: '#fff', |
| }, |
| }, |
| }} |
| /> |
| |
| <Routes> |
| {/* Public Routes */} |
| <Route path="/login" element={<Login />} /> |
| <Route path="/register" element={<Register />} /> |
| |
| {/* Protected Routes */} |
| <Route path="/" element={ |
| <ProtectedRoute> |
| <MainLayout> |
| <Dashboard /> |
| </MainLayout> |
| </ProtectedRoute> |
| } /> |
| |
| <Route path="/learn" element={ |
| <ProtectedRoute> |
| <MainLayout> |
| <Learn /> |
| </MainLayout> |
| </ProtectedRoute> |
| } /> |
| |
| <Route path="/learn/:topicId" element={ |
| <ProtectedRoute> |
| <MainLayout> |
| <Learn /> |
| </MainLayout> |
| </ProtectedRoute> |
| } /> |
| |
| <Route path="/quiz" element={ |
| <ProtectedRoute> |
| <MainLayout> |
| <Quiz /> |
| </MainLayout> |
| </ProtectedRoute> |
| } /> |
| |
| <Route path="/quiz/:topicId" element={ |
| <ProtectedRoute> |
| <MainLayout> |
| <Quiz /> |
| </MainLayout> |
| </ProtectedRoute> |
| } /> |
| |
| <Route path="/progress" element={ |
| <ProtectedRoute> |
| <MainLayout> |
| <Progress /> |
| </MainLayout> |
| </ProtectedRoute> |
| } /> |
| |
| {/* Redirect unknown routes */} |
| <Route path="*" element={<Navigate to="/" />} /> |
| </Routes> |
| </Router> |
| </AuthProvider> |
| ) |
| } |
|
|
| export default App |