@@ -152,58 +152,67 @@ 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+   } ) . transform ( ( date )  =>  { 
160+     const  d  =  new  Date ( date ) ; 
161+     d . setSeconds ( 0 ,  0 ) ; 
162+     return  d ; 
163+   } ) , 
164+   eventEnd : z . coerce . date ( { 
165+     required_error : "Event end date and time is required" , 
166+     invalid_type_error : "Event end must be a valid date and time" , 
167+   } ) . transform ( ( date )  =>  { 
168+     const  d  =  new  Date ( date ) ; 
169+     d . setSeconds ( 0 ,  0 ) ; 
170+     return  d ; 
171+   } ) , 
172+   theme : z . enum ( eventThemeOptions ,  { 
173+     required_error : "Event theme must be provided" , 
174+     invalid_type_error : "Event theme must be provided" , 
175+   } ) , 
176+   description : z 
177+     . string ( ) 
178+     . min ( 10 ,  "Description must have at least 10 words" ) 
179+     . max ( 1000 ,  "Description cannot exceed 1000 characters" ) 
180+     . refine ( ( val )  =>  val . split ( / \s + / ) . filter ( Boolean ) . length  >=  10 ,  { 
181+       message : "Description must have at least 10 words" , 
169182    } ) , 
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-    } ) 
183+   // Recurring event fields 
184+   isRecurring :  z . boolean ( ) . default ( false ) , 
185+   recurrencePattern :  z . enum ( [ "weekly" ,  "biweekly"  ,   "monthly" ] ) . optional ( ) , 
186+   recurrenceEndDate :  z . coerce . date ( ) . optional ( ) . transform ( ( date )   =>   { 
187+     if   ( ! date )   {   return   date ;   } 
188+     const   d   =   new   Date ( date ) ; 
189+     d . setSeconds ( 0 ,   0 ) ; 
190+     return   d ; 
191+   } ) , 
192+   // Setup time fields 
193+   setupNeeded : z . boolean ( ) . default ( false ) , 
194+   setupMinutesBefore :  z . number ( ) . min ( 5 ) . max ( 60 ) . optional ( ) , 
195+   // Existing fields 
196+   hostingMinors : z . boolean ( ) , 
197+   locationType :  z . enum ( [ "in-person" ,   "virtual" ,   "both" ] ) , 
198+   spaceType : z . optional ( z . string ( ) . min ( 1 ) ) , 
199+   specificRoom : z . optional ( z . string ( ) . min ( 1 ) ) , 
200+   estimatedAttendees : z . optional ( z . number ( ) . positive ( ) ) , 
201+   seatsNeeded : z . optional ( z . number ( ) . positive ( ) ) , 
202+   setupDetails : z . string ( ) . min ( 1 ) . nullable ( ) . optional ( ) , 
203+   onCampusPartners : z . string ( ) . min ( 1 ) . nullable ( ) , 
204+   offCampusPartners : z . string ( ) . min ( 1 ) . nullable ( ) , 
205+   nonIllinoisSpeaker : z . string ( ) . min ( 1 ) . nullable ( ) , 
206+   nonIllinoisAttendees : z . number ( ) . min ( 1 ) . nullable ( ) , 
207+   foodOrDrink : z . boolean ( ) , 
208+   crafting : z . boolean ( ) , 
209+   comments : z . string ( ) . optional ( ) , 
210+ } ) 
211+ 
212+ export   const   roomRequestSchema   =   roomRequestDataSchema 
200213  . refine ( 
201214    ( 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 ; 
215+       return  data . eventEnd  >  data . eventStart ; 
207216    } , 
208217    { 
209218      message : "End date/time must be after start date/time" , 
@@ -241,7 +250,7 @@ export const roomRequestSchema = roomRequestBaseSchema
241250      if  ( data . isRecurring  &&  data . recurrenceEndDate  &&  data . eventStart )  { 
242251        const  endDateWithTime  =  new  Date ( data . recurrenceEndDate ) ; 
243252        endDateWithTime . setHours ( 23 ,  59 ,  59 ,  999 ) ; 
244-         return  endDateWithTime  >=  data . eventStart ; 
253+         return  endDateWithTime . getTime ( )  >=  data . eventStart . getTime ( ) ; 
245254      } 
246255      return  true ; 
247256    } , 
0 commit comments