@@ -2,11 +2,14 @@ import React from 'react';
22import { useRouter } from 'next/router' ;
33import { useSuspenseQuery } from '@tanstack/react-query' ;
44import { deptQueries } from 'api/dept/queries' ;
5+ import { Lecture , MyLectureInfo } from 'api/timetable/entity' ;
6+ import { isValidTimetableFrameId } from 'api/timetable/queries' ;
57import DownloadIcon from 'assets/svg/download-icon.svg' ;
68import GraduationIcon from 'assets/svg/graduation-icon.svg' ;
79import EditIcon from 'assets/svg/pen-icon.svg' ;
810import Curriculum from 'components/TimetablePage/components/Curriculum' ;
911import Timetable from 'components/TimetablePage/components/Timetable' ;
12+ import TimetableGridPlaceholder from 'components/TimetablePage/components/TimetableGridPlaceholder' ;
1013import TotalGrades from 'components/TimetablePage/components/TotalGrades' ;
1114import useMyLectures from 'components/TimetablePage/hooks/useMyLectures' ;
1215import useSemesterCheck from 'components/TimetablePage/hooks/useMySemester' ;
@@ -20,7 +23,105 @@ import { useSemester } from 'utils/zustand/semester';
2023import DownloadTimetableModal from './DownloadTimetableModal' ;
2124import styles from './MyLectureTimetable.module.scss' ;
2225
23- function MainTimetable ( { timetableFrameId } : { timetableFrameId : number } ) {
26+ interface MainTimetableLayoutProps {
27+ curriculum : React . ReactNode ;
28+ myLectures : Lecture [ ] | MyLectureInfo [ ] | undefined ;
29+ onClickDownloadImage : ( e : React . MouseEvent < HTMLButtonElement > ) => void ;
30+ onClickEdit : ( ) => void ;
31+ onClickGraduation : ( ) => void ;
32+ timetableContent : React . ReactNode ;
33+ footer ?: React . ReactNode ;
34+ }
35+
36+ function MainTimetableLayout ( {
37+ curriculum,
38+ myLectures,
39+ onClickDownloadImage,
40+ onClickEdit,
41+ onClickGraduation,
42+ timetableContent,
43+ footer,
44+ } : MainTimetableLayoutProps ) {
45+ return (
46+ < div className = { styles [ 'page__timetable-wrap' ] } >
47+ < div className = { styles . page__filter } >
48+ < div className = { styles [ 'page__total-grades' ] } >
49+ < TotalGrades myLectureList = { myLectures } />
50+ </ div >
51+ < button type = "button" className = { styles . page__button } onClick = { onClickGraduation } >
52+ < GraduationIcon />
53+ 졸업학점 계산기
54+ </ button >
55+ { curriculum }
56+ < button type = "button" className = { styles . page__button } onClick = { onClickDownloadImage } >
57+ < DownloadIcon />
58+ 이미지 저장
59+ </ button >
60+ < button type = "button" className = { styles . page__button } onClick = { onClickEdit } >
61+ < div className = { styles [ 'page__edit-icon' ] } >
62+ < EditIcon />
63+ </ div >
64+ 시간표 수정
65+ </ button >
66+ </ div >
67+ < div className = { styles . page__timetable } > { timetableContent } </ div >
68+ < div > { footer } </ div >
69+ </ div >
70+ ) ;
71+ }
72+
73+ function InvalidMainTimetable ( ) {
74+ const token = useTokenState ( ) ;
75+ const semester = useSemester ( ) ;
76+ const logger = useLogger ( ) ;
77+ const router = useRouter ( ) ;
78+ const { data : timeTableFrameList } = useTimetableFrameList ( token , semester ) ;
79+ const { data : deptList } = useSuspenseQuery ( deptQueries . list ( ) ) ;
80+ const { data : mySemester } = useSemesterCheck ( token ) ;
81+
82+ const isSemesterAndTimetableExist = ( ) => {
83+ if ( mySemester ?. semesters . length === 0 ) {
84+ toast . error ( '학기가 존재하지 않습니다. 학기를 추가해주세요.' ) ;
85+ return false ;
86+ }
87+
88+ if ( ! timeTableFrameList . some ( ( frame ) => isValidTimetableFrameId ( frame . id ) ) ) {
89+ toast . error ( '시간표가 존재하지 않습니다. 시간표를 추가해주세요.' ) ;
90+ return false ;
91+ }
92+
93+ return true ;
94+ } ;
95+
96+ const onClickDownloadImage = ( e : React . MouseEvent < HTMLButtonElement > ) => {
97+ e . stopPropagation ( ) ;
98+ isSemesterAndTimetableExist ( ) ;
99+ } ;
100+
101+ const onClickEdit = ( ) => {
102+ isSemesterAndTimetableExist ( ) ;
103+ } ;
104+
105+ return (
106+ < MainTimetableLayout
107+ curriculum = { < Curriculum list = { deptList } /> }
108+ myLectures = { [ ] }
109+ onClickDownloadImage = { onClickDownloadImage }
110+ onClickEdit = { onClickEdit }
111+ onClickGraduation = { ( ) => {
112+ router . push ( ROUTES . GraduationCalculator ( ) ) ;
113+ logger . actionEventClick ( {
114+ team : 'USER' ,
115+ event_label : 'graduation_calculator' ,
116+ value : '졸업학점 계산기' ,
117+ } ) ;
118+ } }
119+ timetableContent = { < TimetableGridPlaceholder columnWidth = { 140 } firstColumnWidth = { 70 } rowHeight = { 33 } totalHeight = { 700 } /> }
120+ />
121+ ) ;
122+ }
123+
124+ function ValidMainTimetable ( { timetableFrameId } : { timetableFrameId : number } ) {
24125 const [ isModalOpen , openModal , closeModal ] = useBooleanState ( false ) ;
25126 const token = useTokenState ( ) ;
26127 const semester = useSemester ( ) ;
@@ -37,7 +138,7 @@ function MainTimetable({ timetableFrameId }: { timetableFrameId: number }) {
37138 return false ;
38139 }
39140
40- if ( timeTableFrameList . length === 0 ) {
141+ if ( ! timeTableFrameList . some ( ( frame ) => isValidTimetableFrameId ( frame . id ) ) ) {
41142 toast . error ( '시간표가 존재하지 않습니다. 시간표를 추가해주세요.' ) ;
42143 return false ;
43144 }
@@ -68,50 +169,33 @@ function MainTimetable({ timetableFrameId }: { timetableFrameId: number }) {
68169 } ;
69170
70171 return (
71- < div className = { styles [ 'page__timetable-wrap' ] } >
72- < div className = { styles . page__filter } >
73- < div className = { styles [ 'page__total-grades' ] } >
74- < TotalGrades myLectureList = { myLectures } />
75- </ div >
76- < button
77- type = "button"
78- className = { styles . page__button }
79- onClick = { ( ) => {
80- router . push ( ROUTES . GraduationCalculator ( ) ) ;
81- logger . actionEventClick ( {
82- team : 'USER' ,
83- event_label : 'graduation_calculator' ,
84- value : '졸업학점 계산기' ,
85- } ) ;
86- } }
87- >
88- < GraduationIcon />
89- 졸업학점 계산기
90- </ button >
91- < Curriculum list = { deptList } />
92- < button type = "button" className = { styles . page__button } onClick = { onClickDownloadImage } >
93- < DownloadIcon />
94- 이미지 저장
95- </ button >
96- < button type = "button" className = { styles . page__button } onClick = { onClickEdit } >
97- < div className = { styles [ 'page__edit-icon' ] } >
98- < EditIcon />
99- </ div >
100- 시간표 수정
101- </ button >
102- </ div >
103- < div className = { styles . page__timetable } >
104- < Timetable
105- timetableFrameId = { timetableFrameId }
106- columnWidth = { 140 }
107- firstColumnWidth = { 70 }
108- rowHeight = { 33 }
109- totalHeight = { 700 }
110- />
111- </ div >
112- < div > { isModalOpen && < DownloadTimetableModal onClose = { closeModal } timetableFrameId = { timetableFrameId } /> } </ div >
113- </ div >
172+ < MainTimetableLayout
173+ curriculum = { < Curriculum list = { deptList } /> }
174+ myLectures = { myLectures }
175+ onClickDownloadImage = { onClickDownloadImage }
176+ onClickEdit = { onClickEdit }
177+ onClickGraduation = { ( ) => {
178+ router . push ( ROUTES . GraduationCalculator ( ) ) ;
179+ logger . actionEventClick ( {
180+ team : 'USER' ,
181+ event_label : 'graduation_calculator' ,
182+ value : '졸업학점 계산기' ,
183+ } ) ;
184+ } }
185+ timetableContent = {
186+ < Timetable timetableFrameId = { timetableFrameId } columnWidth = { 140 } firstColumnWidth = { 70 } rowHeight = { 33 } totalHeight = { 700 } />
187+ }
188+ footer = { isModalOpen && < DownloadTimetableModal onClose = { closeModal } timetableFrameId = { timetableFrameId } /> }
189+ />
114190 ) ;
115191}
116192
193+ function MainTimetable ( { timetableFrameId } : { timetableFrameId : number } ) {
194+ if ( ! isValidTimetableFrameId ( timetableFrameId ) ) {
195+ return < InvalidMainTimetable /> ;
196+ }
197+
198+ return < ValidMainTimetable timetableFrameId = { timetableFrameId } /> ;
199+ }
200+
117201export default MainTimetable ;
0 commit comments