{"version":3,"file":"static/chunks/pages/planner-06dc3d79839be400.js","mappings":"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","sources":["webpack://_N_E/?8b0a","webpack://_N_E/./src/components/planner/PlannerCart.tsx","webpack://_N_E/./src/pages/planner.tsx","webpack://_N_E/./src/hooks/useClickObserver.ts","webpack://_N_E/./src/styles/components/planner/PlannerCart.module.scss","webpack://_N_E/./src/styles/pages/PlannerPage.module.scss"],"sourcesContent":["\n (window.__NEXT_P = window.__NEXT_P || []).push([\n \"/planner\",\n function () {\n return require(\"private-next-pages/planner.tsx\");\n }\n ]);\n if(module.hot) {\n module.hot.dispose(function () {\n window.__NEXT_P.push([\"/planner\"])\n });\n }\n ","import { observer } from 'mobx-react-lite';\nimport { Checkbox, IconButton, Tooltip } from '@mui/material';\nimport { ClearAllRounded, Warning } from '@mui/icons-material';\nimport clsx from 'clsx';\nimport { FC } from 'react';\n\nimport { unescape } from 'lodash';\nimport styles from '../../styles/components/planner/PlannerCart.module.scss';\nimport { usePlanner } from '../../store';\nimport Card from '../atoms/Card';\nimport ListItem from '../molecules/ListItem';\nimport { getSectionTime } from '../review/CourseSections';\nimport {\n CourseSection,\n ErrorCardMode,\n OverlapSection,\n PlannerCourse,\n TbaSection,\n} from '../../types';\nimport ErrorCard from '../molecules/ErrorCard';\n\nconst getSectionLabel = (\n course: PlannerCourse,\n overlap: OverlapSection,\n isTba: TbaSection\n) => {\n if (overlap) return `Overlap with ${overlap?.name}`;\n if (isTba) return 'TBA Section';\n return unescape(course?.title);\n};\n\ntype Props = {\n style?: string;\n};\n\nconst PlannerCart: FC = ({ style }) => {\n const planner = usePlanner();\n const toggleHide = (\n section: CourseSection,\n index: number,\n sectionKey: string\n ) => {\n planner.updatePlannerSection(\n {\n ...section,\n hide: !section.hide,\n },\n index,\n sectionKey\n );\n };\n return (\n \n
\n
\n

Cart

\n {Boolean(planner.hidedSections?.length) && (\n \n planner.removeHidedCourses()}\n size=\"small\"\n >\n \n \n \n )}\n
\n
\n \n \n {planner.timetableInfo.totalCredits || 0}\n \n Credits\n \n \n \n {planner.timetableInfo.averageHour.toFixed(2)}\n \n Average Hours\n \n
\n
\n {planner.plannerCourses?.length ? (\n planner.plannerCourses.map((course, index) =>\n Object.entries(course.sections).map(([k, section], sectionIndex) => {\n const sectionLabel = `${course.courseId} ${section.name}`;\n const overlap = planner.overlapSections[sectionLabel];\n const isTba = planner.timetableInfo.tbaSections[sectionLabel];\n return (\n toggleHide(section, index, k)}\n left={\n \n {overlap ? (\n \n ) : (\n \n )}\n \n }\n />\n );\n })\n )\n ) : (\n \n )}\n
\n );\n};\n\nexport default observer(PlannerCart);\n","import { useState, useEffect, FC } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport Draggable from 'react-draggable';\nimport { Fab } from '@mui/material';\nimport { AiOutlineCalendar } from 'react-icons/ai';\nimport { useRouter } from 'next/router';\nimport Head from 'next/head';\nimport { RiShoppingCartLine } from 'react-icons/ri';\n\nimport styles from '../styles/pages/PlannerPage.module.scss';\nimport SearchPanel from '../components/organisms/SearchPanel';\nimport Page from '../components/atoms/Page';\nimport PlannerTimetable from '../components/planner/PlannerTimetable';\nimport PlannerCart from '../components/planner/PlannerCart';\nimport authenticatedRoute from '../components/molecules/authenticatedRoute';\nimport useClickObserver from '../hooks/useClickObserver';\nimport useMobileQuery from '../hooks/useMobileQuery';\n\nenum PlannerMode {\n INIT,\n DESKTOP, // Desktop Only\n CART, // Mobile Only\n TIMETABLE, // Mobile Only\n}\n\ntype PlannerMobileFabProps = {\n targetMode: PlannerMode;\n setMode: (mode: PlannerMode) => any;\n};\n\nconst PLANNER_MOBILE_FAB_ITEM = {\n [PlannerMode.CART]: {\n icon: ,\n },\n [PlannerMode.TIMETABLE]: {\n icon: ,\n },\n};\n\nconst PlannerMobileFab = ({ targetMode, setMode }: PlannerMobileFabProps) => {\n return (\n setMode(targetMode))}>\n \n {PLANNER_MOBILE_FAB_ITEM[targetMode]?.icon}\n \n \n );\n};\n\nconst PlannerPage: FC = () => {\n const router = useRouter();\n const { sid: shareId } = router.query;\n const isMobile = useMobileQuery();\n\n const [mode, setMode] = useState(PlannerMode.INIT);\n\n const renderContent = () => {\n switch (mode) {\n case PlannerMode.INIT:\n return null;\n case PlannerMode.DESKTOP:\n return (\n <>\n \n \n \n \n );\n case PlannerMode.TIMETABLE:\n return ;\n case PlannerMode.CART:\n return (\n <>\n \n \n \n );\n }\n };\n\n /** Switch mode based on media */\n useEffect(() => {\n if (typeof isMobile === 'boolean') {\n setMode(isMobile ? PlannerMode.TIMETABLE : PlannerMode.DESKTOP);\n }\n }, [isMobile]);\n\n /** Set to timetable mode when accepting shareId for mobile */\n useEffect(() => {\n if (isMobile && shareId) {\n if (mode !== PlannerMode.TIMETABLE) {\n setMode(PlannerMode.TIMETABLE);\n }\n }\n }, [shareId, mode, isMobile]);\n\n return (\n \n \n {'CUHK Timetable Planner - CUtopia'}\n \n {renderContent()}\n {isMobile && (\n \n )}\n \n );\n};\n\nexport default authenticatedRoute(observer(PlannerPage));\n","import { useState } from 'react';\n\ntype Point = {\n x: number;\n y: number;\n};\n\nconst l2dist = (p1: Point, p2: Point) => {\n const dx = p2.x - p1.x;\n const dy = p2.y - p1.y;\n return Math.sqrt(dx * dx + dy * dy);\n};\n\nconst useClickObserver = clickCallback => {\n const [dragStartPos, setDragStartPos] = useState(null);\n const onStart = (_, data) => {\n setDragStartPos({ x: data.x, y: data.y });\n };\n const onStop = (_, data) => {\n const dragStopPoint = { x: data.x, y: data.y };\n if (l2dist(dragStartPos, dragStopPoint) < 5) {\n clickCallback();\n }\n };\n return { onStart, onStop };\n};\n\nexport default useClickObserver;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"plannerCart\":\"IPq_VFG\",\"plannerCartListIcon\":\"hh7TzsY\",\"alert\":\"yDXqFjw\",\"plannerCartCheckbox\":\"xwqsxaC\",\"timetableInfoRow\":\"Sei6cEm\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"plannerPage\":\"f0Y0_Yb\",\"plannerDraggableFabContainer\":\"v7I_lvu\"};"],"names":["window","__NEXT_P","push","getSectionLabel","course","overlap","isTba","name","unescape","title","observer","planner","style","usePlanner","toggleHide","section","index","sectionKey","updatePlannerSection","hide","Card","className","clsx","styles","header","div","h3","Boolean","hidedSections","length","Tooltip","IconButton","onClick","removeHidedCourses","size","ClearAllRounded","span","timetableInfo","totalCredits","averageHour","toFixed","plannerCourses","map","Object","entries","sections","sectionIndex","k","sectionLabel","courseId","overlapSections","tbaSections","ListItem","caption","getSectionTime","left","arrow","placement","Warning","Checkbox","checked","disableTouchRipple","disableFocusRipple","disableRipple","ErrorCard","mode","ErrorCardMode","clickCallback","useState","onStart","_","data","setDragStartPos","x","y","onStop","dragStopPoint","p1","p2","dx","dy","Math","sqrt","l2dist","dragStartPos","PlannerMode","INIT","DESKTOP","CART","TIMETABLE","PLANNER_MOBILE_FAB_ITEM","icon","RiShoppingCartLine","AiOutlineCalendar","PlannerMobileFab","targetMode","setMode","Draggable","bounds","useClickObserver","Fab","id","color","aria-label","authenticatedRoute","sid","useRouter","query","isMobile","useMobileQuery","useEffect","shareId","Page","center","padding","Head","SearchPanel","PlannerTimetable","PlannerCart","renderContent","module","exports"],"sourceRoot":""}