import React, { useEffect } from 'react'; import { useParams, Link, useNavigate } from 'react-router-dom'; import { AccessTime, Add, ArrowBack, CalendarToday, Delete, Edit, KeyboardArrowLeft, KeyboardArrowRight, LocationOn } from '@mui/icons-material'; import useTimetableStore from '../../stores/timetableStore'; import { useUser } from '../../contexts/UserContext'; import { format, parseISO, addDays, startOfWeek, isSameDay } from 'date-fns'; const TimetablePage: React.FC = () => { const { timetableId } = useParams<{ timetableId: string }>(); const navigate = useNavigate(); const { profile } = useUser(); const { currentTimetable, currentLessons, timetableDetailLoading, timetableDetailError, fetchTimetable, deleteTimetable, clearCurrentTimetable, } = useTimetableStore(); useEffect(() => { if (timetableId) { fetchTimetable(timetableId); } return () => { clearCurrentTimetable(); }; }, [timetableId, fetchTimetable, clearCurrentTimetable]); const handleDeleteTimetable = async () => { if (!timetableId) return; if (confirm('Are you sure you want to delete this timetable?')) { await deleteTimetable(timetableId); navigate(`/timetable/classes/${currentTimetable?.class_id}`); } }; // Group lessons by day const lessonsByDay = (currentLessons || []).reduce((acc, lesson) => { const date = lesson.day_of_week || format(parseISO(lesson.start_time), 'yyyy-MM-dd'); if (!acc[date]) acc[date] = []; acc[date].push(lesson); return acc; }, {} as Record); // Sort lessons within each day by start time Object.keys(lessonsByDay).forEach(day => { lessonsByDay[day].sort((a, b) => new Date(a.start_time).getTime() - new Date(b.start_time).getTime() ); }); if (timetableDetailLoading) { return (
); } if (timetableDetailError || !currentTimetable) { return (

Error Loading Timetable

{timetableDetailError || 'Timetable not found'}

Back to Classes
); } return (
{/* Header */}
Back to Class

{currentTimetable.name}

{format(parseISO(currentTimetable.effective_from), 'MMM d, yyyy')} {currentTimetable.effective_until && ` - ${format(parseISO(currentTimetable.effective_until), 'MMM d, yyyy')}`} {currentTimetable.is_recurring && ( Recurring )}
Add Lesson
{/* Lessons List */}

Lessons ({currentLessons.length})

{currentLessons.length === 0 ? (

No lessons scheduled

Add lessons to build your timetable

) : (
{Object.entries(lessonsByDay).map(([day, lessons]) => (

{currentTimetable.is_recurring ? `Day ${day}` : format(parseISO(day), 'EEEE, MMMM d, yyyy')}

{lessons.map((lesson) => (
{format(parseISO(lesson.start_time), 'HH:mm')}
{format(parseISO(lesson.end_time), 'HH:mm')}

{lesson.title}

{lesson.description && (

{lesson.description}

)}
{lesson.location && (
{lesson.location}
)} {lesson.room && ( Room {lesson.room} )} ))}
))}
)}
); }; export default TimetablePage;