@@ -13,15 +13,19 @@ import CalendarView from "@/components/ui/calendar-view";
1313import EventCard , { type EventInfo } from "@/components/ui/card/event-card" ;
1414import EventCardSkeleton from "@/components/ui/skeleton/event-card-skeleton" ;
1515import { useMediaQuery } from "@/hooks/useMediaQuery" ;
16- import { getEventType } from "@/utils/funcs" ;
16+ import {
17+ classifyEvent ,
18+ EVENT_CATEGORIES ,
19+ type EventCategory ,
20+ } from "@/utils/classifyEvent" ;
1721import { HallEnum } from "@/utils/types" ;
1822
1923const Events = ( ) => {
2024 const [ selectedDiningHall , setSelectedDiningHall ] = useState <
2125 "both" | "anteatery" | "brandywine"
2226 > ( "both" ) ;
2327 const [ selectedEventType , setSelectedEventType ] = useState <
24- "both" | "special" | "celebration"
28+ "both" | EventCategory
2529 > ( "both" ) ;
2630 const [ viewMode , setViewMode ] = useState < "grid" | "calendar" > ( "grid" ) ;
2731 const [ selectedEventData , setSelectedEventData ] = useState < EventInfo | null > (
@@ -39,24 +43,28 @@ const Events = () => {
3943 before : endOfMonth ( currentDate ) ,
4044 } ) ;
4145
42- const sortedEvents =
43- ( events ?. length ?? 0 ) > 0
44- ? [ ...( events ?? [ ] ) ] . sort (
45- ( a : any , b : any ) =>
46- new Date ( a . start ) . getTime ( ) - new Date ( b . start ) . getTime ( ) ,
47- )
48- : [ ] ;
46+ const sortedEvents = ( events ?? [ ] ) . sort (
47+ ( a : any , b : any ) =>
48+ new Date ( a . start ) . getTime ( ) - new Date ( b . start ) . getTime ( ) ,
49+ ) ;
50+
51+ const eventsWithType = sortedEvents . map ( ( event : any ) => ( {
52+ ...event ,
53+ eventType : classifyEvent (
54+ event . title ,
55+ `${ event . shortDescription ?? "" } ${ event . longDescription ?? "" } ` ,
56+ ) ,
57+ } ) ) ;
4958
50- const filteredEvents = sortedEvents . filter ( ( event : any ) => {
59+ const filteredEvents = eventsWithType . filter ( ( event : any ) => {
5160 const matchesDiningHall =
5261 selectedDiningHall === "both" ||
5362 ( selectedDiningHall === "anteatery" &&
5463 event . restaurantId === "anteatery" ) ||
5564 ( selectedDiningHall === "brandywine" &&
5665 event . restaurantId === "brandywine" ) ;
5766 const matchesEventType =
58- selectedEventType === "both" ||
59- getEventType ( event . title ) === selectedEventType ;
67+ selectedEventType === "both" || event . eventType === selectedEventType ;
6068 return matchesDiningHall && matchesEventType ;
6169 } ) ;
6270
@@ -85,6 +93,7 @@ const Events = () => {
8593 ? HallEnum . ANTEATERY
8694 : HallEnum . BRANDYWINE ,
8795 isOngoing : resource . start <= now && resource . end >= now ,
96+ eventType : resource . eventType ,
8897 } ) ;
8998 } ;
9099
@@ -156,7 +165,7 @@ const Events = () => {
156165 < span className = "text-sm font-medium text-slate-900 dark:text-white" >
157166 Event Type
158167 </ span >
159- < div className = "flex gap-3" >
168+ < div className = "flex flex-wrap gap-3" >
160169 < Button
161170 variant = "outlined"
162171 size = "small"
@@ -169,37 +178,32 @@ const Events = () => {
169178 >
170179 All Events
171180 </ Button >
172- < Button
173- variant = "outlined"
174- size = "small"
175- onClick = { ( ) => setSelectedEventType ( "special" ) }
176- className = { `!px-4 !py-1 flex items-center justify-center !normal-case !text-sm !font-thin ${
177- selectedEventType === "special"
178- ? "!bg-sky-700 !text-white !border-sky-700 hover:!bg-sky-800 dark:!bg-blue-300 dark:!text-gray-900 dark:!border-blue-300 dark:hover:!bg-blue-400"
179- : "!bg-white !border-sky-700 !text-slate-900 hover:!bg-sky-50 dark:!bg-transparent dark:!border-blue-300 dark:!text-white dark:hover:!bg-zinc-700"
180- } `}
181- >
182- Special Meals
183- </ Button >
184- < Button
185- variant = "outlined"
186- size = "small"
187- onClick = { ( ) => setSelectedEventType ( "celebration" ) }
188- className = { `!px-4 !py-1 flex items-center justify-center !normal-case !text-sm !font-thin ${
189- selectedEventType === "celebration"
190- ? "!bg-sky-700 !text-white !border-sky-700 hover:!bg-sky-800 dark:!bg-blue-300 dark:!text-gray-900 dark:!border-blue-300 dark:hover:!bg-blue-400"
191- : "!bg-white !border-sky-700 !text-slate-900 hover:!bg-sky-50 dark:!bg-transparent dark:!border-blue-300 dark:!text-white dark:hover:!bg-zinc-700"
192- } `}
193- >
194- Celebration
195- </ Button >
181+ { EVENT_CATEGORIES . map ( ( category ) => {
182+ const isSelected = selectedEventType === category ;
183+
184+ return (
185+ < Button
186+ key = { category }
187+ variant = "outlined"
188+ size = "small"
189+ onClick = { ( ) => setSelectedEventType ( category ) }
190+ className = { `!px-4 !py-1 flex items-center justify-center !normal-case !text-sm !font-thin ${
191+ isSelected
192+ ? "!bg-sky-700 dark:!bg-sky-400 !text-white !border-sky-700 dark:!border-sky-400 hover:!bg-sky-800 dark:hover:!bg-sky-500"
193+ : "!bg-white dark:!bg-zinc-800 !border-sky-700 dark:!border-sky-400 !text-slate-900 dark:!text-zinc-100 hover:!bg-sky-50 dark:hover:!bg-zinc-700"
194+ } `}
195+ >
196+ { category }
197+ </ Button >
198+ ) ;
199+ } ) }
196200 </ div >
197201 </ div >
198202 < div className = "flex flex-col gap-3" >
199203 < span className = "text-sm font-medium text-slate-900 dark:text-white" >
200204 Location
201205 </ span >
202- < div className = "flex gap-3" >
206+ < div className = "flex flex-wrap gap-3" >
203207 < Button
204208 variant = "outlined"
205209 size = "small"
@@ -279,6 +283,7 @@ const Events = () => {
279283 shortDesc = { event . shortDescription }
280284 longDesc = { event . longDescription }
281285 isOngoing = { event . start <= now && event . end >= now }
286+ eventType = { event . eventType }
282287 />
283288 ) ) }
284289 </ div >
0 commit comments