1- import React from 'react' ;
1+ import { useEffect , useState } from 'react' ;
22import type { GetServerSidePropsContext } from 'next' ;
33import dynamic from 'next/dynamic' ;
44import { useRouter } from 'next/router' ;
55import { isKoinError } from '@bcsdlab/koin' ;
66import { dehydrate , QueryClient } from '@tanstack/react-query' ;
77import { deptQueries } from 'api/dept/queries' ;
8- import { createDefaultTimetableFrameList , timetableQueries , timetableQueryKeys } from 'api/timetable/queries' ;
8+ import {
9+ createDefaultTimetableFrameList ,
10+ isValidTimetableFrameId ,
11+ timetableQueries ,
12+ timetableQueryKeys ,
13+ } from 'api/timetable/queries' ;
914import { SSRLayout } from 'components/layout' ;
1015import useTimetableFrameList from 'components/TimetablePage/hooks/useTimetableFrameList' ;
1116import DefaultPage from 'components/TimetablePage/MainTimetablePage/DefaultPage' ;
@@ -30,7 +35,7 @@ export async function getServerSideProps(context: GetServerSidePropsContext) {
3035 const year = Number ( query . year ) ;
3136 const term = query . term as Term ;
3237 const frameId = Number ( query . timetableFrameId ) ;
33- const validatedFrameId = Number . isNaN ( frameId ) ? null : frameId ;
38+ const validatedFrameId = isValidTimetableFrameId ( frameId ) ? frameId : null ;
3439
3540 if ( token ) {
3641 try {
@@ -80,24 +85,24 @@ function TimetablePage() {
8085 const { timetableFrameId } = router . query ;
8186 const { data : timetableFrameList } = useTimetableFrameList ( token , semester ) ;
8287 const mainFrame = timetableFrameList . find ( ( frame ) => frame . is_main === true ) ;
83- const [ currentFrameIndex , setCurrentFrameIndex ] = React . useState ( mainFrame ?. id ? mainFrame . id : 0 ) ;
88+ const mainFrameId = isValidTimetableFrameId ( mainFrame ?. id ) ? mainFrame . id : 0 ;
89+ const queryFrameId = typeof timetableFrameId === 'string' ? Number ( timetableFrameId ) : Number . NaN ;
90+ const initialFrameId = isValidTimetableFrameId ( queryFrameId ) ? queryFrameId : mainFrameId ;
91+ const [ currentFrameIndex , setCurrentFrameIndex ] = useState ( initialFrameId ) ;
92+ const resolvedCurrentFrameIndex = timetableFrameList . some ( ( frame ) => frame . id === currentFrameIndex )
93+ ? currentFrameIndex
94+ : initialFrameId ;
8495
85- React . useEffect ( ( ) => {
86- if ( timetableFrameId ) {
87- setCurrentFrameIndex ( Number ( timetableFrameId ) ) ;
88- } else {
89- setCurrentFrameIndex ( mainFrame ?. id ? mainFrame . id : 0 ) ;
90- }
96+ useEffect ( ( ) => {
9197 sessionStorage . setItem ( 'enterTimetablePage' , new Date ( ) . getTime ( ) . toString ( ) ) ;
92- // eslint-disable-next-line react-hooks/exhaustive-deps
9398 } , [ ] ) ;
9499
95100 return (
96101 < div className = { styles . page } >
97102 { ! isMobile ? (
98- < DefaultPage timetableFrameId = { currentFrameIndex } setCurrentFrameId = { setCurrentFrameIndex } />
103+ < DefaultPage timetableFrameId = { resolvedCurrentFrameIndex } setCurrentFrameId = { setCurrentFrameIndex } />
99104 ) : (
100- < MobilePage timetableFrameId = { currentFrameIndex } setCurrentFrameId = { setCurrentFrameIndex } />
105+ < MobilePage timetableFrameId = { resolvedCurrentFrameIndex } setCurrentFrameId = { setCurrentFrameIndex } />
101106 ) }
102107 </ div >
103108 ) ;
0 commit comments