@@ -3,10 +3,18 @@ import type { EventEnriched } from "@/content";
33// an event is considered "ended" if it has ended + 30 min buffer
44const BUFFER_MINUTES = 30 ;
55
6+ // Minimal event data interface that can be satisfied by both EventEnriched and import data
7+ interface EventWithDateTime {
8+ data : {
9+ dateTime : Date ;
10+ duration ?: number ;
11+ } ;
12+ }
13+
614/**
715 * Calculates the end time of an event including a buffer period
816 */
9- export function getEventEndTimeWithBuffer ( event : EventEnriched ) : Date {
17+ export function getEventEndTimeWithBuffer ( event : EventWithDateTime ) : Date {
1018 const startTime = new Date ( event . data . dateTime ) ;
1119 const durationMinutes = event . data . duration || 120 ; // Default 2 hours if not specified
1220 const totalMinutes = durationMinutes + BUFFER_MINUTES ;
@@ -18,7 +26,7 @@ export function getEventEndTimeWithBuffer(event: EventEnriched): Date {
1826 * Checks if an event should be shown as upcoming
1927 * Events are considered upcoming if they haven't ended (including 30 min buffer)
2028 */
21- export function isEventUpcoming ( event : EventEnriched , currentTime : Date = new Date ( ) ) : boolean {
29+ export function isEventUpcoming ( event : EventWithDateTime , currentTime : Date = new Date ( ) ) : boolean {
2230 const endTimeWithBuffer = getEventEndTimeWithBuffer ( event ) ;
2331 return endTimeWithBuffer > currentTime ;
2432}
@@ -27,35 +35,35 @@ export function isEventUpcoming(event: EventEnriched, currentTime: Date = new Da
2735 * Checks if an event should be shown as recent
2836 * Events are considered recent if they have ended (including 30 min buffer)
2937 */
30- export function isEventRecent ( event : EventEnriched , currentTime : Date = new Date ( ) ) : boolean {
38+ export function isEventRecent ( event : EventWithDateTime , currentTime : Date = new Date ( ) ) : boolean {
3139 const endTimeWithBuffer = getEventEndTimeWithBuffer ( event ) ;
3240 return endTimeWithBuffer <= currentTime ;
3341}
3442
3543/**
3644 * Filters events to get upcoming ones (haven't ended + 30 min buffer)
3745 */
38- export function filterUpcomingEvents (
39- events : EventEnriched [ ] ,
46+ export function filterUpcomingEvents < T extends EventWithDateTime > (
47+ events : T [ ] ,
4048 currentTime : Date = new Date ( ) ,
41- ) : EventEnriched [ ] {
49+ ) : T [ ] {
4250 return events . filter ( ( event ) => isEventUpcoming ( event , currentTime ) ) ;
4351}
4452
4553/**
4654 * Filters events to get recent ones (have ended + 30 min buffer)
4755 */
48- export function filterRecentEvents (
49- events : EventEnriched [ ] ,
56+ export function filterRecentEvents < T extends EventWithDateTime > (
57+ events : T [ ] ,
5058 currentTime : Date = new Date ( ) ,
51- ) : EventEnriched [ ] {
59+ ) : T [ ] {
5260 return events . filter ( ( event ) => isEventRecent ( event , currentTime ) ) ;
5361}
5462
5563/**
5664 * Checks if an event is a legacy event (2025.10.10 or earlier)
5765 */
58- export function isLegacyEvent ( event : EventEnriched ) : boolean {
66+ export function isLegacyEvent ( event : EventWithDateTime | EventEnriched ) : boolean {
5967 const eventDate = new Date ( event . data . dateTime ) ;
6068 const legacyCutoff = new Date ( "2025-10-10T23:59:59" ) ;
6169 return eventDate <= legacyCutoff ;
0 commit comments