|
1 | | -import { z } from "zod"; |
2 | | -import { OrganizationList } from "../orgs"; |
3 | | - |
4 | | -export const roomRequestPostSchema = z.object({ |
5 | | - organization: z.enum(OrganizationList), |
6 | | - name: z.string().min(1), |
7 | | - description: z.string().min(1), |
8 | | - start: z.number().min(0), |
9 | | - end: z.number().min(0).max(604800), |
| 1 | +import { z } from 'zod'; |
| 2 | +import { OrganizationList } from '../orgs.js'; |
| 3 | + |
| 4 | +export const eventThemeOptions = [ |
| 5 | + "Arts & Music", |
| 6 | + "Athletics", |
| 7 | + "Cultural", |
| 8 | + "Fundraising", |
| 9 | + "Group Business", |
| 10 | + "Learning", |
| 11 | + "Service", |
| 12 | + "Social", |
| 13 | + "Spirituality" |
| 14 | +] as [string, ...string[]]; |
| 15 | + |
| 16 | +export const spaceTypeOptions = [ |
| 17 | + { value: "campus_classroom", label: "Campus Classroom" }, |
| 18 | + { value: "campus_performance", label: "Campus Performance Space *" }, |
| 19 | + { value: "bif", label: "Business Instructional Facility (BIF)" }, |
| 20 | + { value: "campus_rec", label: "Campus Rec (ARC, CRCE, Ice Arena, Illini Grove) *" }, |
| 21 | + { value: "illini_union", label: "Illini Union *" }, |
| 22 | + { value: "stock_pavilion", label: "Stock Pavilion" } |
| 23 | +]; |
| 24 | + |
| 25 | + |
| 26 | +export enum RoomRequestStatus { |
| 27 | + CREATED = "created", |
| 28 | + REJECTED_BY_ACM = "rejected_by_acm", |
| 29 | + SUBMITTED = "submitted", |
| 30 | + APPROVED = "approved", |
| 31 | + REJECTED_BY_UIUC = "rejected_by_uiuc" |
| 32 | +} |
| 33 | + |
| 34 | +export const roomRequestSchema = z.object({ |
| 35 | + host: z.enum(OrganizationList), |
| 36 | + title: z.string().min(2, "Title must have at least 2 characters"), |
| 37 | + theme: z.enum(eventThemeOptions), |
| 38 | + description: z.string() |
| 39 | + .min(10, "Description must have at least 10 words") |
| 40 | + .max(1000, "Description cannot exceed 1000 characters") |
| 41 | + .refine(val => val.split(/\s+/).filter(Boolean).length >= 10, { |
| 42 | + message: "Description must have at least 10 words" |
| 43 | + }), |
| 44 | + hostingMinors: z.boolean().nullable().optional(), |
| 45 | + locationType: z.enum(['in-person', 'virtual', 'both']), |
| 46 | + spaceType: z.string().optional(), |
| 47 | + specificRoom: z.string().optional(), |
| 48 | + estimatedAttendees: z.number().positive().optional(), |
| 49 | + seatsNeeded: z.number().positive().optional(), |
| 50 | + setupDetails: z.string().nullable().optional(), |
| 51 | + onCampusPartners: z.string().nullable().optional(), |
| 52 | + offCampusPartners: z.string().nullable().optional(), |
| 53 | + nonIllinoisSpeaker: z.string().nullable().optional(), |
| 54 | + nonIllinoisAttendees: z.number().nullable().optional(), |
| 55 | + foodOrDrink: z.boolean().nullable().optional(), |
| 56 | + crafting: z.boolean().nullable().optional(), |
| 57 | + comments: z.string().optional(), |
10 | 58 | }); |
11 | 59 |
|
12 | | -export type RoomRequestPostRequest = z.infer<typeof roomRequestPostSchema>; |
| 60 | +export type RoomRequestFormValues = z.infer<typeof roomRequestSchema>; |
| 61 | + |
| 62 | +export const roomRequestPostResponse = z.object({ |
| 63 | + id: z.string().uuid(), |
| 64 | + status: z.literal(RoomRequestStatus.CREATED), |
| 65 | +}) |
| 66 | + |
| 67 | +export type RoomRequestPostResponse = z.infer<typeof roomRequestPostResponse>; |
0 commit comments