diff --git a/src/shared/types/UserSchedule.ts b/src/shared/types/UserSchedule.ts index fbfa8501..1fb00182 100644 --- a/src/shared/types/UserSchedule.ts +++ b/src/shared/types/UserSchedule.ts @@ -18,11 +18,13 @@ export class UserSchedule { this.name = name || ''; this.hours = hours || 0; } else { - this.courses = coursesOrSchedule.courses.map(c => new Course(c)); - this.name = coursesOrSchedule.name; + this.courses = coursesOrSchedule?.courses.map(c => new Course(c)) || []; + this.name = coursesOrSchedule?.name || 'new schedule'; this.hours = 0; - for (const course of this.courses) { - this.hours += course.creditHours; + if (this.courses && this.courses.length > 0) { + for (const course of this.courses) { + this.hours += course.creditHours; + } } } } diff --git a/src/views/components/PopupMain.tsx b/src/views/components/PopupMain.tsx index 1492ad99..d6b2d88b 100644 --- a/src/views/components/PopupMain.tsx +++ b/src/views/components/PopupMain.tsx @@ -30,7 +30,7 @@ export default function PopupMain(): JSX.Element { useEffect(() => { function handleClickOutside(event) { - if (!popupRef.current.contains(event.target) && !toggleRef.current.contains(event.target)) { + if (!popupRef.current?.contains(event.target) && !toggleRef.current?.contains(event.target)) { setIsPopupVisible(false); } } @@ -114,7 +114,7 @@ export default function PopupMain(): JSX.Element { {nonActiveSchedules.map(schedule => (
selectSchedule(schedule)} > diff --git a/src/views/hooks/useSchedules.ts b/src/views/hooks/useSchedules.ts index 971ab08e..d8eececd 100644 --- a/src/views/hooks/useSchedules.ts +++ b/src/views/hooks/useSchedules.ts @@ -8,7 +8,6 @@ import { useEffect, useState } from 'react'; */ export default function useSchedules(): [active: UserSchedule | null, schedules: UserSchedule[]] { const [schedules, setSchedules] = useState([]); - const [activeIndex, setActiveIndex] = useState(0); const [activeSchedule, setActiveSchedule] = useState(null); useEffect(() => { @@ -18,31 +17,36 @@ export default function useSchedules(): [active: UserSchedule | null, schedules: UserScheduleStore.get('activeIndex'), ]); setSchedules(storedSchedules.map(s => new UserSchedule(s))); - setActiveIndex(storedActiveIndex); setActiveSchedule(new UserSchedule(storedSchedules[storedActiveIndex])); - - const initializable = UserScheduleStore.initialize(); - - if (initializable) { - const l1 = UserScheduleStore.listen('schedules', ({ newValue }) => { - setSchedules(newValue.map(s => new UserSchedule(s))); - setActiveSchedule(new UserSchedule(newValue[activeIndex])); - }); - - const l2 = UserScheduleStore.listen('activeIndex', ({ newValue }) => { - setActiveIndex(newValue); - setActiveSchedule(new UserSchedule(schedules[newValue])); - }); - - return () => { - UserScheduleStore.removeListener(l1); - UserScheduleStore.removeListener(l2); - }; - } }; fetchData(); - }, [activeIndex, schedules]); + + const setupListeners = () => { + const l1 = UserScheduleStore.listen('schedules', ({ newValue }) => { + setSchedules(newValue.map(s => new UserSchedule(s))); + setActiveSchedule(currentActive => { + const newActiveIndex = newValue.findIndex(s => s.name === currentActive?.name); + return new UserSchedule(newValue[newActiveIndex]); + }); + }); + + const l2 = UserScheduleStore.listen('activeIndex', ({ newValue }) => { + setSchedules(currentSchedules => { + setActiveSchedule(new UserSchedule(currentSchedules[newValue])); + return currentSchedules; + }); + }); + + return () => { + UserScheduleStore.removeListener(l1); + UserScheduleStore.removeListener(l2); + }; + }; + + const init = UserScheduleStore.initialize(); + init.then(() => setupListeners()).catch(console.error); + }, []); return [activeSchedule, schedules]; }