From 3406e9a0e2644218fc06cbd0b05046df5339264c Mon Sep 17 00:00:00 2001 From: Som Gupta <78577376+knownotunknown@users.noreply.github.com> Date: Sat, 9 Mar 2024 20:21:38 -0600 Subject: [PATCH] fix: fixed issues involving course meeting objects not being recognized as course meeting objects (#132) * fix: coursemeeting objects now created properly. course popup works on calendar * refactor: removed duplicated getTimeString method in useFlattenedHook * refactor: meeting constructor --------- Co-authored-by: Razboy20 --- src/shared/types/CourseSchedule.ts | 6 +- src/shared/types/UserSchedule.ts | 22 ++----- .../components/calendar/Calendar/Calendar.tsx | 2 +- src/views/hooks/useFlattenedCourseSchedule.ts | 65 +++---------------- 4 files changed, 20 insertions(+), 75 deletions(-) diff --git a/src/shared/types/CourseSchedule.ts b/src/shared/types/CourseSchedule.ts index 7898a780..1b3c1afb 100644 --- a/src/shared/types/CourseSchedule.ts +++ b/src/shared/types/CourseSchedule.ts @@ -7,13 +7,17 @@ import { CourseMeeting, DAY_MAP } from './CourseMeeting'; * This represents the schedule for a course, which includes all the meeting times for the course, as well as helper functions for parsing, serializing, and deserializing the schedule */ export class CourseSchedule { - meetings: CourseMeeting[] = []; + meetings: CourseMeeting[]; constructor(courseSchedule?: Serialized) { if (!courseSchedule) { return; } Object.assign(this, courseSchedule); + this.meetings = []; + for (let meeting of courseSchedule.meetings) { + this.meetings.push(new CourseMeeting(meeting)); + } } /** diff --git a/src/shared/types/UserSchedule.ts b/src/shared/types/UserSchedule.ts index 1fb00182..f6bd1e85 100644 --- a/src/shared/types/UserSchedule.ts +++ b/src/shared/types/UserSchedule.ts @@ -10,22 +10,12 @@ export class UserSchedule { name: string; hours: number; - constructor(schedule: Serialized); - constructor(courses: Course[], name: string, hours: number); - constructor(coursesOrSchedule: Course[] | Serialized, name?: string, hours?: number) { - if (Array.isArray(coursesOrSchedule)) { - this.courses = coursesOrSchedule; - this.name = name || ''; - this.hours = hours || 0; - } else { - this.courses = coursesOrSchedule?.courses.map(c => new Course(c)) || []; - this.name = coursesOrSchedule?.name || 'new schedule'; - this.hours = 0; - if (this.courses && this.courses.length > 0) { - for (const course of this.courses) { - this.hours += course.creditHours; - } - } + constructor(schedule: Serialized) { + this.courses = schedule.courses.map(c => new Course(c)); + this.name = schedule.name; + this.hours = 0; + for (const course of this.courses) { + this.hours += course.creditHours; } } diff --git a/src/views/components/calendar/Calendar/Calendar.tsx b/src/views/components/calendar/Calendar/Calendar.tsx index 5e9d20b8..747e3ec5 100644 --- a/src/views/components/calendar/Calendar/Calendar.tsx +++ b/src/views/components/calendar/Calendar/Calendar.tsx @@ -46,7 +46,7 @@ export default function Calendar(): JSX.Element { Check CalendarGrid.tsx and AccountForCourseConflicts for an example */} {course ? ( setCourse(null)} /> diff --git a/src/views/hooks/useFlattenedCourseSchedule.ts b/src/views/hooks/useFlattenedCourseSchedule.ts index b8e80b52..6462cb57 100644 --- a/src/views/hooks/useFlattenedCourseSchedule.ts +++ b/src/views/hooks/useFlattenedCourseSchedule.ts @@ -57,7 +57,11 @@ export function useFlattenedCourseSchedule(): FlattenedCourseSchedule { if (!activeSchedule) { return { courseCells: [] as CalendarGridCourse[], - activeSchedule: new UserSchedule([], 'Something may have went wrong', 0), + activeSchedule: new UserSchedule({ + courses: [], + name: 'Something may have went wrong', + hours: 0, + }), } satisfies FlattenedCourseSchedule; } @@ -137,13 +141,11 @@ function processAsyncCourses({ /** * Function to process each in-person class into its distinct meeting objects for calendar grid */ -function processInPersonMeetings( - { days, startTime, endTime, location }: CourseMeeting, - { courseDeptAndInstr, status, course } -) { +function processInPersonMeetings(meeting: CourseMeeting, { courseDeptAndInstr, status, course }) { + const { days, startTime, endTime, location } = meeting; const midnightIndex = 1440; const normalizingTimeFactor = 720; - const time = getTimeString({ separator: '-', capitalize: true }, startTime, endTime); + const time = meeting.getTimeString({ separator: '-', capitalize: true }); const timeAndLocation = `${time} - ${location ? location.building : 'WB'}`; let normalizedStartTime = startTime >= midnightIndex ? startTime - normalizingTimeFactor : startTime; let normalizedEndTime = endTime >= midnightIndex ? endTime - normalizingTimeFactor : endTime; @@ -181,54 +183,3 @@ function sortCourses(a: CalendarGridCourse, b: CalendarGridCourse): number { } return endIndexA - endIndexB; } - -/** - * Utility function also present in CourseMeeting object. Wasn't being found at runtime, so I copied it over. - */ -function getTimeString(options: TimeStringOptions, startTime: number, endTime: number): string { - const startHour = Math.floor(startTime / 60); - const startMinute = startTime % 60; - const endHour = Math.floor(endTime / 60); - const endMinute = endTime % 60; - - let startTimeString = ''; - let endTimeString = ''; - - if (startHour === 0) { - startTimeString = '12'; - } else if (startHour > 12) { - startTimeString = `${startHour - 12}`; - } else { - startTimeString = `${startHour}`; - } - - startTimeString += startMinute === 0 ? ':00' : `:${startMinute}`; - startTimeString += startHour >= 12 ? 'pm' : 'am'; - - if (endHour === 0) { - endTimeString = '12'; - } else if (endHour > 12) { - endTimeString = `${endHour - 12}`; - } else { - endTimeString = `${endHour}`; - } - endTimeString += endMinute === 0 ? ':00' : `:${endMinute}`; - endTimeString += endHour >= 12 ? 'pm' : 'am'; - - if (options.capitalize) { - startTimeString = startTimeString.toUpperCase(); - endTimeString = endTimeString.toUpperCase(); - } - - return `${startTimeString} ${options.separator} ${endTimeString}`; -} - -/** - * Options to control the format of the time string - */ -type TimeStringOptions = { - /** the separator between the start and end times */ - separator: string; - /** capitalizes the AM/PM */ - capitalize?: boolean; -};