diff --git a/src/routes/discover/+page.svelte b/src/routes/discover/+page.svelte index 66d4d2d..5b16181 100644 --- a/src/routes/discover/+page.svelte +++ b/src/routes/discover/+page.svelte @@ -9,6 +9,8 @@ let error = ''; let searchQuery = ''; let selectedEventType: EventType | 'all' = 'all'; + let selectedTimeFilter: 'any' | 'next-week' | 'next-month' = 'any'; + let selectedSortOrder: 'asc' | 'desc' = 'asc'; let fuse: Fuse; export let data: PageData; @@ -26,7 +28,29 @@ includeMatches: true }); - // Filter events based on search query and event type using Fuse.js + // Helper function to check if an event is within a time range + function isEventInTimeRange(event: Event, timeFilter: string): boolean { + if (timeFilter === 'any') return true; + + const eventDate = new Date(`${event.date}T${event.time}`); + const now = new Date(); + + if (timeFilter === 'next-week') { + const nextWeek = new Date(now); + nextWeek.setDate(now.getDate() + 7); + return eventDate >= now && eventDate <= nextWeek; + } + + if (timeFilter === 'next-month') { + const nextMonth = new Date(now); + nextMonth.setMonth(now.getMonth() + 1); + return eventDate >= now && eventDate <= nextMonth; + } + + return true; + } + + // Filter events based on search query, event type, and time filter using Fuse.js $: filteredEvents = (() => { let events = publicEvents; @@ -35,15 +59,35 @@ events = events.filter((event) => event.type === selectedEventType); } + // Then filter by time range + if (selectedTimeFilter !== 'any') { + events = events.filter((event) => isEventInTimeRange(event, selectedTimeFilter)); + } + // Then apply search query if (searchQuery.trim() !== '') { events = fuse.search(searchQuery).map((result) => result.item); - // Re-apply type filter after search + // Re-apply type and time filters after search if (selectedEventType !== 'all') { events = events.filter((event) => event.type === selectedEventType); } + if (selectedTimeFilter !== 'any') { + events = events.filter((event) => isEventInTimeRange(event, selectedTimeFilter)); + } } + // Sort events by date and time + events = events.sort((a, b) => { + const dateA = new Date(`${a.date}T${a.time}`); + const dateB = new Date(`${b.date}T${b.time}`); + + if (selectedSortOrder === 'asc') { + return dateA.getTime() - dateB.getTime(); + } else { + return dateB.getTime() - dateA.getTime(); + } + }); + return events; })(); @@ -89,77 +133,89 @@ -
-
- -
-
- +
+ +
+
+ + + +
+ + {#if searchQuery} +
- - {#if searchQuery} - - {/if} + + {/if} +
+ + +
+ +
+ + +
+ +
+ +
- -
-