@@ -23,29 +23,28 @@ import {
2323} from "@/components/ui/dialog" ;
2424import { Input } from "@/components/ui/input" ;
2525import { Label } from "@/components/ui/label" ;
26- import { UseFormReturn } from "react-hook-form" ;
26+ import { useForm } from "react-hook-form" ;
2727import { TimetableFormSchema } from "@/models/timetable-form" ;
28- import { useCreateTimetableMutation } from "@/api/timetableApiSlice" ;
28+ import { useGetTimetablesQuery , useCreateTimetableMutation } from "@/api/timetableApiSlice" ;
2929import { useCreateRestrictionMutation } from "@/api/restrictionsApiSlice" ;
3030import { z } from "zod" ;
31- import { useEffect , useState } from "react" ;
31+ import React , { useEffect , useRef } from "react" ;
3232import { useGetNumberOfCourseSectionsQuery } from "@/api/coursesApiSlice" ;
3333import {
3434 useCreateEventMutation ,
3535 useGetEventsQuery ,
36- useUpdateEventMutation ,
3736 useDeleteEventMutation ,
3837} from "@/api/eventsApiSlice" ;
3938import { useGetOfferingEventsQuery } from "@/api/offeringsApiSlice" ;
4039import { useNavigate , useSearchParams } from "react-router-dom" ;
4140import { Event , Timetable , TimetableEvents } from "@/utils/type-utils" ;
41+ import { TimetableForm } from "@/models/timetable-form" ;
42+ import { getSemesterStartAndEndDates } from "@/utils/semester-utils" ;
4243
4344interface CalendarProps {
44- timetablesData : Timetable [ ] ;
45- semesterStartDate : string ;
46- semesterEndDate : string ;
47- userEvents : Event [ ] ;
48- form : UseFormReturn < z . infer < typeof TimetableFormSchema > > ;
45+ semester : string ;
46+ selectedCourses : TimetableForm [ "courses" ] ;
47+ newOfferingIds : number [ ] ;
4948}
5049
5150function parseEvent ( id : number , event : Event , calendarId : string ) {
@@ -68,31 +67,38 @@ function parseEvent(id: number, event: Event, calendarId: string) {
6867 } ;
6968}
7069
71- function Calendar ( {
72- timetablesData ,
73- semesterStartDate ,
74- semesterEndDate ,
75- userEvents ,
76- form,
77- } : CalendarProps ) {
70+ const Calendar = React . memo < CalendarProps > ( ( {
71+ semester ,
72+ selectedCourses ,
73+ newOfferingIds ,
74+ } ) => {
75+ const form = useForm < z . infer < typeof TimetableFormSchema > > ( ) ;
76+
7877 const navigate = useNavigate ( ) ;
7978 const [ queryParams ] = useSearchParams ( ) ;
8079 const isEditingTimetable = queryParams . has ( "edit" ) ;
8180 const editingTimetableId = parseInt ( queryParams . get ( "edit" ) ?? "0" ) ;
82- const newOfferingIds = form . watch ( "offeringIds" ) ?? [ ] ;
8381
8482 const [ createTimetable ] = useCreateTimetableMutation ( ) ;
8583 const [ createEvent ] = useCreateEventMutation ( ) ;
86- const [ updateEvent ] = useUpdateEventMutation ( ) ;
8784 const [ deleteEvent ] = useDeleteEventMutation ( ) ;
8885 const [ createRestriction ] = useCreateRestrictionMutation ( ) ;
8986
87+ const semesterStartDate = getSemesterStartAndEndDates ( semester ) . start ;
88+ const semesterEndDate = getSemesterStartAndEndDates ( semester ) . end ;
89+
9090 const { data : courseEventsData } = useGetOfferingEventsQuery ( {
9191 offering_ids : newOfferingIds . join ( "," ) ,
9292 semester_start_date : semesterStartDate ,
9393 semester_end_date : semesterEndDate ,
9494 } ) as { data : Event [ ] } ;
95+
96+ const { data : timetablesData } = useGetTimetablesQuery ( ) as {
97+ data : Timetable [ ] ;
98+ } ;
99+
95100 const courseEvents = courseEventsData ?? [ ] ;
101+ const userEvents : Event [ ] = [ ] ;
96102
97103 let index = 1 ;
98104 const courseEventsParsed = courseEvents . map ( ( event ) =>
@@ -109,6 +115,7 @@ function Calendar({
109115 createViewMonthGrid ( ) ,
110116 createViewMonthAgenda ( ) ,
111117 ] ,
118+ selectedDate : semesterStartDate ,
112119 defaultView : viewWeek . name ,
113120 events : [ ...courseEventsParsed , ...userEventsParsed ] ,
114121 calendars : {
@@ -143,15 +150,14 @@ function Calendar({
143150 ) ,
144151 ] . sort ( ( a , b ) => a - b ) ;
145152
146- const semester = form . watch ( "semester" ) ?? "" ;
147- const [ timetableTitle , setTimetableTitle ] = useState ( "" ) ;
148-
149- const selectedCourses = form . watch ( "courses" ) ?? [ ] ;
153+ const timetableTitleRef = useRef < HTMLInputElement > ( null ) ;
150154 const selectedCourseIds = selectedCourses . map ( ( course ) => course . id ) ;
155+
151156 const { data : numberOfSectionsData } = useGetNumberOfCourseSectionsQuery ( {
152157 course_ids : selectedCourseIds . join ( "," ) ,
153158 semester : semester ,
154159 } ) ;
160+
155161 const totalNumberOfSections =
156162 numberOfSectionsData ?. totalNumberOfCourseSections ?? 0 ;
157163
@@ -162,13 +168,11 @@ function Calendar({
162168 if ( ! isEditingTimetable ) {
163169 return ;
164170 }
165- setTimetableTitle (
166- timetablesData ?. find ( ( timetable ) => timetable . id === editingTimetableId )
167- ?. timetable_title ?? "" ,
168- ) ;
169- } , [ timetablesData , editingTimetableId , timetableTitle , isEditingTimetable ] ) ;
171+ } , [ timetablesData , editingTimetableId , isEditingTimetable ] ) ;
170172
171173 const handleCreate = async ( ) => {
174+ const timetableTitle = timetableTitleRef . current ?. value ?? "" ;
175+
172176 // Create timetable
173177 const { data, error } = await createTimetable ( {
174178 timetable_title : timetableTitle ,
@@ -249,8 +253,9 @@ function Calendar({
249253 console . error ( createError ) ;
250254 }
251255 }
252-
253256 form . setValue ( "offeringIds" , newOfferingIds ) ;
257+
258+ navigate ( "/home" ) ;
254259 } ;
255260
256261 return (
@@ -281,7 +286,7 @@ function Calendar({
281286 < Input
282287 id = "timetableName"
283288 placeholder = "Placeholder name"
284- onChange = { ( e ) => setTimetableTitle ( e . target . value . trim ( ) ) }
289+ ref = { timetableTitleRef }
285290 />
286291 < DialogFooter >
287292 < DialogClose asChild >
@@ -290,7 +295,7 @@ function Calendar({
290295 < DialogClose asChild >
291296 < Button
292297 onClick = { handleCreate }
293- disabled = { timetableTitle === "" }
298+ disabled = { timetableTitleRef . current ?. value === "" }
294299 >
295300 Save
296301 </ Button >
@@ -319,6 +324,6 @@ function Calendar({
319324 < ScheduleXCalendar calendarApp = { calendar } />
320325 </ div >
321326 ) ;
322- }
327+ } ) ;
323328
324329export default Calendar ;
0 commit comments