DeutschLernen/german-app-frontend/src/App.tsx
Lasse Rune Hansen 70af326ca7 feat(frontend/admin): Complete Admin Module implementation
- Add AdminLayout component for consistent admin UI
- Create AdminDashboardPage with statistics overview
- Create AdminUsersPage with user management (CRUD, role changes)
- Create AdminReportsPage with user progress reports and CSV export
- Create AdminStoryGeneratorPage for AI-powered story generation
- Create AdminUserDetailPage for detailed user progress tracking
- Add comprehensive admin API client with all endpoints
- Add TypeScript types for admin DTOs (users, reports, stories)
- Add extensive CSS styles for all admin pages
- Update App.tsx with proper admin sub-routes
- Update admin-module.md feature documentation with completion status

Admin features:
- Dashboard with stats (users, lessons, quizzes, stories, activity)
- User management (list, view details, change roles, delete)
- Progress reports (view all, detailed user reports, CSV export)
- Story generator (AI story creation for levels with audio)
- Role-based authentication (AdminRoute protects all admin pages)
- Responsive design for all admin pages

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-06-14 15:29:20 +02:00

108 lines
3.4 KiB
TypeScript

import { BrowserRouter as Router, Routes, Route, Link } from 'react-router-dom';
import { AuthProvider } from '@/stores/authStore';
import { ProtectedRoute, AdminRoute } from '@/components/features/auth/ProtectedRoute';
import { HomePage } from '@/pages/HomePage';
import { LandingPage } from '@/pages/LandingPage';
import { LoginPage } from '@/pages/LoginPage';
import { RegisterPage } from '@/pages/RegisterPage';
import { StoryPage } from '@/pages/StoryPage';
import { AdminDashboardPage } from '@/pages/AdminDashboardPage';
import { AdminUsersPage } from '@/pages/AdminUsersPage';
import { AdminReportsPage } from '@/pages/AdminReportsPage';
import { AdminStoryGeneratorPage } from '@/pages/AdminStoryGeneratorPage';
import { AdminUserDetailPage } from '@/pages/AdminUserDetailPage';
import { AdminLayout } from '@/components/features/admin/AdminLayout';
import './index.css';
// Re-export for easier imports
export { AuthProvider } from '@/stores/authStore';
function NotFoundPage() {
return (
<div className="not-found-page">
<h1>404</h1>
<p>Page not found</p>
<Link to="/">Go to Home</Link>
</div>
);
}
// Layout component with header and footer
function AppLayout({ children }: { children: React.ReactNode }) {
return (
<div className="app-container">
<header className="app-header">
<Link to="/" className="app-title">
<h1>DeutschLernen</h1>
</Link>
<nav className="app-nav">
<Link to="/">Home</Link>
<Link to="/story/1">Stories</Link>
</nav>
</header>
<main className="app-main">{children}</main>
<footer className="app-footer">
<p>© {new Date().getFullYear()} DeutschLernen</p>
</footer>
</div>
);
}
export default function App() {
return (
<AuthProvider>
<Router>
<Routes>
{/* Public routes (no authentication required) */}
<Route path="/landing" element={<LandingPage />} />
<Route path="/login" element={<LoginPage />} />
<Route path="/register" element={<RegisterPage />} />
{/* Protected routes (require authentication) */}
<Route
path="/"
element={
<ProtectedRoute>
<AppLayout>
<HomePage />
</AppLayout>
</ProtectedRoute>
}
/>
<Route
path="/story/:levelId"
element={
<ProtectedRoute>
<AppLayout>
<StoryPage />
</AppLayout>
</ProtectedRoute>
}
/>
{/* Admin routes (require authentication + admin role) */}
<Route
path="/admin"
element={
<AdminRoute>
<AdminLayout />
</AdminRoute>
}
>
<Route index element={<AdminDashboardPage />} />
<Route path="dashboard" element={<AdminDashboardPage />} />
<Route path="users" element={<AdminUsersPage />} />
<Route path="users/:id" element={<AdminUserDetailPage />} />
<Route path="reports" element={<AdminReportsPage />} />
<Route path="stories" element={<AdminStoryGeneratorPage />} />
</Route>
{/* Catch-all route */}
<Route path="*" element={<NotFoundPage />} />
</Routes>
</Router>
</AuthProvider>
);
}