@@ -29,7 +29,7 @@ import {
2929 useGetTimetablesQuery ,
3030 useCreateTimetableMutation ,
3131} from "@/api/timetableApiSlice" ;
32- import { useCreateRestrictionMutation } from "@/api/restrictionsApiSlice" ;
32+ import { useGetRestrictionsQuery , useCreateRestrictionMutation , useDeleteRestrictionMutation } from "@/api/restrictionsApiSlice" ;
3333import { z } from "zod" ;
3434import React , { useEffect , useRef } from "react" ;
3535import { useGetNumberOfCourseSectionsQuery } from "@/api/coursesApiSlice" ;
@@ -40,14 +40,15 @@ import {
4040} from "@/api/eventsApiSlice" ;
4141import { useGetOfferingEventsQuery } from "@/api/offeringsApiSlice" ;
4242import { useNavigate , useSearchParams } from "react-router-dom" ;
43- import { Event , Timetable , TimetableEvents } from "@/utils/type-utils" ;
43+ import { Event , Timetable , TimetableEvents , Restriction } from "@/utils/type-utils" ;
4444import { TimetableForm } from "@/models/timetable-form" ;
4545import { getSemesterStartAndEndDates } from "@/utils/semester-utils" ;
4646
4747interface CalendarProps {
4848 semester : string ;
4949 selectedCourses : TimetableForm [ "courses" ] ;
5050 newOfferingIds : number [ ] ;
51+ restrictions : TimetableForm [ "restrictions" ] ;
5152}
5253
5354function parseEvent ( id : number , event : Event , calendarId : string ) {
@@ -71,7 +72,7 @@ function parseEvent(id: number, event: Event, calendarId: string) {
7172}
7273
7374const Calendar = React . memo < CalendarProps > (
74- ( { semester, selectedCourses, newOfferingIds } ) => {
75+ ( { semester, selectedCourses, newOfferingIds, restrictions } ) => {
7576 const form = useForm < z . infer < typeof TimetableFormSchema > > ( ) ;
7677
7778 const navigate = useNavigate ( ) ;
@@ -83,6 +84,7 @@ const Calendar = React.memo<CalendarProps>(
8384 const [ createEvent ] = useCreateEventMutation ( ) ;
8485 const [ deleteEvent ] = useDeleteEventMutation ( ) ;
8586 const [ createRestriction ] = useCreateRestrictionMutation ( ) ;
87+ const [ deleteRestriction ] = useDeleteRestrictionMutation ( ) ;
8688
8789 const semesterStartDate = getSemesterStartAndEndDates ( semester ) . start ;
8890 const semesterEndDate = getSemesterStartAndEndDates ( semester ) . end ;
@@ -139,17 +141,26 @@ const Calendar = React.memo<CalendarProps>(
139141 } ,
140142 } ) ;
141143
142- const { data : oldTimetableEvents } = useGetEventsQuery ( editingTimetableId , {
144+ const { data : timetableEvents } = useGetEventsQuery ( editingTimetableId , {
143145 skip : ! isEditingTimetable ,
144146 } ) as {
145147 data : TimetableEvents ;
146148 } ;
149+
147150 const oldOfferingIds = [
148151 ...new Set (
149- oldTimetableEvents ?. courseEvents . map ( ( event ) => event . offering_id ) ,
152+ timetableEvents ?. courseEvents . map ( ( event ) => event . offering_id ) ,
150153 ) ,
151154 ] . sort ( ( a , b ) => a - b ) ;
152155
156+ const { data : restrictionsData } = useGetRestrictionsQuery ( editingTimetableId , {
157+ skip : ! isEditingTimetable ,
158+ } ) as {
159+ data : Restriction [ ] ;
160+ } ;
161+
162+ const oldRestrictions = restrictionsData ?? [ ] ;
163+
153164 const timetableTitleRef = useRef < HTMLInputElement > ( null ) ;
154165 const selectedCourseIds = selectedCourses . map ( ( course ) => course . id ) ;
155166
@@ -204,7 +215,6 @@ const Calendar = React.memo<CalendarProps>(
204215 }
205216
206217 // Create restrictions for the newly created timetable
207- const restrictions = form . getValues ( "restrictions" ) ?? [ ] ;
208218 for ( const restriction of restrictions ) {
209219 const restrictionObject = {
210220 calendar_id : newTimetableId ,
@@ -259,8 +269,38 @@ const Calendar = React.memo<CalendarProps>(
259269 console . error ( createError ) ;
260270 }
261271 }
272+
262273 form . setValue ( "offeringIds" , newOfferingIds ) ;
263274
275+ // Delete restrictions
276+ for ( const restriction of oldRestrictions ) {
277+ const { error : deleteError } = await deleteRestriction ( {
278+ id : restriction . id ,
279+ calendar_id : editingTimetableId ,
280+ } ) ;
281+ if ( deleteError ) {
282+ console . error ( deleteError ) ;
283+ }
284+ }
285+
286+ // Create restrictions
287+ for ( const restriction of restrictions ) {
288+ const restrictionObject = {
289+ calendar_id : editingTimetableId ,
290+ type : restriction . type ,
291+ days : restriction . days ,
292+ start_time : restriction . startTime ,
293+ end_time : restriction . endTime ,
294+ disabled : restriction . disabled ,
295+ num_days : restriction . numDays ,
296+ } ;
297+ const { error : restrictionError } =
298+ await createRestriction ( restrictionObject ) ;
299+ if ( restrictionError ) {
300+ console . error ( restrictionError ) ;
301+ }
302+ }
303+
264304 navigate ( "/home" ) ;
265305 } ;
266306
0 commit comments