diff --git a/src/components/generator/Calendar/CalendarComponent.jsx b/src/components/generator/Calendar/CalendarComponent.jsx index a6c63ca..5355a63 100644 --- a/src/components/generator/Calendar/CalendarComponent.jsx +++ b/src/components/generator/Calendar/CalendarComponent.jsx @@ -18,6 +18,7 @@ import { getDaysOfWeek, getTimeBlockEvents, } from "@/lib/generator/createCalendarEvents"; +import { buildCourseDetails } from "@/lib/generator/buildCourseDetails"; import { getCourseData } from "@/lib/generator/courseData"; import { CourseDetailsContext } from "@/lib/contexts/generator/CourseDetailsContext"; import { CourseColorsContext } from "@/lib/contexts/generator/CourseColorsContext"; @@ -179,25 +180,7 @@ export default function CalendarComponent({ currentColors, ); - const courseDetails = Array.from( - new Map( - newEvents - .filter((event) => !event.extendedProps.isBlocked) - .map((event) => { - let titleArray = event.title.trim().split(" "); - const detail = { - name: titleArray[0], - courseName: event.extendedProps.courseName || "", - instructor: event.description, - section: titleArray.pop(), - startDate: event.startRecur, - endDate: event.endRecur, - }; - - return [detail.name, detail]; - }), - ).values(), - ); + const courseDetails = buildCourseDetails(newEvents); setCourseDetails(courseDetails); setEvents(newEvents); diff --git a/src/components/generator/Calendar/hooks/useCalendarEvents.js b/src/components/generator/Calendar/hooks/useCalendarEvents.js index 80c1ffb..cb6b9e6 100644 --- a/src/components/generator/Calendar/hooks/useCalendarEvents.js +++ b/src/components/generator/Calendar/hooks/useCalendarEvents.js @@ -3,6 +3,7 @@ import { createCalendarEvents, getDaysOfWeek, } from "@/lib/generator/createCalendarEvents"; +import { buildCourseDetails } from "@/lib/generator/buildCourseDetails"; import { getCourseData } from "@/lib/generator/courseData"; import { checkForWeekendClasses } from "../utils/calendarUtils.jsx"; @@ -71,25 +72,7 @@ export const useCalendarEvents = ({ currentColors, ); - const courseDetails = Array.from( - new Map( - newEvents - .filter((event) => !event.extendedProps.isBlocked) - .map((event) => { - let titleArray = event.title.trim().split(" "); - const detail = { - name: titleArray[0], - courseName: event.extendedProps.courseName || "", - instructor: event.description, - section: titleArray.pop(), - startDate: event.startRecur, - endDate: event.endRecur, - }; - - return [detail.name, detail]; - }), - ).values(), - ); + const courseDetails = buildCourseDetails(newEvents); setCourseDetails(courseDetails); setEvents(newEvents); diff --git a/src/components/generator/Forms/CourseList/CourseListItemComponent.jsx b/src/components/generator/Forms/CourseList/CourseListItemComponent.jsx index db6a271..d029a71 100644 --- a/src/components/generator/Forms/CourseList/CourseListItemComponent.jsx +++ b/src/components/generator/Forms/CourseList/CourseListItemComponent.jsx @@ -142,7 +142,7 @@ export default function CourseListComponent({
Course Instructor - {courseDetail ? courseDetail.instructor : "N/A"} + {courseDetail?.instructor || "N/A"}
diff --git a/src/lib/generator/buildCourseDetails.js b/src/lib/generator/buildCourseDetails.js new file mode 100644 index 0000000..e8d9ba9 --- /dev/null +++ b/src/lib/generator/buildCourseDetails.js @@ -0,0 +1,41 @@ +const getCourseDetailFromEvent = (event) => { + const titleParts = event.title.trim().split(" "); + + return { + name: titleParts[0], + courseName: event.extendedProps.courseName || "", + instructor: event.description?.trim() || "", + section: titleParts.pop(), + startDate: event.startRecur, + endDate: event.endRecur, + }; +}; + +const mergeCourseDetail = (existingDetail, nextDetail) => ({ + ...existingDetail, + ...nextDetail, + courseName: existingDetail.courseName || nextDetail.courseName, + instructor: existingDetail.instructor || nextDetail.instructor, + startDate: existingDetail.startDate || nextDetail.startDate, + endDate: existingDetail.endDate || nextDetail.endDate, +}); + +export const buildCourseDetails = (events) => + Array.from( + events + .filter((event) => !event.extendedProps.isBlocked) + .reduce((detailsByName, event) => { + const nextDetail = getCourseDetailFromEvent(event); + const existingDetail = detailsByName.get(nextDetail.name); + + detailsByName.set( + nextDetail.name, + existingDetail + ? mergeCourseDetail(existingDetail, nextDetail) + : nextDetail, + ); + + return detailsByName; + }, new Map()) + .values(), + );