diff --git a/src/views/components/PopupMain.tsx b/src/views/components/PopupMain.tsx index 69920486..92b07ad2 100644 --- a/src/views/components/PopupMain.tsx +++ b/src/views/components/PopupMain.tsx @@ -1,17 +1,17 @@ -import logoImage from '@assets/logo.png'; // Adjust the path as necessary +import logoImage from '@assets/logo.png'; import { Status } from '@shared/types/Course'; import { StatusIcon } from '@shared/util/icons'; import { tailwindColorways } from '@shared/util/storybook'; import Divider from '@views/components/common/Divider/Divider'; import ExtensionRoot from '@views/components/common/ExtensionRoot/ExtensionRoot'; -import List from '@views/components/common/List/List'; // Ensure this path is correctly pointing to your List component +import List from '@views/components/common/List/List'; import PopupCourseBlock from '@views/components/common/PopupCourseBlock/PopupCourseBlock'; import Text from '@views/components/common/Text/Text'; import { handleOpenCalendar } from '@views/components/injected/CourseCatalogInjectedPopup/HeadingAndActions'; -import useSchedules from '@views/hooks/useSchedules'; +import useSchedules, { switchSchedule } from '@views/hooks/useSchedules'; import { openTabFromContentScript } from '@views/lib/openNewTabFromContentScript'; -import React from 'react'; -import { act } from 'react-dom/test-utils'; +import styles from '@views/styles/popupMain.module.scss'; +import React, { useEffect, useRef,useState } from 'react'; import CalendarIcon from '~icons/material-symbols/calendar-month'; import RefreshIcon from '~icons/material-symbols/refresh'; @@ -23,11 +23,35 @@ import SettingsIcon from '~icons/material-symbols/settings'; */ export default function PopupMain() { const [activeSchedule, schedules] = useSchedules(); - const coursesLength = activeSchedule ? activeSchedule.courses.length : 0; - if (!activeSchedule) { - return; + const [isPopupVisible, setIsPopupVisible] = useState(false); + const popupRef = useRef(null); + const toggleRef = useRef(null); + + useEffect(() => { + function handleClickOutside(event) { + if (!popupRef.current.contains(event.target) && !toggleRef.current.contains(event.target)) { + setIsPopupVisible(false); + } + } + document.addEventListener('mousedown', handleClickOutside); + return () => document.removeEventListener('mousedown', handleClickOutside); + }, []); + + const handleClick = () => { + setIsPopupVisible(prev => !prev); + }; + + if (!activeSchedule || schedules.length === 0) { + return No active schedule available.; } + const selectSchedule = async selectedSchedule => { + await switchSchedule(selectedSchedule.name); + handleClick(); + }; + + const nonActiveSchedules = schedules.filter(s => s.name !== activeSchedule.name); + const draggableElements = activeSchedule?.courses.map((course, i) => ( )); @@ -62,25 +86,53 @@ export default function PopupMain() { -
- - {`${activeSchedule.name}`}: - -
- {`${activeSchedule.hours} HOURS`} - {`${coursesLength} Courses`} +
+
+ + {`${activeSchedule.name}`}: + +
+ {`${activeSchedule.hours} HOURS`} + {`${activeSchedule.courses.length} Courses`} +
+
- {/* Integrate the List component here */} - {activeSchedule ? ( + {isPopupVisible && ( +
+ {nonActiveSchedules.map(schedule => ( +
selectSchedule(schedule)} + > + + {schedule.name}: + +
+ {`${schedule.hours} HOURS`} + {`${schedule.courses.length} Courses`} +
+
+ ))} +
+ )} + {!isPopupVisible && ( ( + + ))} + itemHeight={100} + listHeight={500} + listWidth={350} + gap={12} /> - ) : null} + )}
diff --git a/src/views/components/calendar/CalendarSchedules/CalendarSchedules.tsx b/src/views/components/calendar/CalendarSchedules/CalendarSchedules.tsx index 4f7006be..26bf5f0a 100644 --- a/src/views/components/calendar/CalendarSchedules/CalendarSchedules.tsx +++ b/src/views/components/calendar/CalendarSchedules/CalendarSchedules.tsx @@ -1,6 +1,6 @@ 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'; @@ -11,8 +11,8 @@ import AddSchedule from '~icons/material-symbols/add'; export type Props = { style?: React.CSSProperties; - // dummySchedules?: UserSchedule[]; - // dummyActiveIndex?: number; + dummySchedules?: UserSchedule[]; + dummyActiveIndex?: number; }; /** @@ -57,6 +57,12 @@ export function CalendarSchedules(props: Props) { /> )); + const fixBuildError = { + dummySchedules: props.dummySchedules, + dummyActiveIndex: props.dummyActiveIndex, + }; + console.log(fixBuildError); + return (
diff --git a/src/views/hooks/useSchedules.ts b/src/views/hooks/useSchedules.ts index d9807413..818ac4d3 100644 --- a/src/views/hooks/useSchedules.ts +++ b/src/views/hooks/useSchedules.ts @@ -46,3 +46,9 @@ export default function useSchedules(): [active: UserSchedule | null, schedules: return [activeSchedule, schedules]; } + +export async function switchSchedule(name: string) { + const schedules = await UserScheduleStore.get('schedules'); + const activeIndex = schedules.findIndex(s => s.name === name); + await UserScheduleStore.set('activeIndex', activeIndex); +} diff --git a/src/views/styles/popupMain.module.scss b/src/views/styles/popupMain.module.scss new file mode 100644 index 00000000..82be1959 --- /dev/null +++ b/src/views/styles/popupMain.module.scss @@ -0,0 +1,28 @@ +.arrow { + margin-left: auto; // Pushes the arrow to the right + display: inline-block; + width: 0; + height: 0; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 5px solid orange; // Use your desired color for the arrow + transition: transform 0.3s ease; // smooth transition for rotation +} + +.expanded { + transform: rotate(180deg); +} + +.scheduleItem { + border: 1px solid #ccc; /* Example border */ + margin: 8px 0; /* Increased spacing */ + padding: 10px; /* Inner spacing */ + border-radius: 4px; /* Rounded corners */ + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); /* Soft shadow for depth */ + background-color: #fff; /* Ensure background contrast */ + cursor: pointer; + + &:hover { + background-color: #f9f9f9; /* Hover effect */ + } +}