@@ -41,11 +41,9 @@ import SearchFilters from "./SearchFilters";
4141import Calendar from "./Calendar" ;
4242import { Timetable } from "@/utils/type-utils" ;
4343import { useSearchParams } from "react-router-dom" ;
44-
4544type FormContextType = UseFormReturn < z . infer < typeof TimetableFormSchema > > ;
4645export const FormContext = createContext < FormContextType | null > ( null ) ;
4746const SEARCH_LIMIT = 1000 ;
48-
4947/**
5048 * TimetableBuilder Component
5149 *
@@ -81,35 +79,31 @@ const SEARCH_LIMIT = 1000;
8179 *
8280 * @returns {JSX.Element } The rendered timetable builder.
8381 */
84-
8582const TimetableBuilder = ( ) => {
8683 const form = useForm < z . infer < typeof TimetableFormSchema > > ( {
8784 resolver : zodResolver ( TimetableFormSchema ) ,
8885 defaultValues : baseTimetableForm ,
8986 } ) ;
90-
9187 const filterForm = useForm < z . infer < typeof FilterFormSchema > > ( {
9288 resolver : zodResolver ( FilterFormSchema ) ,
9389 } ) ;
94-
9590 const [ queryParams , setQueryParams ] = useSearchParams ( ) ;
9691 const isEditingTimetable = queryParams . has ( "edit" ) ;
9792 const editingTimetableId = queryParams . get ( "edit" ) ;
98-
9993 const selectedCourses = form . watch ( "courses" ) || [ ] ;
10094 const enabledRestrictions = form . watch ( "restrictions" ) || [ ] ;
10195 const searchQuery = form . watch ( "search" ) ;
10296 const debouncedSearchQuery = useDebounceValue ( searchQuery , 250 ) ;
103-
10497 const [ isCustomSettingsOpen , setIsCustomSettingsOpen ] = useState ( false ) ;
10598 const [ filters , setFilters ] = useState < FilterForm | null > ( null ) ;
10699 const [ showFilters , setShowFilters ] = useState ( false ) ;
107- const [ timetableId , setTimetableId ] = useState ( - 1 ) ;
100+ const [ timetableId , setTimetableId ] = useState (
101+ editingTimetableId ? parseInt ( editingTimetableId ) : 0
102+ ) ;
108103
109104 const noSearchAndFilter = ( ) => {
110105 return ! searchQuery && ! filters ;
111106 } ;
112-
113107 // limit search number if no search query or filters for performance purposes.
114108 // Otherwise, limit is 10k, which effectively gets all results.
115109 const { data, isLoading, error, refetch } = useGetCoursesQuery ( {
@@ -118,38 +112,32 @@ const TimetableBuilder = () => {
118112 semester : form . getValues ( "semester" ) ,
119113 ...filters ,
120114 } ) ;
121-
122115 const { data : eventsData , isLoading : eventsLoading } = useGetEventsQuery (
123- timetableId ,
116+ timetableId
124117 ) as {
125118 data : { courseEvents : unknown [ ] ; userEvents : unknown [ ] } ;
126119 isLoading : boolean ;
127120 } ;
128121 const courseEvents = eventsData ?. courseEvents || [ ] ;
129122 const userEvents = eventsData ?. userEvents || [ ] ;
130-
131123 const { data : timetablesData } = useGetTimetablesQuery ( ) as {
132124 data : Timetable [ ] ;
133125 } ;
134126 const timetables = timetablesData || [ ] ;
135-
136127 useEffect ( ( ) => {
137128 if ( searchQuery ) {
138129 refetch ( ) ;
139130 }
140131 } , [ debouncedSearchQuery ] ) ;
141-
142132 const createTimetable = ( values : z . infer < typeof TimetableFormSchema > ) => {
143133 console . log ( values ) ;
144134 // TODO Send request to /api/timetable/create
145135 } ;
146-
147136 const handleReset = ( ) => {
148137 form . reset ( ) ;
149138 filterForm . reset ( ) ;
150139 setFilters ( null ) ;
151140 } ;
152-
153141 const handleRemoveCourse = ( course : {
154142 id : number ;
155143 code : string ;
@@ -159,24 +147,20 @@ const TimetableBuilder = () => {
159147 const newList = currentList . filter ( ( item ) => item . id !== course . id ) ;
160148 form . setValue ( "courses" , newList ) ;
161149 } ;
162-
163150 const handleAddRestriction = ( values : z . infer < typeof RestrictionSchema > ) => {
164151 const currentList = form . getValues ( "restrictions" ) ;
165152 const newList = [ ...currentList , values ] ;
166153 form . setValue ( "restrictions" , newList ) ;
167154 } ;
168-
169155 const handleRemoveRestriction = ( index : number ) => {
170156 const currentList = form . getValues ( "restrictions" ) ;
171157 const newList = currentList . filter ( ( _ , i ) => i !== index ) ;
172158 form . setValue ( "restrictions" , newList ) ;
173159 } ;
174-
175160 const applyFilters = ( values : z . infer < typeof FilterFormSchema > ) => {
176161 setFilters ( values ) ;
177162 console . log ( "Apply filters" , values ) ;
178163 } ;
179-
180164 return (
181165 < >
182166 < div className = "w-full" >
@@ -223,7 +207,6 @@ const TimetableBuilder = () => {
223207 </ div >
224208 < hr />
225209 </ div >
226-
227210 < div className = "m-8 flex gap-12" >
228211 < div className = "w-2/5" >
229212 < Form { ...form } >
@@ -254,7 +237,7 @@ const TimetableBuilder = () => {
254237 < SelectItem key = { value } value = { value } >
255238 { value }
256239 </ SelectItem >
257- ) ,
240+ )
258241 ) }
259242 </ SelectContent >
260243 </ Select >
@@ -263,7 +246,6 @@ const TimetableBuilder = () => {
263246 </ FormItem >
264247 ) }
265248 />
266-
267249 < FormField
268250 control = { form . control }
269251 name = "search"
@@ -310,7 +292,6 @@ const TimetableBuilder = () => {
310292 ) ) }
311293 </ div >
312294 </ div >
313-
314295 < div className = "flex gap-12 items-end" >
315296 < div className = "flex flex-col gap-2" >
316297 < h2 className = "text-lg" > Custom Settings</ h2 >
@@ -328,7 +309,6 @@ const TimetableBuilder = () => {
328309 + Add new
329310 </ Button >
330311 </ div >
331-
332312 < div className = "flex flex-col" >
333313 < p className = "text-sm pb-2" >
334314 Enabled Restrictions: { enabledRestrictions . length }
@@ -357,7 +337,6 @@ const TimetableBuilder = () => {
357337 { restric . numDays } days off
358338 </ p >
359339 ) }
360-
361340 < X
362341 size = { 16 }
363342 className = "hover:text-red-500 cursor-pointer"
@@ -367,7 +346,6 @@ const TimetableBuilder = () => {
367346 ) ) }
368347 </ div >
369348 </ div >
370-
371349 < Button type = "submit" > Generate</ Button >
372350 </ form >
373351 </ FormContext . Provider >
@@ -382,7 +360,6 @@ const TimetableBuilder = () => {
382360 closeHandler = { ( ) => setIsCustomSettingsOpen ( false ) }
383361 />
384362 ) }
385-
386363 { showFilters && (
387364 < SearchFilters
388365 submitHandler = { applyFilters }
@@ -400,5 +377,4 @@ const TimetableBuilder = () => {
400377 </ >
401378 ) ;
402379} ;
403-
404380export default TimetableBuilder ;
0 commit comments