fix: Schedule Switching Bugs (#138)

* style: course selection fix

* fix: generic bugs on course selection

* fix: schedule switch lag when popup is open for too long

* fix: storybook bug

* chore: remove unnecessary dependency
This commit is contained in:
Lukas Zenick
2024-03-09 19:54:51 -06:00
committed by GitHub
parent d70011016a
commit c51e6881d1
3 changed files with 34 additions and 28 deletions

View File

@@ -18,11 +18,13 @@ export class UserSchedule {
this.name = name || ''; this.name = name || '';
this.hours = hours || 0; this.hours = hours || 0;
} else { } else {
this.courses = coursesOrSchedule.courses.map(c => new Course(c)); this.courses = coursesOrSchedule?.courses.map(c => new Course(c)) || [];
this.name = coursesOrSchedule.name; this.name = coursesOrSchedule?.name || 'new schedule';
this.hours = 0; this.hours = 0;
for (const course of this.courses) { if (this.courses && this.courses.length > 0) {
this.hours += course.creditHours; for (const course of this.courses) {
this.hours += course.creditHours;
}
} }
} }
} }

View File

@@ -30,7 +30,7 @@ export default function PopupMain(): JSX.Element {
useEffect(() => { useEffect(() => {
function handleClickOutside(event) { 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); setIsPopupVisible(false);
} }
} }
@@ -114,7 +114,7 @@ export default function PopupMain(): JSX.Element {
{nonActiveSchedules.map(schedule => ( {nonActiveSchedules.map(schedule => (
<div <div
key={schedule.name} key={schedule.name}
className='my-2 cursor-pointer border border-gray-300 rounded-md border-solid bg-white py-4 shadow-sm hover:bg-gray-100' className='my-2 cursor-pointer border border-gray-300 rounded-md border-solid bg-white p-2 shadow-sm hover:bg-gray-100'
onClick={() => selectSchedule(schedule)} onClick={() => selectSchedule(schedule)}
> >
<Text as='div' variant='h1-course' className='color-ut-burntorange'> <Text as='div' variant='h1-course' className='color-ut-burntorange'>

View File

@@ -8,7 +8,6 @@ import { useEffect, useState } from 'react';
*/ */
export default function useSchedules(): [active: UserSchedule | null, schedules: UserSchedule[]] { export default function useSchedules(): [active: UserSchedule | null, schedules: UserSchedule[]] {
const [schedules, setSchedules] = useState<UserSchedule[]>([]); const [schedules, setSchedules] = useState<UserSchedule[]>([]);
const [activeIndex, setActiveIndex] = useState<number>(0);
const [activeSchedule, setActiveSchedule] = useState<UserSchedule | null>(null); const [activeSchedule, setActiveSchedule] = useState<UserSchedule | null>(null);
useEffect(() => { useEffect(() => {
@@ -18,31 +17,36 @@ export default function useSchedules(): [active: UserSchedule | null, schedules:
UserScheduleStore.get('activeIndex'), UserScheduleStore.get('activeIndex'),
]); ]);
setSchedules(storedSchedules.map(s => new UserSchedule(s))); setSchedules(storedSchedules.map(s => new UserSchedule(s)));
setActiveIndex(storedActiveIndex);
setActiveSchedule(new UserSchedule(storedSchedules[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(); 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]; return [activeSchedule, schedules];
} }