@@ -37,7 +39,7 @@ export function Calendar(): JSX.Element {
-
+
@@ -46,7 +48,13 @@ export function Calendar(): JSX.Element {
{/* TODO: Doesn't work when exampleCourse is replaced with an actual course through setCourse.
Check CalendarGrid.tsx and AccountForCourseConflicts for an example */}
- {course ?
setCourse(null)}/> : null}
+ {course ? (
+ setCourse(null)}
+ />
+ ) : null}
);
}
diff --git a/src/views/components/calendar/CalendarCourseCell/CalendarCourseCell.tsx b/src/views/components/calendar/CalendarCourseCell/CalendarCourseCell.tsx
index f7e5fa5c..c9ba5673 100644
--- a/src/views/components/calendar/CalendarCourseCell/CalendarCourseCell.tsx
+++ b/src/views/components/calendar/CalendarCourseCell/CalendarCourseCell.tsx
@@ -56,7 +56,11 @@ const CalendarCourseCell: React.FC
= ({
return (
{/* Displaying day labels */}
@@ -100,7 +98,7 @@ function CalendarGrid({ courseCells, saturdayClass, setCourse }: React.PropsWith
))}
{grid.map((row, rowIndex) => row)}
- {courseCells ? : null}
+ {courseCells ? : null}
);
}
diff --git a/src/views/components/calendar/CalendarHeader/CalenderHeader.tsx b/src/views/components/calendar/CalendarHeader/CalenderHeader.tsx
index 235c1312..31ae0c4e 100644
--- a/src/views/components/calendar/CalendarHeader/CalenderHeader.tsx
+++ b/src/views/components/calendar/CalendarHeader/CalenderHeader.tsx
@@ -18,7 +18,7 @@ const handleOpenOptions = async () => {
await openTabFromContentScript(url);
};
-const CalendarHeader = ( { totalHours, totalCourses, scheduleName } ) => (
+const CalendarHeader = ({ totalHours, totalCourses, scheduleName }) => (
@@ -49,7 +49,7 @@ const CalendarHeader = ( { totalHours, totalCourses, scheduleName } ) => (
-
+
diff --git a/src/views/components/calendar/CalendarSchedules/CalendarSchedules.tsx b/src/views/components/calendar/CalendarSchedules/CalendarSchedules.tsx
index c8c22714..4f7006be 100644
--- a/src/views/components/calendar/CalendarSchedules/CalendarSchedules.tsx
+++ b/src/views/components/calendar/CalendarSchedules/CalendarSchedules.tsx
@@ -1,19 +1,18 @@
import createSchedule from '@pages/background/lib/createSchedule';
import switchSchedule from '@pages/background/lib/switchSchedule';
-import type { UserSchedule } from '@shared/types/UserSchedule';
+// import type { UserSchedule } from '@shared/types/UserSchedule';
+import List from '@views/components/common/List/List';
+import ScheduleListItem from '@views/components/common/ScheduleListItem/ScheduleListItem';
+import Text from '@views/components/common/Text/Text';
import useSchedules from '@views/hooks/useSchedules';
import React, { useEffect, useState } from 'react';
import AddSchedule from '~icons/material-symbols/add';
-import List from '../../common/List/List';
-import ScheduleListItem from '../../common/ScheduleListItem/ScheduleListItem';
-import Text from '../../common/Text/Text';
-
export type Props = {
style?: React.CSSProperties;
- dummySchedules?: UserSchedule[];
- dummyActiveIndex?: number;
+ // dummySchedules?: UserSchedule[];
+ // dummyActiveIndex?: number;
};
/**
diff --git a/src/views/components/common/List/List.tsx b/src/views/components/common/List/List.tsx
index 2ae85796..4b6bc5fc 100644
--- a/src/views/components/common/List/List.tsx
+++ b/src/views/components/common/List/List.tsx
@@ -1,6 +1,6 @@
import { DragDropContext, Draggable, Droppable } from '@hello-pangea/dnd';
import type { ReactElement } from 'react';
-import React, { useCallback, useEffect,useState } from 'react';
+import React, { useCallback, useEffect, useState } from 'react';
/*
* Ctrl + f dragHandleProps on PopupCourseBlock.tsx for example implementation of drag handle (two lines of code)
@@ -84,16 +84,16 @@ const Row: React.FC
= React.memo(({ data: { items, gap }, index, style
*/
const List: React.FC = ({ draggableElements, itemHeight, listHeight, listWidth, gap = 12 }: ListProps) => {
const [items, setItems] = useState(() => initial(0, draggableElements));
-
+
useEffect(() => {
- setItems((prevItems) => {
+ setItems(prevItems => {
const prevItemIds = prevItems.map(item => item.id);
const newElements = draggableElements.filter((_, index) => !prevItemIds.includes(`id:${index}`));
const newItems = initial(prevItems.length, newElements);
return [...prevItems, ...newItems];
});
}, [draggableElements]);
-
+
const onDragEnd = useCallback(
result => {
if (!result.destination) {
diff --git a/src/views/hooks/useFlattenedCourseSchedule.ts b/src/views/hooks/useFlattenedCourseSchedule.ts
index e7f784f8..1ab7060c 100644
--- a/src/views/hooks/useFlattenedCourseSchedule.ts
+++ b/src/views/hooks/useFlattenedCourseSchedule.ts
@@ -5,8 +5,6 @@ import type { CalendarCourseCellProps } from '@views/components/calendar/Calenda
import useSchedules from './useSchedules';
-
-
const dayToNumber: { [day: string]: number } = {
Monday: 0,
Tuesday: 1,
@@ -22,7 +20,7 @@ interface CalendarGridPoint {
}
interface componentProps {
- calendarCourseCellProps: CalendarCourseCellProps;
+ calendarCourseCellProps: CalendarCourseCellProps;
}
/**
@@ -66,25 +64,26 @@ export function useFlattenedCourseSchedule(): FlattenedCourseSchedule {
if (activeSchedule.courses.length === 0) {
return {
courseCells: [] as CalendarGridCourse[],
- activeSchedule
+ activeSchedule,
} satisfies FlattenedCourseSchedule;
-
}
const { courses, name, hours } = activeSchedule;
- const processedCourses = courses.flatMap((course: Course) => {
- const { status, courseDeptAndInstr, meetings } = extractCourseInfo(course);
-
- if (meetings.length === 0) {
- return processAsyncCourses({ courseDeptAndInstr, status, course });
- }
-
- return meetings.flatMap((meeting: CourseMeeting) =>
- processInPersonMeetings(meeting, { courseDeptAndInstr, status, course })
- );
- }).sort(sortCourses);
-
+ const processedCourses = courses
+ .flatMap((course: Course) => {
+ const { status, courseDeptAndInstr, meetings } = extractCourseInfo(course);
+
+ if (meetings.length === 0) {
+ return processAsyncCourses({ courseDeptAndInstr, status, course });
+ }
+
+ return meetings.flatMap((meeting: CourseMeeting) =>
+ processInPersonMeetings(meeting, { courseDeptAndInstr, status, course })
+ );
+ })
+ .sort(sortCourses);
+
return {
courseCells: processedCourses as CalendarGridCourse[],
activeSchedule: { name, courses, hours } as UserSchedule,
@@ -106,29 +105,42 @@ function extractCourseInfo(course: Course) {
/**
* Function to process each in-person class into its distinct meeting objects for calendar grid
*/
-function processAsyncCourses({ courseDeptAndInstr, status, course }: { courseDeptAndInstr: string, status: StatusType, course: Course }) {
- return [{
- calendarGridPoint: {
- dayIndex: 0,
- startIndex: 0,
- endIndex: 0,
- },
- componentProps: {
- courseDeptAndInstr,
- status,
- colors: {
- primaryColor: 'ut-gray',
- secondaryColor: 'ut-gray',
+function processAsyncCourses({
+ courseDeptAndInstr,
+ status,
+ course,
+}: {
+ courseDeptAndInstr: string;
+ status: StatusType;
+ course: Course;
+}) {
+ return [
+ {
+ calendarGridPoint: {
+ dayIndex: 0,
+ startIndex: 0,
+ endIndex: 0,
},
+ componentProps: {
+ courseDeptAndInstr,
+ status,
+ colors: {
+ primaryColor: 'ut-gray',
+ secondaryColor: 'ut-gray',
+ },
+ },
+ course,
},
- course,
- }] satisfies CalendarGridCourse[];
+ ] satisfies CalendarGridCourse[];
}
/**
* 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(
+ { days, startTime, endTime, location }: CourseMeeting,
+ { courseDeptAndInstr, status, course }
+) {
const time = getTimeString({ separator: '-', capitalize: true }, startTime, endTime);
const timeAndLocation = `${time} - ${location ? location.building : 'WB'}`;
return days.map(day => ({
@@ -150,7 +162,6 @@ function processInPersonMeetings( { days, startTime, endTime, location }: Course
})) satisfies CalendarGridCourse[];
}
-
/**
* Utility function to sort courses for the calendar grid
*/
@@ -167,7 +178,6 @@ function sortCourses(a, b) {
return endIndexA - endIndexB;
}
-
/**
* Utility function also present in CourseMeeting object. Wasn't being found at runtime, so I copied it over.
*/
@@ -217,4 +227,4 @@ type TimeStringOptions = {
separator: string;
/** capitalizes the AM/PM */
capitalize?: boolean;
-};
\ No newline at end of file
+};