11import type { GetServerSidePropsContext , InferGetServerSidePropsType } from 'next' ;
22import { isKoinError } from '@bcsdlab/koin' ;
33import { dehydrate , QueryClient } from '@tanstack/react-query' ;
4- import { club , articles as articlesApi , banner , timetable } from 'api' ;
5- import { getLostItemStat } from 'api/articles ' ;
6- import { getBannerCategoryList } from 'api/banner ' ;
4+ import { getArticles , getLostItemStat } from 'api/articles ' ;
5+ import { getBannerCategoryList , getBanners } from 'api/banner ' ;
6+ import { getHotClub } from 'api/club ' ;
77import { HotClubResponse } from 'api/club/entity' ;
88import { getStoreCategories } from 'api/store' ;
9+ import { getMySemester , getSemesterInfoList , getTimetableFrame , getTimetableLectureInfo } from 'api/timetable' ;
910import IndexArticles from 'components/IndexComponents/IndexArticles' ;
1011import IndexBus from 'components/IndexComponents/IndexBus' ;
1112import IndexCafeteria from 'components/IndexComponents/IndexCafeteria' ;
@@ -22,11 +23,13 @@ import Banner from 'components/ui/Banner';
2223import UserInfoModal from 'components/ui/UserInfoModal' ;
2324import { COOKIE_KEY } from 'static/url' ;
2425import { getRecentSemester } from 'utils/timetable/semester' ;
26+ import { parseServerSideParams } from 'utils/ts/parseServerSideParams' ;
27+ import { clearServerAuthCookies , isServerAuthError } from 'utils/ts/ssrAuth' ;
2528import styles from './IndexPage.module.scss' ;
2629
27- const getHotClub = async ( ) => {
30+ const getHotClubData = async ( ) => {
2831 try {
29- return await club . getHotClub ( ) ;
32+ return await getHotClub ( ) ;
3033 } catch ( e ) {
3134 if ( isKoinError ( e ) && e . status === 404 ) {
3235 return {
@@ -41,28 +44,44 @@ const getHotClub = async () => {
4144
4245export const getServerSideProps = async ( context : GetServerSidePropsContext ) => {
4346 const queryClient = new QueryClient ( ) ;
44- const token = context . req . cookies [ COOKIE_KEY . AUTH_TOKEN ] || '' ;
45- const userType = context . req . cookies [ COOKIE_KEY . AUTH_USER_TYPE ] || '' ;
47+ let token = parseServerSideParams ( context ) . token ?? '' ;
48+ let userType = context . req . cookies [ COOKIE_KEY . AUTH_USER_TYPE ] || '' ;
49+
50+ const resetAuthContext = ( ) => {
51+ token = '' ;
52+ userType = '' ;
53+ clearServerAuthCookies ( context ) ;
54+ } ;
55+
56+ const fetchMySemester = async ( ) => {
57+ if ( ! token || userType !== 'STUDENT' ) return null ;
58+
59+ try {
60+ return await queryClient . fetchQuery ( {
61+ queryKey : [ MY_SEMESTER_INFO_KEY ] ,
62+ queryFn : ( ) => getMySemester ( token ) ,
63+ } ) ;
64+ } catch ( error ) {
65+ if ( isServerAuthError ( error ) ) {
66+ resetAuthContext ( ) ;
67+ return null ;
68+ }
69+ if ( isKoinError ( error ) && error . status === 403 ) {
70+ return null ;
71+ }
72+ throw error ;
73+ }
74+ } ;
4675
4776 const [ [ banners , categories , hotClubInfo , mySemester ] ] = await Promise . all ( [
48- Promise . all ( [
49- getBannerCategoryList ( ) ,
50- getStoreCategories ( ) ,
51- getHotClub ( ) ,
52- token && userType === 'STUDENT'
53- ? queryClient . fetchQuery ( {
54- queryKey : [ MY_SEMESTER_INFO_KEY ] ,
55- queryFn : ( ) => timetable . getMySemester ( token ) ,
56- } )
57- : null ,
58- ] ) ,
77+ Promise . all ( [ getBannerCategoryList ( ) , getStoreCategories ( ) , getHotClubData ( ) , fetchMySemester ( ) ] ) ,
5978 queryClient . prefetchQuery ( {
6079 queryKey : [ 'articles' , '1' ] ,
61- queryFn : ( ) => articlesApi . getArticles ( token , '1' ) ,
80+ queryFn : ( ) => getArticles ( token , '1' ) ,
6281 } ) ,
6382 queryClient . prefetchQuery ( {
6483 queryKey : [ SEMESTER_INFO_KEY ] ,
65- queryFn : timetable . getSemesterInfoList ,
84+ queryFn : getSemesterInfoList ,
6685 } ) ,
6786 queryClient . prefetchQuery ( {
6887 queryKey : [ 'lostItemStat' ] ,
@@ -73,23 +92,30 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) =>
7392 const userSemester = mySemester ?. semesters ?. [ 0 ] || getRecentSemester ( ) ;
7493
7594 const bannerCategoryId = Number ( banners . banner_categories [ 0 ] . id ) ;
76- const bannersList = await banner . getBanners ( bannerCategoryId ) ;
95+ const bannersList = await getBanners ( bannerCategoryId ) ;
7796 const isBannerOpen =
7897 context . req . cookies [ 'HIDE_BANNER' ] !== `modal_category_${ bannerCategoryId } ` && bannersList . count !== 0 ;
7998
80- let mainFrameId : number | null = null ;
8199 if ( token && userType === 'STUDENT' ) {
82- const timetableFrameList = await queryClient . fetchQuery ( {
83- queryKey : [ TIMETABLE_FRAME_KEY + userSemester . year + userSemester . term ] ,
84- queryFn : ( ) => timetable . getTimetableFrame ( token , userSemester ) ,
85- } ) ;
86- const mainFrame = timetableFrameList . find ( ( frame ) => frame . is_main ) ;
87- mainFrameId = mainFrame ?. id ?? null ;
88- if ( mainFrameId !== null ) {
89- await queryClient . prefetchQuery ( {
90- queryKey : [ TIMETABLE_INFO_LIST , mainFrameId ] ,
91- queryFn : ( ) => timetable . getTimetableLectureInfo ( token , mainFrameId ! ) ,
100+ try {
101+ const timetableFrameList = await queryClient . fetchQuery ( {
102+ queryKey : [ TIMETABLE_FRAME_KEY + userSemester . year + userSemester . term ] ,
103+ queryFn : ( ) => getTimetableFrame ( token , userSemester ) ,
92104 } ) ;
105+ const mainFrame = timetableFrameList . find ( ( frame ) => frame . is_main ) ;
106+ const activeMainFrameId = mainFrame ?. id ;
107+ if ( typeof activeMainFrameId === 'number' ) {
108+ await queryClient . prefetchQuery ( {
109+ queryKey : [ TIMETABLE_INFO_LIST , activeMainFrameId ] ,
110+ queryFn : ( ) => getTimetableLectureInfo ( token , activeMainFrameId ) ,
111+ } ) ;
112+ }
113+ } catch ( error ) {
114+ if ( isServerAuthError ( error ) ) {
115+ resetAuthContext ( ) ;
116+ } else if ( ! ( isKoinError ( error ) && error . status === 403 ) ) {
117+ throw error ;
118+ }
93119 }
94120 }
95121
0 commit comments