@@ -152,58 +152,54 @@ export const roomRequestBaseSchema = z.object({
152152 . string ( )
153153 . regex ( / ^ ( f a | s p | s u | w i ) \d { 2 } $ / , "Invalid semester provided" ) ,
154154} ) ;
155-
156- export const roomRequestSchema = roomRequestBaseSchema
157- . extend ( {
158- eventStart : z . coerce . date ( {
159- required_error : "Event start date and time is required" ,
160- invalid_type_error : "Event start must be a valid date and time" ,
161- } ) ,
162- eventEnd : z . coerce . date ( {
163- required_error : "Event end date and time is required" ,
164- invalid_type_error : "Event end must be a valid date and time" ,
165- } ) ,
166- theme : z . enum ( eventThemeOptions , {
167- required_error : "Event theme must be provided" ,
168- invalid_type_error : "Event theme must be provided" ,
155+ export const roomRequestDataSchema = roomRequestBaseSchema . extend ( {
156+ eventStart : z . coerce . date ( {
157+ required_error : "Event start date and time is required" ,
158+ invalid_type_error : "Event start must be a valid date and time" ,
159+ } ) ,
160+ eventEnd : z . coerce . date ( {
161+ required_error : "Event end date and time is required" ,
162+ invalid_type_error : "Event end must be a valid date and time" ,
163+ } ) ,
164+ theme : z . enum ( eventThemeOptions , {
165+ required_error : "Event theme must be provided" ,
166+ invalid_type_error : "Event theme must be provided" ,
167+ } ) ,
168+ description : z
169+ . string ( )
170+ . min ( 10 , "Description must have at least 10 words" )
171+ . max ( 1000 , "Description cannot exceed 1000 characters" )
172+ . refine ( ( val ) => val . split ( / \s + / ) . filter ( Boolean ) . length >= 10 , {
173+ message : "Description must have at least 10 words" ,
169174 } ) ,
170- description : z
171- . string ( )
172- . min ( 10 , "Description must have at least 10 words" )
173- . max ( 1000 , "Description cannot exceed 1000 characters" )
174- . refine ( ( val ) => val . split ( / \s + / ) . filter ( Boolean ) . length >= 10 , {
175- message : "Description must have at least 10 words" ,
176- } ) ,
177- // Recurring event fields
178- isRecurring : z . boolean ( ) . default ( false ) ,
179- recurrencePattern : z . enum ( [ "weekly" , "biweekly" , "monthly" ] ) . optional ( ) ,
180- recurrenceEndDate : z . coerce . date ( ) . optional ( ) ,
181- // Setup time fields
182- setupNeeded : z . boolean ( ) . default ( false ) ,
183- setupMinutesBefore : z . number ( ) . min ( 5 ) . max ( 60 ) . optional ( ) ,
184- // Existing fields
185- hostingMinors : z . boolean ( ) ,
186- locationType : z . enum ( [ "in-person" , "virtual" , "both" ] ) ,
187- spaceType : z . optional ( z . string ( ) . min ( 1 ) ) ,
188- specificRoom : z . optional ( z . string ( ) . min ( 1 ) ) ,
189- estimatedAttendees : z . optional ( z . number ( ) . positive ( ) ) ,
190- seatsNeeded : z . optional ( z . number ( ) . positive ( ) ) ,
191- setupDetails : z . string ( ) . min ( 1 ) . nullable ( ) . optional ( ) ,
192- onCampusPartners : z . string ( ) . min ( 1 ) . nullable ( ) ,
193- offCampusPartners : z . string ( ) . min ( 1 ) . nullable ( ) ,
194- nonIllinoisSpeaker : z . string ( ) . min ( 1 ) . nullable ( ) ,
195- nonIllinoisAttendees : z . number ( ) . min ( 1 ) . nullable ( ) ,
196- foodOrDrink : z . boolean ( ) ,
197- crafting : z . boolean ( ) ,
198- comments : z . string ( ) . optional ( ) ,
199- } )
175+ // Recurring event fields
176+ isRecurring : z . boolean ( ) . default ( false ) ,
177+ recurrencePattern : z . enum ( [ "weekly" , "biweekly" , "monthly" ] ) . optional ( ) ,
178+ recurrenceEndDate : z . coerce . date ( ) . optional ( ) ,
179+ // Setup time fields
180+ setupNeeded : z . boolean ( ) . default ( false ) ,
181+ setupMinutesBefore : z . number ( ) . min ( 5 ) . max ( 60 ) . optional ( ) ,
182+ // Existing fields
183+ hostingMinors : z . boolean ( ) ,
184+ locationType : z . enum ( [ "in-person" , "virtual" , "both" ] ) ,
185+ spaceType : z . optional ( z . string ( ) . min ( 1 ) ) ,
186+ specificRoom : z . optional ( z . string ( ) . min ( 1 ) ) ,
187+ estimatedAttendees : z . optional ( z . number ( ) . positive ( ) ) ,
188+ seatsNeeded : z . optional ( z . number ( ) . positive ( ) ) ,
189+ setupDetails : z . string ( ) . min ( 1 ) . nullable ( ) . optional ( ) ,
190+ onCampusPartners : z . string ( ) . min ( 1 ) . nullable ( ) ,
191+ offCampusPartners : z . string ( ) . min ( 1 ) . nullable ( ) ,
192+ nonIllinoisSpeaker : z . string ( ) . min ( 1 ) . nullable ( ) ,
193+ nonIllinoisAttendees : z . number ( ) . min ( 1 ) . nullable ( ) ,
194+ foodOrDrink : z . boolean ( ) ,
195+ crafting : z . boolean ( ) ,
196+ comments : z . string ( ) . optional ( ) ,
197+ } )
198+
199+ export const roomRequestSchema = roomRequestDataSchema
200200 . refine (
201201 ( data ) => {
202- // Check if end time is after start time
203- if ( data . eventStart && data . eventEnd ) {
204- return data . eventEnd > data . eventStart ;
205- }
206- return true ;
202+ return data . eventEnd . getTime ( ) > data . eventStart . getTime ( ) ;
207203 } ,
208204 {
209205 message : "End date/time must be after start date/time" ,
@@ -241,7 +237,7 @@ export const roomRequestSchema = roomRequestBaseSchema
241237 if ( data . isRecurring && data . recurrenceEndDate && data . eventStart ) {
242238 const endDateWithTime = new Date ( data . recurrenceEndDate ) ;
243239 endDateWithTime . setHours ( 23 , 59 , 59 , 999 ) ;
244- return endDateWithTime >= data . eventStart ;
240+ return endDateWithTime . getTime ( ) >= data . eventStart . getTime ( ) ;
245241 }
246242 return true ;
247243 } ,
0 commit comments