import { Sidebar } from '@phosphor-icons/react'; import type { CalendarTabMessages } from '@shared/messages/CalendarMessages'; import type { Course } from '@shared/types/Course'; import { CRX_PAGES } from '@shared/types/CRXPages'; import { openReportWindow } from '@shared/util/openReportWindow'; import CalendarBottomBar from '@views/components/calendar/CalendarBottomBar'; import CalendarGrid from '@views/components/calendar/CalendarGrid'; import CalendarHeader from '@views/components/calendar/CalendarHeader/CalendarHeader'; import { CalendarSchedules } from '@views/components/calendar/CalendarSchedules'; import ResourceLinks from '@views/components/calendar/ResourceLinks'; import Divider from '@views/components/common/Divider'; import CourseCatalogInjectedPopup from '@views/components/injected/CourseCatalogInjectedPopup/CourseCatalogInjectedPopup'; import { CalendarContext } from '@views/contexts/CalendarContext'; import useCourseFromUrl from '@views/hooks/useCourseFromUrl'; import { useFlattenedCourseSchedule } from '@views/hooks/useFlattenedCourseSchedule'; import { MessageListener } from 'chrome-extension-toolkit'; import clsx from 'clsx'; import React, { useEffect, useState } from 'react'; import OutwardArrowIcon from '~icons/material-symbols/arrow-outward'; import { Button } from '../common/Button'; import { LargeLogo } from '../common/LogoIcon'; import Text from '../common/Text/Text'; import CalendarFooter from './CalendarFooter'; /** * Calendar page component */ export default function Calendar(): JSX.Element { const { courseCells, activeSchedule } = useFlattenedCourseSchedule(); const [course, setCourse] = useState(useCourseFromUrl()); const [showPopup, setShowPopup] = useState(course !== null); const [showSidebar, setShowSidebar] = useState(true); useEffect(() => { const listener = new MessageListener({ async openCoursePopup({ data, sendResponse }) { const course = activeSchedule.courses.find(course => course.uniqueId === data.uniqueId); if (course === undefined) return; setCourse(course); setShowPopup(true); const currentTab = await chrome.tabs.getCurrent(); if (currentTab === undefined) return; sendResponse(currentTab); }, }); listener.listen(); return () => listener.unlisten(); }, [activeSchedule]); useEffect(() => { if (course) setShowPopup(true); }, [course]); return (
{ setShowSidebar(!showSidebar); }} />
setShowPopup(false)} open={showPopup} afterLeave={() => setCourse(null)} />
); }