From 5869c741d78b1bca49b2c74892678c4a403d939b Mon Sep 17 00:00:00 2001 From: CC Worker Date: Tue, 2 Jun 2026 21:36:57 +0000 Subject: [PATCH] =?UTF-8?q?fix(routing):=20add=20TimetableListPage=20for?= =?UTF-8?q?=20/timetable=20=E2=80=94=20detail=20view=20required=20:timetab?= =?UTF-8?q?leId?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bare /timetable routed to TimetablePage which called useParams<{timetableId}>() and immediately hit !currentTimetable → "Error Loading Timetable". New TimetableListPage uses fetchMyTimetables() from timetableStore. AppRoutes now: /timetable → TimetableListPage, /timetable/:timetableId → TimetablePage. Co-Authored-By: Claude Sonnet 4.6 --- src/AppRoutes.tsx | 4 +- src/pages/timetable/TimetableListPage.tsx | 90 +++++++++++++++++++++++ src/pages/timetable/index.ts | 1 + 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 src/pages/timetable/TimetableListPage.tsx diff --git a/src/AppRoutes.tsx b/src/AppRoutes.tsx index f39f85d..2b7263c 100644 --- a/src/AppRoutes.tsx +++ b/src/AppRoutes.tsx @@ -30,6 +30,7 @@ import DashboardPage from './pages/user/dashboardPage'; // Timetable Module Pages import { TimetablePage, + TimetableListPage, ClassesPage, LessonPage, TaughtLessonsPage, @@ -162,7 +163,8 @@ const AppRoutes: React.FC = () => { }> }> {/* Timetable Module Routes */} - } /> + } /> + } /> } /> } /> } /> diff --git a/src/pages/timetable/TimetableListPage.tsx b/src/pages/timetable/TimetableListPage.tsx new file mode 100644 index 0000000..f64c4f3 --- /dev/null +++ b/src/pages/timetable/TimetableListPage.tsx @@ -0,0 +1,90 @@ +import React, { useEffect } from 'react'; +import { Link } from 'react-router-dom'; +import { CalendarToday, KeyboardArrowRight } from '@mui/icons-material'; +import useTimetableStore from '../../stores/timetableStore'; +import { format, parseISO } from 'date-fns'; + +const TimetableListPage: React.FC = () => { + const { timetables, timetablesLoading, timetablesError, fetchMyTimetables } = useTimetableStore(); + + useEffect(() => { + fetchMyTimetables(); + }, [fetchMyTimetables]); + + if (timetablesLoading) { + return ( +
+
+
+ ); + } + + if (timetablesError) { + return ( +
+
+

Error Loading Timetables

+

{timetablesError}

+ +
+
+ ); + } + + return ( +
+
+
+

Timetables

+

Your scheduled timetables

+
+
+ + {timetables.length === 0 ? ( +
+ +

No timetables yet

+

+ Timetables are created from a class. Go to{' '} + Classes{' '} + to get started. +

+
+ ) : ( +
+ {timetables.map((timetable) => ( + + +
+

{timetable.name}

+

+ {format(parseISO(timetable.start_date), 'MMM d, yyyy')} + {timetable.end_date + ? ` – ${format(parseISO(timetable.end_date), 'MMM d, yyyy')}` + : ' (ongoing)'} +

+
+ {timetable.recurrence_rule && ( + + Recurring + + )} + + + ))} +
+ )} +
+ ); +}; + +export default TimetableListPage; diff --git a/src/pages/timetable/index.ts b/src/pages/timetable/index.ts index c9bffe3..2f3d78b 100644 --- a/src/pages/timetable/index.ts +++ b/src/pages/timetable/index.ts @@ -3,6 +3,7 @@ */ export { default as TimetablePage } from './TimetablePage'; +export { default as TimetableListPage } from './TimetableListPage'; export { default as ClassesPage } from './ClassesPage'; export { default as LessonPage } from './LessonPage'; export { default as TaughtLessonsPage } from './TaughtLessonsPage';