{"version":3,"file":"static/chunks/354-aea0335be176c19b.js","mappings":"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","sources":["webpack://_N_E/./src/components/atoms/Page.tsx","webpack://_N_E/./src/components/molecules/authenticatedRoute.tsx","webpack://_N_E/./src/helpers/colorMixing.ts","webpack://_N_E/./src/components/planner/CourseCard.tsx","webpack://_N_E/./src/components/planner/Timetable.tsx","webpack://_N_E/./src/components/planner/TimetableOverview.tsx","webpack://_N_E/./src/components/templates/TimetablePanel.tsx","webpack://_N_E/./src/components/planner/PlannerTimetable.tsx","webpack://_N_E/./src/styles/components/planner/CourseCard.module.scss","webpack://_N_E/./src/styles/components/planner/PlannerTimetable.module.scss","webpack://_N_E/./src/styles/components/planner/Timetable.module.scss","webpack://_N_E/./src/styles/components/planner/TimetableOverview.module.scss","webpack://_N_E/./src/styles/components/templates/TimetablePanel.module.scss"],"sourcesContent":["import clsx from 'clsx';\nimport { FCC } from '../../types/general';\n\ntype PageProps = {\n className?: string;\n center?: boolean;\n padding?: boolean;\n column?: boolean;\n};\n\nconst Page: FCC = ({\n children,\n className,\n center,\n padding,\n column,\n}) => {\n return (\n \n {children}\n \n );\n};\n\nexport default Page;\n","import { DocumentNode, useLazyQuery } from '@apollo/client';\nimport * as Sentry from '@sentry/nextjs';\nimport { observer } from 'mobx-react-lite';\nimport { useRouter } from 'next/router';\nimport { FC, useEffect, useState } from 'react';\nimport { GET_USER } from '../../constants/queries';\nimport { useUser, useView } from '../../store';\nimport { User, AuthState } from '../../types';\nimport Loading from '../atoms/Loading';\nimport LoginPanel from '../templates/LoginPanel';\n\ntype Options = {\n userQuery?: DocumentNode;\n};\n\ntype HOC = (Component: FC, options?: Options) => FC;\n\nconst authenticatedRoute: HOC = (Component = null, options = {}) => {\n const AuthenticatedRoute: FC = props => {\n const [authState, setAuthState] = useState(AuthState.INIT);\n const user = useUser();\n const view = useView();\n const router = useRouter();\n const [getUser] = useLazyQuery<{\n me: User;\n }>(options.userQuery || GET_USER, {\n onCompleted: data => {\n if (data?.me?.username) {\n user.updateUserData(data.me);\n Sentry.setUser({\n username: data.me.username,\n });\n setAuthState(AuthState.LOGGED_IN);\n } else {\n setAuthState(AuthState.LOGGED_OUT);\n }\n },\n onError: e => {\n view.handleError(e);\n setAuthState(AuthState.LOGGED_OUT);\n },\n });\n useEffect(() => {\n // If no prev login data, then redirect to login page\n if (!user.token) {\n setAuthState(AuthState.LOGGED_OUT);\n return;\n }\n // If logged in for current session, then return component\n if (user.loggedIn) {\n setAuthState(AuthState.LOGGED_IN);\n return;\n }\n // If has prev token but not logged in, then check if token valid\n else {\n getUser();\n setAuthState(AuthState.LOADING);\n return;\n }\n }, [user.token]);\n\n useEffect(() => {\n user.updateStore('loginState', authState);\n }, [authState]);\n\n const renderContent = () => {\n switch (authState) {\n case AuthState.LOGGED_IN:\n return ;\n case AuthState.LOGGED_OUT:\n return ;\n default:\n return ;\n }\n };\n\n return renderContent();\n };\n\n return observer(AuthenticatedRoute);\n};\n\nexport default authenticatedRoute;\n","const hexTorgba = (hex: string): string => {\n const red = parseInt(hex.slice(1, 3), 16);\n const green = parseInt(hex.slice(3, 5), 16);\n const blue = parseInt(hex.slice(5, 7), 16);\n const alpha = parseInt(hex.slice(7, 9), 16) / 255;\n return `rgba(${red}, ${green}, ${blue}, ${alpha})`;\n};\n\nconst rgbaToArray = (rgba: string) => {\n const arr = rgba.substr(5).split(')')[0].split(',');\n if (arr.indexOf('/') > -1) arr.splice(3, 1);\n return arr.map(x => parseFloat(x));\n};\n\nconst colorMixing = (color: string, base: string) => {\n if (color.charAt(0) === '#') {\n color = hexTorgba(color);\n }\n const baseColor = base;\n const mix1 = rgbaToArray(baseColor);\n const mix2 = rgbaToArray(color);\n const mix = [];\n mix[3] = 1 - (1 - mix2[3]) * (1 - mix1[3]); // alpha\n mix[0] = Math.round(\n (mix2[0] * mix2[3]) / mix[3] + (mix1[0] * mix1[3] * (1 - mix2[3])) / mix[3]\n ); // red\n mix[1] = Math.round(\n (mix2[1] * mix2[3]) / mix[3] + (mix1[1] * mix1[3] * (1 - mix2[3])) / mix[3]\n ); // green\n mix[2] = Math.round(\n (mix2[2] * mix2[3]) / mix[3] + (mix1[2] * mix1[3] * (1 - mix2[3])) / mix[3]\n ); // blue\n return `rgba(${mix})`;\n};\n\nexport default colorMixing;\n","import { FC } from 'react';\nimport { IconButton, useTheme } from '@mui/material';\nimport { Delete } from '@mui/icons-material';\nimport { observer } from 'mobx-react-lite';\n\nimport staticStyles from '../../styles/components/planner/CourseCard.module.scss';\nimport updateOpacity from '../../helpers/updateOpacity';\nimport { usePlanner } from '../../store';\nimport { Event } from '../../types';\nimport colorMixing from '../../helpers/colorMixing';\nimport { PropsWithConfig } from './Timetable';\n\nconst getStyles = (\n durationHeight: string,\n topMarginValue: string,\n bgColor: string,\n textColor: string,\n day: number,\n numOfDays: number\n) => ({\n courseCard: {\n width: `calc(${99 / numOfDays}% - 12px)`,\n marginLeft: `${(100 / numOfDays) * (day - 1)}%`,\n height: durationHeight,\n minHeight: durationHeight, // For the use of hover height: fit-content\n top: topMarginValue,\n backgroundColor: bgColor,\n },\n courseCardTitle: {\n color: textColor,\n },\n courseCardLocation: {\n color: textColor,\n },\n});\n\ntype Props = PropsWithConfig<{\n course: Event;\n}>;\n\nconst CourseCard: FC = ({ course, config }) => {\n const planner = usePlanner();\n const theme = useTheme();\n const sTime = course.startTime.split(':');\n const eTime = course.endTime.split(':');\n const topMarginValue = `${\n (+sTime[0] - config.startHour + +sTime[1] / 60.0) *\n (100 / config.numOfHours)\n }%`;\n const durationHeight = `${\n (100 / config.numOfHours) *\n (+eTime[0] - +sTime[0] + (+eTime[1] - +sTime[1]) / 60.0)\n }%`;\n const bgColor = colorMixing(\n updateOpacity(course.color, 0.15),\n theme.palette.background.paper\n );\n const textColor = updateOpacity(course.color, 0.8);\n const styles = getStyles(\n durationHeight,\n topMarginValue,\n bgColor,\n textColor,\n course.day,\n config.numOfDays\n );\n\n return (\n
\n \n {`${course.courseId} ${course.section}`}\n \n \n {course.location}\n \n \n planner.deleteSectionInPlannerCourses({\n courseId: course.courseId,\n sectionId: course.section,\n })\n }\n >\n \n \n
\n );\n};\n\nexport default observer(CourseCard);\n","import { useMediaQuery } from '@mui/material';\n\nimport clsx from 'clsx';\nimport { FC, forwardRef } from 'react';\nimport styles from '../../styles/components/planner/Timetable.module.scss';\nimport { WEEKDAYS } from '../../constants';\nimport { EventConfig, PlannerCourse, TimetableInfo } from '../../types';\nimport { useView } from '../../store';\nimport { courses2events } from '../../helpers/timetable';\nimport CourseCard from './CourseCard';\n\nexport type PropsWithConfig = T & {\n config: EventConfig;\n};\n\nconst TimetableTicks: FC = ({ config }) => {\n return (\n <>\n {Array.from(\n { length: config.endHour - config.startHour + 1 },\n (_, i) => config.startHour + i\n ).map(hour => (\n
\n {hour !== config.startHour\n ? `${hour > 9 ? '' + hour : '0' + hour}:00`\n : ''}\n
\n ))}\n \n );\n};\n\ntype WeekdayTextProps = {\n withDate?: boolean;\n timetableInfo?: TimetableInfo;\n};\n\nconst WeekdayText: FC> = ({\n withDate,\n config,\n timetableInfo,\n}) => {\n const currentDay = new Date();\n const currentWeekday = currentDay.getDay() ? currentDay.getDay() : 7;\n\n return (\n <>\n {Array.from({ length: config.numOfDays }, (_, i) => 1 + i).map(day => {\n const differenceOfDate = day - currentWeekday;\n const thatDay = new Date();\n thatDay.setDate(new Date().getDate() + differenceOfDate);\n return (\n
\n \n {`${WEEKDAYS[day - 1]}${withDate ? ` ${thatDay.getDate()}` : ''}`}\n \n {`(${timetableInfo?.weekdayAverageHour[day] || 0} hrs)`}\n \n \n
\n );\n })}\n \n );\n};\n\ntype TimetableProps = {\n courses: PlannerCourse[];\n timetableInfo: TimetableInfo;\n};\n\nconst Timetable = forwardRef(\n ({ courses, timetableInfo }, ref) => {\n const view = useView();\n const prefersDarkMode = useMediaQuery('(prefers-color-scheme: dark)');\n const [events, config] = courses2events(courses);\n if (events === null) view.warn('Invalid Timetable');\n\n return (\n \n
\n \n
\n
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n {(events || []).map((event, i) => (\n \n ))}\n
\n
\n \n );\n }\n);\n\nTimetable.displayName = 'Timetable';\n\nexport default Timetable;\n","import { useState, useEffect, FC } from 'react';\nimport {\n Button,\n Menu,\n MenuItem,\n Divider,\n IconButton,\n InputBase,\n} from '@mui/material';\nimport { observer } from 'mobx-react-lite';\nimport { Check, Edit, ExpandMore, Timer } from '@mui/icons-material';\nimport { useLazyQuery } from '@apollo/client';\nimport { useRouter } from 'next/router';\nimport copy from 'copy-to-clipboard';\nimport { AiOutlineDelete, AiOutlineShareAlt } from 'react-icons/ai';\nimport clsx from 'clsx';\n\nimport { usePlanner, useView } from '../../store';\nimport styles from '../../styles/components/planner/TimetableOverview.module.scss';\nimport {\n TimetableOverviewMode,\n TimetableOverviewWithMode,\n UserData,\n} from '../../types';\nimport { PLANNER_CONFIGS } from '../../config';\nimport { GET_USER_TIMETABLES } from '../../constants/queries';\nimport ListItem from '../molecules/ListItem';\nimport { getDateDifference, getMMMDDYY } from '../../helpers/getTime';\nimport LoadingView from '../atoms/LoadingView';\nimport { generateTimetableURL } from './PlannerTimetable';\n\nconst getTimetableOverviewMode = (expireAt: number) =>\n expireAt > 0 ? TimetableOverviewMode.SHARE : TimetableOverviewMode.UPLOAD;\n\nconst getTimetableOverview = (data: UserData): TimetableOverviewWithMode[] => {\n if (!data?.me?.timetables) return [];\n return (data?.me?.timetables).map(item => ({\n ...item,\n mode: getTimetableOverviewMode(item.expireAt),\n }));\n};\n\nconst getExpire = (mode: TimetableOverviewMode, expireAt: number) => {\n if (mode === TimetableOverviewMode.SHARE) {\n return (\n <>\n {' • '}\n \n {getDateDifference(expireAt)}\n \n );\n }\n return '';\n};\n\ntype TimetableOverviewListItemProps = {\n item: TimetableOverviewWithMode;\n onShare: (id: string) => void;\n onDelete: (id: string) => void;\n onClick: () => void;\n selected: boolean;\n};\n\nexport const TimetableOverviewListItem: FC = ({\n item,\n onShare,\n onDelete,\n onClick,\n selected,\n}) => {\n const menuItems = [\n {\n label: 'Delete',\n action: () => onDelete(item._id),\n icon: ,\n },\n ];\n if (item.mode !== TimetableOverviewMode.UPLOAD) {\n menuItems.unshift({\n label: 'Share',\n action: () => onShare(item._id),\n icon: ,\n });\n }\n return (\n \n \n {getMMMDDYY(item.createdAt)}\n {getExpire(item.mode, item.expireAt)}\n \n }\n >\n \n {menuItems.map(item => (\n {\n e.stopPropagation();\n item.action();\n }}\n >\n {' '}\n {item.icon}\n \n ))}\n \n \n \n );\n};\n\nexport type TimetableOverviewProps = {\n createTimetable: () => any;\n switchTimetable: (id: string) => any;\n deleteTable?: (id: string) => any;\n};\n\nconst TimetableOverview: FC = ({\n deleteTable,\n createTimetable,\n switchTimetable,\n}) => {\n const view = useView();\n const planner = usePlanner();\n const [labelInput, setLabelInput] = useState('');\n const [anchorEl, setAnchorEl] = useState(null);\n const router = useRouter();\n /* For each click, update the planner name input field */\n useEffect(() => {\n if (anchorEl) {\n setLabelInput(planner?.plannerName);\n }\n }, [anchorEl]);\n const [getUserTimetable] = useLazyQuery(GET_USER_TIMETABLES, {\n onCompleted: async data => {\n planner.updateStore('timetableOverviews', getTimetableOverview(data));\n },\n onError: view.handleError,\n });\n const onShare = (id: string) => {\n copy(generateTimetableURL(id));\n view.setSnackBar('Copied share link!');\n };\n\n return (\n <>\n {\n // Do not refetch, cuz the outdated overview may served from cache (issue #1)\n if (!planner.timetableOverviews) getUserTimetable();\n setAnchorEl(e.currentTarget);\n }}\n endIcon={}\n >\n {planner.plannerName || PLANNER_CONFIGS.DEFAULT_TABLE_NAME}\n \n setAnchorEl(null)}\n >\n

Title

\n {\n e.preventDefault();\n planner.updateStore('plannerName', labelInput);\n // update the remoteTimetable data as well\n const idx = planner.timetableOverviews.findIndex(\n d => d._id === planner.plannerId\n );\n if (idx >= 0) {\n planner.timetableOverviews[idx].tableName = labelInput;\n }\n }}\n >\n e.stopPropagation()}\n onChange={e => {\n setLabelInput(e.target.value);\n }}\n inputProps={{ 'aria-label': 'search' }}\n />\n \n {labelInput === planner.plannerName ? : }\n \n \n \n

Timetables

\n \n {planner.timetableOverviews?.map(item => (\n {\n switchTimetable(item._id);\n setAnchorEl(null);\n }}\n selected={planner.plannerId === item._id}\n />\n ))}\n \n \n {\n createTimetable();\n setAnchorEl(null);\n }}\n >\n Create New\n \n \n \n );\n};\n\nexport default observer(TimetableOverview);\n","import { FC, useRef } from 'react';\nimport { IconButton } from '@mui/material';\nimport { observer } from 'mobx-react-lite';\nimport copy from 'copy-to-clipboard';\nimport clsx from 'clsx';\nimport {\n AiOutlineCamera,\n AiOutlineClear,\n AiOutlineLoading,\n AiOutlineShareAlt,\n AiOutlineSync,\n} from 'react-icons/ai';\nimport html2canvas from 'html2canvas';\n\nimport { BiExport } from 'react-icons/bi';\nimport styles from '../../styles/components/templates/TimetablePanel.module.scss';\nimport { usePlanner, useView } from '../../store';\nimport Timetable from '../planner/Timetable';\nimport Card from '../atoms/Card';\n\nimport TimetableOverview, {\n TimetableOverviewProps,\n} from '../planner/TimetableOverview';\nimport { PlannerSyncState } from '../../types';\nimport { timetable2ics } from '../../helpers/timetable';\n\ntype TimetablePanelProps = {\n onShare?: (...args: any[]) => any;\n className?: string;\n} & TimetableOverviewProps;\n\nconst SYNC_STATE_ICON = {\n [PlannerSyncState.DIRTY]: ,\n [PlannerSyncState.SYNCING]: ,\n};\n\nconst saveAs = (uri: string, filename: string) => {\n const link = document.createElement('a');\n if (typeof link.download === 'string') {\n link.href = uri;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n } else {\n window.open(uri);\n }\n};\n\nconst screenShotTimetable = async (el: HTMLDivElement) => {\n if (!el) return;\n try {\n const canvas = await html2canvas(el, {\n // add styles for the screenshot\n onclone: el => {\n const ttb: any = el.querySelector('.timetable-container');\n if (ttb?.style) {\n ttb.style.padding = '24px';\n ttb.style.backgroundColor = `var(--surface)`;\n }\n },\n });\n const data = canvas.toDataURL();\n saveAs(data, 'cutopia-timetable.png');\n } catch (e) {\n return e;\n }\n};\n\nconst TimetablePanel: FC = ({\n onShare,\n deleteTable,\n className,\n createTimetable,\n switchTimetable,\n}) => {\n const view = useView();\n const planner = usePlanner();\n const timetableRef = useRef();\n const courses = planner.plannerCourses\n ?.concat(planner.previewPlannerCourse)\n .filter(course => course);\n const timetableInfo = planner.timetableInfo;\n const onClear = () => planner.clearPlannerCourses();\n\n const FUNCTION_BUTTONS = [\n {\n action: async () => {\n try {\n const numCourses = courses.length;\n const ics = timetable2ics(courses);\n // OLD VERSION SUPPORT: if has courses but no event added & no error thrown => courses have no meetingDates\n if (ics.length == 0 && numCourses) {\n return view.warn('Sorry, only NEW timetables are supported');\n }\n const fname = `${planner.plannerName || 'cutopia_timetable'}.ics`;\n const icsFile = ics.getIcsFile(fname);\n const url = URL.createObjectURL(icsFile);\n saveAs(url, fname);\n view.setSnackBar(\n 'Calendar file (.ics) saved, use Outlook/Google Calendar to import it~'\n );\n } catch (e) {\n view.warn('Failed to export timetable events QAQ');\n }\n },\n icon: ,\n key: 'export',\n },\n {\n action: async () => {\n const err = await screenShotTimetable(timetableRef?.current);\n if (err) {\n view.warn('Failed to screenshot QAQ');\n }\n },\n icon: ,\n key: 'screenshot',\n },\n {\n action: () => {\n if (!onShare) {\n const result = copy(JSON.stringify(courses));\n view.setSnackBar(\n result\n ? 'Copied the timetable to clipboard!'\n : 'Failed to copy QAQ, please report the issue to us'\n );\n } else {\n onShare(courses);\n }\n },\n icon: ,\n key: 'share',\n },\n {\n key: 'Clear',\n action: onClear,\n icon: ,\n },\n ];\n\n return (\n \n
\n \n {Boolean(courses?.length) && (\n
\n {planner.syncState !== PlannerSyncState.SYNCED && (\n \n {SYNC_STATE_ICON[planner.syncState]}\n \n )}\n {FUNCTION_BUTTONS.map(item => (\n \n {item.icon}\n \n ))}\n
\n )}\n
\n \n
\n );\n};\n\nexport default observer(TimetablePanel);\n","import { useReducer, useState, useEffect, FC } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { reaction } from 'mobx';\nimport { useLazyQuery, useMutation } from '@apollo/client';\nimport { Button, Dialog } from '@mui/material';\nimport copy from 'copy-to-clipboard';\nimport { useRouter } from 'next/router';\nimport clsx from 'clsx';\nimport { debounce } from 'lodash';\n\nimport { useBeforeUnload } from 'react-use';\nimport styles from '../../styles/components/planner/PlannerTimetable.module.scss';\nimport { useView, usePlanner } from '../../store';\nimport { PLANNER_CONFIGS, TIMETABLE_SYNC_INTERVAL } from '../../config';\nimport {\n CLONE_TIMETABLE,\n REMOVE_TIMETABLE,\n SWITCH_TIMETABLE,\n UPLOAD_TIMETABLE,\n} from '../../constants/mutations';\nimport {\n Planner,\n PlannerCourse,\n PlannerSyncState,\n ShareTimetableMode,\n TimetableOverviewMode,\n UploadTimetable,\n} from '../../types';\nimport ChipsRow from '../molecules/ChipsRow';\nimport TextField from '../atoms/TextField';\nimport LoadingButton from '../atoms/LoadingButton';\nimport DialogContentTemplate from '../templates/DialogContentTemplate';\nimport Section from '../molecules/Section';\nimport Footer from '../molecules/Footer';\nimport TimetablePanel from '../templates/TimetablePanel';\nimport { CREATE_PLANNER_FLAG, EXPIRE_LOOKUP } from '../../constants';\nimport { GET_TIMETABLE } from '../../constants/queries';\nimport useMobileQuery from '../../hooks/useMobileQuery';\nimport LoadingView from '../atoms/LoadingView';\n\nconst getModeFromExpireAt = (expireAt: number) => {\n return expireAt > 0\n ? TimetableOverviewMode.SHARE\n : TimetableOverviewMode.UPLOAD;\n};\n\nconst getExpire = (str: string) => {\n /* Handle invalid case */\n if (!str) return null;\n /* If user choose share expire days */\n if (str.endsWith('day') || str.endsWith('days')) {\n return parseInt(str[0], 10);\n }\n /* If no expire days, then its upload but not share */\n switch (str) {\n /* If the upload is shareable */\n case 'Yes':\n return EXPIRE_LOOKUP.shareableUpload;\n /* If it's private upload */\n case 'No':\n return EXPIRE_LOOKUP.upload;\n }\n return str;\n};\n\nconst getExpireAt = (\n str: string | number,\n createdAt: number,\n isExpire = false\n): number => {\n const expireDays = isExpire ? str : getExpire(str as string);\n if (expireDays > 0) {\n const createDate = new Date(createdAt);\n createDate.setDate(createDate.getDate() + (expireDays as number));\n return +createDate;\n } else return -1;\n};\n\nconst getLabelFromKey = {\n [EXPIRE_LOOKUP.shareableUpload]: 'Yes',\n [EXPIRE_LOOKUP.upload]: 'No',\n};\n\nconst EXPIRE_LABELS = ['1 day', '3 days', '7 days'];\nconst SHAREABLE_LABELS = ['Yes', 'No'];\n\nconst SHARE_SECTIONS = [\n {\n label: 'Expire In',\n chips: EXPIRE_LABELS,\n key: 'expire',\n },\n];\n\nconst UPLOAD_SECTIONS = [\n {\n label: 'Shareable',\n chips: SHAREABLE_LABELS,\n key: 'expire',\n },\n];\n\nconst MODE_ASSETS = {\n [ShareTimetableMode.SHARE]: {\n sections: SHARE_SECTIONS,\n label: 'share',\n title: 'Share Timetable',\n },\n [ShareTimetableMode.UPLOAD]: {\n sections: UPLOAD_SECTIONS,\n label: 'upload',\n title: 'Upload Timetable',\n },\n};\n\nexport const generateTimetableURL = (id: string) =>\n `${window.location.protocol}//${window.location.host}/planner?sid=${id}`;\n\nexport const coursesToEntries = (courses: PlannerCourse[], skipHide = false) =>\n courses\n .filter(\n course =>\n course && course.sections && Object.values(course.sections)?.length\n )\n .map(course => {\n let sections = Object.values(course?.sections || {});\n sections = skipHide\n ? sections.filter(section => section && !section.hide)\n : sections;\n return {\n ...course,\n sections: sections.map(section => {\n /* Remove the hide attr if not hidden */\n const { hide, ...copy } = section;\n if (hide) {\n (copy as any).hide = true;\n }\n return copy;\n }),\n };\n });\n\nexport const entriesToCourses = (entries: any[]) =>\n entries.map(course => ({\n ...course,\n sections: Object.fromEntries(\n course.sections.map(section => {\n const sectionCopy = {\n ...section,\n hide: section.hide || false, // Must set to false, otherwise will sync twice!!!\n };\n return [section.name, sectionCopy];\n })\n ),\n })) || [];\n\nconst TimetableShareDialogContent = ({\n shareConfig,\n dispatchShareConfig,\n view,\n onShareTimetTable,\n uploadTimetableLoading,\n mode,\n}) => (\n <>\n {MODE_ASSETS[mode]?.sections?.map(section => (\n
\n dispatchShareConfig({ [section.key]: item })}\n />\n
\n ))}\n {shareConfig.shareLink ? (\n
\n
\n {}}\n disabled\n />\n [\n copy(shareConfig.shareLink),\n view.setSnackBar('Copied share link to your clipboard!'),\n ]}\n >\n Copy\n \n
\n
\n ) : (\n
\n \n {MODE_ASSETS[mode]?.label}\n \n
\n )}\n \n);\n\nconst SHARE_ID_RULE = new RegExp('^[A-Za-z0-9_-]{8,10}$', 'i');\n\nconst validShareId = (id: string) => id && SHARE_ID_RULE.test(id);\n\ntype PlannerTimetableProps = {\n className?: string;\n hide?: boolean; // for mobile to switch to cart view\n};\n\nconst PlannerTimetable: FC = ({ className, hide }) => {\n const planner = usePlanner();\n const router = useRouter();\n const isMobile = useMobileQuery();\n const isHome = router.pathname == '/';\n const { sid: shareId } = router.query as {\n sid?: string;\n };\n const view = useView();\n const [shareCourses, setShareCourses] = useState<{\n mode: ShareTimetableMode;\n } | null>(null);\n const [shareConfig, dispatchShareConfig] = useReducer(\n (state, action) => ({ ...state, ...action }),\n {}\n );\n const applyTimetable = (\n timetable: UploadTimetable | null,\n id: string,\n msg?: string,\n addToOverview?: boolean\n ) => {\n timetable = timetable || ({} as any);\n const importedPlanner: Planner = {\n createdAt: timetable.createdAt,\n tableName: timetable.tableName,\n expireAt: timetable.expireAt,\n id,\n courses: entriesToCourses(timetable.entries),\n };\n\n if (addToOverview) {\n const overview = {\n _id: id,\n ...importedPlanner,\n mode: getModeFromExpireAt(timetable.expireAt),\n };\n delete overview.courses;\n planner.updateTimetableOverview(overview as any);\n }\n planner.updateCurrentPlanner(importedPlanner);\n /* If current path is a share path, then change to planner */\n msg = shareId ? 'Timetable loaded' : msg;\n if (shareId) {\n router.push('/planner');\n }\n if (msg) view.setSnackBar(msg);\n };\n\n const [getTimetable, { loading: getTimetableLoading }] = useLazyQuery(\n GET_TIMETABLE,\n {\n onCompleted: (data: { timetable: UploadTimetable }) => {\n applyTimetable(data?.timetable, planner.plannerId);\n },\n onError: e => {\n view.handleError(e);\n /* Reset the planner id and create a new timetable */\n createTimetable();\n },\n }\n );\n\n const [removeTimetable, { loading: removeTimetableLoading }] =\n useMutation(REMOVE_TIMETABLE);\n\n const [uploadTimetable, { loading: uploadTimetableLoading }] =\n useMutation(UPLOAD_TIMETABLE);\n\n const [switchTimetableMutation, { loading: switchTimetableLoading }] =\n useMutation(SWITCH_TIMETABLE);\n\n const [cloneTimetableMutation] = useMutation(CLONE_TIMETABLE);\n\n const onDelete = async (id: string) => {\n try {\n const isCurrentPlanner = id === planner.plannerId;\n /* Get next timetable id if deleting current planner */\n const variables: any = {\n id,\n };\n /* Undefined switch to means not deleting current ttb, no need switch */\n let switchTo = undefined;\n if (isCurrentPlanner) {\n let maxCreatedAt = 0;\n /* If it's the last ttb, then switch to null means create one */\n switchTo = null;\n planner.timetableOverviews.forEach(d => {\n if (d.createdAt > maxCreatedAt && d._id !== id) {\n maxCreatedAt = d.createdAt;\n switchTo = d._id;\n }\n });\n variables.switchTo = switchTo;\n }\n const { data } = await removeTimetable({\n variables,\n });\n view.setSnackBar('Deleted!');\n /* Update the timetableOverviews */\n planner.removeTimetableOverview(id);\n /* Switch to the new if deleting current planner */\n if (isCurrentPlanner) {\n if (data?.removeTimetable) {\n applyTimetable(\n data?.removeTimetable,\n switchTo || data?.removeTimetable?._id,\n undefined,\n !switchTo\n );\n } else {\n createTimetable();\n }\n }\n } catch (e) {\n // To skip remove entry in state in case of any error\n view.handleError(e);\n }\n };\n\n const switchTimetable = async (id: string, noFail = false) => {\n if (id === planner.plannerId) {\n /* If same planner id as current one, call get ttb but not switch */\n if (noFail) {\n getTimetable({\n variables: {\n id: planner.plannerId,\n },\n });\n }\n return;\n }\n try {\n if (planner.syncState === PlannerSyncState.DIRTY) {\n /* May call twice? Ref: https://github.com/lodash/lodash/issues/4185 */\n await updateTimetable({\n delta: planner.delta,\n _id: planner.plannerId,\n syncing: planner.isSyncing,\n });\n updateTimetable.flush();\n }\n const { data } = await switchTimetableMutation({ variables: { id } });\n applyTimetable(\n data?.switchTimetable,\n id,\n `Switched to ${\n data?.switchTimetable?.tableName || PLANNER_CONFIGS.DEFAULT_TABLE_NAME\n }`\n );\n } catch (e) {\n view.handleError(e);\n createTimetable();\n }\n };\n\n const updateTimetable = debounce(\n async ({ delta, _id, syncing }) => {\n try {\n /* If no update / updating, do nothing */\n if (!delta || syncing) return;\n /* Update sync states to syncing */\n planner.updateStore('isSyncing', true);\n const deltaClone = JSON.parse(JSON.stringify(delta));\n\n /* Process the entries for gql */\n if (delta.courses) {\n delta['entries'] = coursesToEntries(delta.courses);\n delete delta.courses;\n }\n /* If dirty, then upload timetable */\n await uploadTimetable({\n variables: {\n _id,\n ...delta,\n expire: EXPIRE_LOOKUP.default,\n },\n });\n /* Update planner (prev state) after synced */\n planner.syncPlanner(deltaClone);\n planner.updateStore('isSyncing', false);\n } catch (e) {\n view.handleError(e);\n }\n },\n TIMETABLE_SYNC_INTERVAL,\n {\n trailing: true,\n }\n );\n\n const onShareTimetTable = async e => {\n try {\n e.preventDefault();\n const expire = getExpire(shareConfig.expire);\n await uploadTimetable({\n variables: {\n _id: planner.plannerId,\n expire,\n },\n });\n const expireAt = getExpireAt(expire, +new Date(), true);\n const overview = {\n _id: planner.plannerId,\n expireAt,\n mode: getModeFromExpireAt(expireAt),\n };\n planner.updateTimetableOverview(overview);\n planner.syncPlanner({ expireAt });\n const shareURL = generateTimetableURL(planner.plannerId);\n dispatchShareConfig({\n shareLink: shareURL,\n });\n copy(shareURL);\n view.setSnackBar('Copied share link to your clipboard!');\n } catch (e) {\n view.handleError(e);\n }\n };\n\n useEffect(() => {\n // start sync\n const disposer = reaction(\n () => ({\n delta: planner.delta,\n _id: planner.plannerId,\n syncing: planner.isSyncing,\n }),\n data => {\n updateTimetable(data);\n }\n );\n // end sync b4 unmount\n return () => disposer();\n }, []);\n\n /* TEMP START: to upload local ttb (Remove on Nov?) */\n const uploadPlanners = async (planners: Record) => {\n planner.updateStore('uploading', true);\n await Promise.all(\n Object.entries(planners).map(async ([k, v]) => {\n if (!v?.courses?.length) return;\n const variables: any = {\n entries: coursesToEntries(v.courses),\n expire: EXPIRE_LOOKUP.upload,\n };\n const tableName = (v as any).label;\n if (tableName) {\n variables.tableName = tableName;\n }\n try {\n const { data } = await uploadTimetable({ variables });\n const timetable = data?.uploadTimetable;\n const overview = {\n _id: timetable._id,\n createdAt: timetable.createdAt,\n tableName,\n expireAt: -1,\n mode: TimetableOverviewMode.UPLOAD,\n };\n planner.updateTimetableOverview(overview, true);\n } catch (e) {\n view.handleError(e);\n }\n })\n );\n planner.destroyPlanners();\n };\n useEffect(() => {\n if (planner.planners && !planner.uploading) {\n uploadPlanners(planner.planners);\n }\n }, [planner.planners, planner.uploading]);\n /* TEMP END */\n\n useEffect(() => {\n dispatchShareConfig({\n expire: shareCourses?.mode === ShareTimetableMode.SHARE ? '7 days' : 'No',\n shareLink: '',\n });\n }, [shareCourses]);\n\n /**\n * Handle plannerId change\n */\n useEffect(() => {\n /* If it's shared planner link, then return */\n if (shareId) return;\n /* if no planner, then init / load one */\n if (planner.plannerId === CREATE_PLANNER_FLAG) {\n createTimetable();\n return;\n }\n /* if prev planner id !== curr planner id, then get planner (e.g. load default ttb) */\n if (planner.planner?.id !== planner.plannerId) {\n getTimetable({\n variables: {\n id: planner.plannerId,\n },\n });\n }\n }, [planner.plannerId, shareId]);\n\n /**\n * Handle shareId change\n */\n useEffect(() => {\n /* If the id is invalid, return */\n if (!shareId) return;\n if (!validShareId(shareId)) {\n view.warn('Invalid shared timetable!');\n router.push('/planner');\n return;\n }\n /**\n * If the id is valid, check if it's cloned,\n * switch ttb if cloned otherwise clone\n */\n const cloneId = planner.inShareMap(shareId);\n\n if (cloneId) {\n switchTimetable(cloneId, true);\n } else {\n cloneTimetable(shareId);\n }\n }, [shareId]);\n\n // If planner is dirty, prevent unload\n useBeforeUnload(() => {\n if (planner.syncState === PlannerSyncState.DIRTY) {\n updateTimetable({\n delta: planner.delta,\n _id: planner.plannerId,\n });\n return true;\n }\n return false;\n }, 'Timetable syncing, please wait for a few seconds before leaving');\n\n const createTimetable = async () => {\n try {\n const { data } = await uploadTimetable({\n variables: {\n entries: [],\n expire: EXPIRE_LOOKUP.upload,\n },\n });\n view.setSnackBar('Timetable created!');\n const timetable = data?.uploadTimetable;\n const overview = {\n _id: timetable._id,\n createdAt: timetable.createdAt,\n tableName: '',\n expireAt: -1,\n mode: TimetableOverviewMode.UPLOAD,\n };\n planner.updateTimetableOverview(overview, true);\n /* If it's create new, then only need update local plannerId, cuz remote is updated */\n planner.updateStore('plannerId', timetable._id);\n const newTimetable = data?.uploadTimetable;\n planner.newPlanner(newTimetable?._id, newTimetable?.createdAt);\n } catch {\n /* Update planner id to prevent create ttb called inf times */\n planner.updateStore('plannerId', 'FAIL');\n view.warn('Create timetable failed...');\n }\n };\n\n const cloneTimetable = async (shareId: string) => {\n try {\n const { data } = await cloneTimetableMutation({\n variables: { id: shareId },\n });\n const clonedTtbId = data?.cloneTimetable._id;\n\n applyTimetable(\n data?.cloneTimetable,\n clonedTtbId,\n `Loaded share timetable ${\n data?.cloneTimetable?.tableName || PLANNER_CONFIGS.DEFAULT_TABLE_NAME\n }`\n );\n planner.addToShareMap(shareId, clonedTtbId);\n } catch (e) {\n view.handleError(e);\n }\n };\n\n const onShareClick = () => {\n /* If it's shared, then copy link and display message */\n\n if (\n getModeFromExpireAt(planner.planner?.expireAt) ===\n TimetableOverviewMode.SHARE\n ) {\n copy(generateTimetableURL(planner.plannerId));\n view.setSnackBar('Copied share link to your clipboard!');\n } else {\n setShareCourses({\n mode: ShareTimetableMode.SHARE,\n });\n }\n };\n\n if (hide) return null;\n\n return (\n
\n \n onDelete(id)}\n />\n
\n );\n};\n\nexport default observer(PlannerTimetable);\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"timetableCourseCard\":\"l8XLjYR\",\"delete\":\"UlRT79s\",\"timetableCourseCardTitle\":\"HxSI_ET\",\"timetableCourseCardLocation\":\"_0cXxEEl\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"plannerFooter\":\"Lp_5oYI\",\"plannerShareDialog\":\"_9pTnfrl\",\"shareLinkRow\":\"s11wtci\",\"plannerInputContainer\":\"_6lpRG4x\",\"plannerTimetableContainer\":\"n9uLkce\",\"contentContainer\":\"WB6nUZx\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"timetableContainer\":\"W_GbHrL\",\"weekdayRow\":\"rNGlk7Q\",\"weekdayText\":\"fXHj6hj\",\"timetableCanvas\":\"pC4zUBX\",\"timetableTicks\":\"PQAMKC8\",\"timeLineBox\":\"ISpKrua\",\"timetableCoursesContainer\":\"Raqd_l5\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"ttOverviewListItem\":\"hPudVGH\",\"btnContainer\":\"jGME_MV\",\"menuItem\":\"PPMvNlR\",\"timetableSelectionMenu\":\"bc_2jLD\",\"timetableLabelInputContainer\":\"ob1NBqD\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"timetablePanel\":\"AFMr2r4\",\"btnRow\":\"p9A8ybk\",\"iconSpin\":\"G3R3ZQV\"};"],"names":["children","className","center","padding","column","div","clsx","Component","options","AuthenticatedRoute","props","useState","AuthState","user","useUser","view","useView","router","useRouter","getUser","useLazyQuery","userQuery","GET_USER","onCompleted","data","me","username","updateUserData","Sentry","setAuthState","onError","e","handleError","useEffect","token","loggedIn","updateStore","authState","LoginPanel","returnUrl","asPath","Loading","fixed","logo","renderContent","observer","rgbaToArray","rgba","arr","substr","split","indexOf","splice","map","x","parseFloat","color","base","charAt","hex","red","parseInt","slice","green","blue","alpha","hexTorgba","mix1","mix2","mix","Math","round","course","config","planner","usePlanner","theme","useTheme","sTime","startTime","eTime","endTime","topMarginValue","startHour","numOfHours","durationHeight","bgColor","colorMixing","updateOpacity","palette","background","paper","textColor","styles","day","numOfDays","courseCard","width","marginLeft","height","minHeight","top","backgroundColor","courseCardTitle","courseCardLocation","getStyles","staticStyles","style","span","courseId","section","location","IconButton","size","onClick","deleteSectionInPlannerCourses","sectionId","Delete","TimetableTicks","Array","from","length","endHour","_","i","hour","WeekdayText","withDate","timetableInfo","currentDay","Date","currentWeekday","getDay","differenceOfDate","thatDay","setDate","getDate","WEEKDAYS","weekdayAverageHour","Timetable","forwardRef","ref","courses","prefersDarkMode","useMediaQuery","courses2events","events","warn","svg","xmlns","defs","pattern","id","patternUnits","path","d","fill","stroke","rect","event","CourseCard","displayName","getTimetableOverview","timetables","item","mode","expireAt","TimetableOverviewMode","TimetableOverviewListItem","onShare","onDelete","selected","menuItems","label","action","_id","icon","AiOutlineDelete","unshift","AiOutlineShareAlt","MenuItem","ListItem","noHover","noBorder","title","tableName","PLANNER_CONFIGS","caption","getMMMDDYY","createdAt","Timer","getDateDifference","stopPropagation","deleteTable","createTimetable","switchTimetable","anchorEl","setLabelInput","plannerName","GET_USER_TIMETABLES","getUserTimetable","copy","generateTimetableURL","setSnackBar","Button","timetableOverviews","setAnchorEl","currentTarget","endIcon","ExpandMore","Menu","open","Boolean","onClose","h4","form","onSubmit","preventDefault","labelInput","idx","findIndex","plannerId","InputBase","placeholder","value","onKeyDown","onChange","target","inputProps","type","Edit","Check","Divider","LoadingView","loading","SYNC_STATE_ICON","PlannerSyncState","AiOutlineSync","AiOutlineLoading","saveAs","uri","filename","link","document","createElement","download","href","body","appendChild","click","removeChild","window","screenShotTimetable","el","canvas","html2canvas","onclone","ttb","querySelector","toDataURL","timetableRef","useRef","plannerCourses","concat","previewPlannerCourse","filter","FUNCTION_BUTTONS","numCourses","ics","fname","icsFile","url","timetable2ics","getIcsFile","URL","createObjectURL","BiExport","key","current","AiOutlineCamera","result","JSON","stringify","clearPlannerCourses","AiOutlineClear","Card","header","TimetableOverview","syncState","disabled","getModeFromExpireAt","getExpire","str","endsWith","EXPIRE_LOOKUP","getExpireAt","isExpire","expireDays","createDate","getLabelFromKey","SHARE_SECTIONS","chips","UPLOAD_SECTIONS","MODE_ASSETS","ShareTimetableMode","sections","protocol","host","coursesToEntries","skipHide","Object","values","hide","TimetableShareDialogContent","shareConfig","dispatchShareConfig","onShareTimetTable","uploadTimetableLoading","Section","ChipsRow","items","select","setSelect","shareLink","TextField","onChangeText","variant","LoadingButton","SHARE_ID_RULE","RegExp","isMobile","useMobileQuery","isHome","pathname","sid","query","useReducer","state","applyTimetable","timetable","msg","addToOverview","entries","importedPlanner","fromEntries","sectionCopy","name","overview","updateTimetableOverview","updateCurrentPlanner","shareId","push","GET_TIMETABLE","getTimetable","useMutation","REMOVE_TIMETABLE","removeTimetable","UPLOAD_TIMETABLE","uploadTimetable","SWITCH_TIMETABLE","switchTimetableMutation","cloneTimetableMutation","CLONE_TIMETABLE","isCurrentPlanner","variables","switchTo","maxCreatedAt","undefined","forEach","removeTimetableOverview","noFail","updateTimetable","delta","syncing","isSyncing","flush","debounce","deltaClone","parse","expire","syncPlanner","TIMETABLE_SYNC_INTERVAL","trailing","shareURL","disposer","reaction","uploadPlanners","planners","Promise","all","v","destroyPlanners","uploading","shareCourses","CREATE_PLANNER_FLAG","test","cloneId","inShareMap","cloneTimetable","useBeforeUnload","newTimetable","newPlanner","clonedTtbId","addToShareMap","getTimetableLoading","switchTimetableLoading","removeTimetableLoading","TimetablePanel","setShareCourses","Footer","visible","Dialog","transitionDuration","enter","exit","TransitionProps","onExited","DialogContentTemplate","module","exports"],"sourceRoot":""}