Skip to content

Commit 02e5dc9

Browse files
committed
fix timetable frame fallback
1 parent 44eeab9 commit 02e5dc9

3 files changed

Lines changed: 27 additions & 15 deletions

File tree

src/api/timetable/queries.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ type FrameListQueryParams = {
3131
const canUseStudentTimetableQuery = (token: string, userType?: TimetableUserType) =>
3232
Boolean(token) && (!userType || userType === 'STUDENT');
3333

34+
export const isValidTimetableFrameId = (timetableFrameId: number | null | undefined): timetableFrameId is number =>
35+
typeof timetableFrameId === 'number' && Number.isInteger(timetableFrameId) && timetableFrameId > 0;
36+
3437
export const createDefaultTimetableFrameList = (): TimetableFrameListResponse => [
3538
{
3639
id: null,
@@ -92,7 +95,10 @@ export const timetableQueries = {
9295
lectureInfo: (authorization: string, timetableFrameId: number) =>
9396
queryOptions({
9497
queryKey: timetableQueryKeys.lectureInfo(timetableFrameId),
95-
queryFn: () => (authorization ? getTimetableLectureInfo(authorization, timetableFrameId) : null),
98+
queryFn: () =>
99+
authorization && isValidTimetableFrameId(timetableFrameId)
100+
? getTimetableLectureInfo(authorization, timetableFrameId)
101+
: null,
96102
}),
97103

98104
allLectures: (token: string) =>

src/components/TimetablePage/components/MainTimetable/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React from 'react';
22
import { useRouter } from 'next/router';
33
import { useSuspenseQuery } from '@tanstack/react-query';
44
import { deptQueries } from 'api/dept/queries';
5+
import { isValidTimetableFrameId } from 'api/timetable/queries';
56
import DownloadIcon from 'assets/svg/download-icon.svg';
67
import GraduationIcon from 'assets/svg/graduation-icon.svg';
78
import EditIcon from 'assets/svg/pen-icon.svg';
@@ -37,7 +38,7 @@ function MainTimetable({ timetableFrameId }: { timetableFrameId: number }) {
3738
return false;
3839
}
3940

40-
if (timeTableFrameList.length === 0) {
41+
if (!timeTableFrameList.some((frame) => isValidTimetableFrameId(frame.id))) {
4142
toast.error('시간표가 존재하지 않습니다. 시간표를 추가해주세요.');
4243
return false;
4344
}

src/pages/timetable/index.tsx

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
1-
import React from 'react';
1+
import { useEffect, useState } from 'react';
22
import type { GetServerSidePropsContext } from 'next';
33
import dynamic from 'next/dynamic';
44
import { useRouter } from 'next/router';
55
import { isKoinError } from '@bcsdlab/koin';
66
import { dehydrate, QueryClient } from '@tanstack/react-query';
77
import { 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';
914
import { SSRLayout } from 'components/layout';
1015
import useTimetableFrameList from 'components/TimetablePage/hooks/useTimetableFrameList';
1116
import 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

Comments
 (0)