From 9928390946d7f41fb0108d00294cb4a4e959217c Mon Sep 17 00:00:00 2001 From: Bert Hausmans Date: Thu, 21 May 2026 07:16:17 +0200 Subject: [PATCH] =?UTF-8?q?feat(frontend):=20router=20restructure=20/admin?= =?UTF-8?q?=20=E2=86=92=20/lessons=20with=20redirects?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../frontend/src/components/LessonTree.tsx | 2 +- packages/frontend/src/pages/Marketplace.tsx | 2 +- packages/frontend/src/router.tsx | 25 +++++++++++-------- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/packages/frontend/src/components/LessonTree.tsx b/packages/frontend/src/components/LessonTree.tsx index 31d2e7b..59318a6 100644 --- a/packages/frontend/src/components/LessonTree.tsx +++ b/packages/frontend/src/components/LessonTree.tsx @@ -114,7 +114,7 @@ function TreeRow({ n, depth }: { n: LessonTreeNode; depth: number }) { >⋮⋮ )} - + {n.name} {n.cardCount} diff --git a/packages/frontend/src/pages/Marketplace.tsx b/packages/frontend/src/pages/Marketplace.tsx index d15fa53..530d83e 100644 --- a/packages/frontend/src/pages/Marketplace.tsx +++ b/packages/frontend/src/pages/Marketplace.tsx @@ -33,7 +33,7 @@ export function MarketplacePage() { async function fork(id: number) { try { const f = await lessonsApi.fork(id); - navigate(`/admin/lessons/${f.id}`); + navigate(`/lessons/${f.id}`); } catch (e) { alert(e instanceof ApiClientError ? e.message : 'Forken mislukt'); } } diff --git a/packages/frontend/src/router.tsx b/packages/frontend/src/router.tsx index 180d865..1a18086 100644 --- a/packages/frontend/src/router.tsx +++ b/packages/frontend/src/router.tsx @@ -1,10 +1,9 @@ import { lazy, Suspense, type ComponentType } from 'react'; -import { createBrowserRouter, Navigate } from 'react-router-dom'; +import { createBrowserRouter, Navigate, useParams } from 'react-router-dom'; import { Layout } from './components/Layout.js'; import { AuthBoundary } from './components/AuthBoundary.js'; import { RoleGuard } from './components/RoleGuard.js'; -// Tiny loading placeholder reused for every lazy route boundary. function PageFallback() { return (
@@ -13,8 +12,6 @@ function PageFallback() { ); } -// `React.lazy` requires a default export; our pages use named exports, so we -// adapt with a small helper that picks the named export from the module. function lazyPage( loader: () => Promise>, name: K, @@ -33,8 +30,8 @@ function lazyPage( } const Dashboard = lazyPage(() => import('./pages/Dashboard.js'), 'DashboardPage'); -const Admin = lazyPage(() => import('./pages/Admin.js'), 'AdminPage'); -const AdminLesson = lazyPage(() => import('./pages/AdminLesson.js'), 'AdminLessonPage'); +const Lessons = lazyPage(() => import('./pages/Lessons.js'), 'LessonsPage'); +const LessonDetail = lazyPage(() => import('./pages/LessonDetail.js'), 'LessonDetailPage'); const PracticeSetup = lazyPage(() => import('./pages/PracticeSetup.js'), 'PracticeSetupPage'); const Practice = lazyPage(() => import('./pages/Practice.js'), 'PracticePage'); const PracticeDone = lazyPage(() => import('./pages/PracticeDone.js'), 'PracticeDonePage'); @@ -53,12 +50,17 @@ const ForgotPassword = lazyPage(() => import('./pages/auth/ForgotPassword.js'), const ResetPassword = lazyPage(() => import('./pages/auth/ResetPassword.js'), 'ResetPasswordPage'); const AcceptInvite = lazyPage(() => import('./pages/auth/AcceptInvite.js'), 'AcceptInvitePage'); +function AdminToLessons() { return ; } +function AdminLessonRedirect() { + const { id } = useParams(); + return ; +} + export const router = createBrowserRouter([ { path: '/', element: , children: [ - // Public auth routes { path: 'login', element: }, { path: 'register', element: }, { path: 'verify-email', element: }, @@ -66,13 +68,16 @@ export const router = createBrowserRouter([ { path: 'reset-password', element: }, { path: 'accept-invite', element: }, - // Authenticated routes { element: , children: [ { index: true, element: }, - { path: 'admin', element: }, - { path: 'admin/lessons/:id', element: }, + { path: 'lessons', element: }, + { path: 'lessons/:id', element: }, + + { path: 'admin', element: }, + { path: 'admin/lessons/:id', element: }, + { path: 'practice/:lessonId/setup', element: }, { path: 'practice/:lessonId', element: }, { path: 'practice/:lessonId/done', element: },