import { Calendar, CalendarEvent } from '/lib/models/calendar.ts'; import { getCalendarEventStyle, getWeeksForMonth } from '/lib/utils/calendar.ts'; interface CalendarViewWeekProps { startDate: Date; visibleCalendars: Calendar[]; calendarEvents: CalendarEvent[]; onClickAddEvent: (startDate?: Date, isAllDay?: boolean) => void; onClickOpenEvent: (calendarEvent: CalendarEvent) => void; timezoneId: string; } export default function CalendarViewWeek( { startDate, visibleCalendars, calendarEvents, onClickAddEvent, onClickOpenEvent, timezoneId }: CalendarViewWeekProps, ) { const today = new Date().toISOString().substring(0, 10); const hourFormat = new Intl.DateTimeFormat('en-GB', { hour12: false, hour: '2-digit', minute: '2-digit', timeZone: timezoneId, // Calendar dates are parsed without timezone info, so we need to force to a specific one so it's consistent across db, server, and client }); const weeks = getWeeksForMonth(new Date(startDate)); return (
Mon
Tue
Wed
Thu
Fri
Sat
Sun
{weeks.map((week, weekIndex) => week.map((day, dayIndex) => { const shortIsoDate = day.date.toISOString().substring(0, 10); const startDayDate = new Date(shortIsoDate); const endDayDate = new Date(shortIsoDate); endDayDate.setUTCHours(23); endDayDate.setUTCMinutes(59); endDayDate.setUTCSeconds(59); endDayDate.setUTCMilliseconds(999); const isBottomLeftDay = weekIndex === weeks.length - 1 && dayIndex === 0; const isBottomRightDay = weekIndex === weeks.length - 1 && dayIndex === week.length - 1; const isToday = today === shortIsoDate; const dayEvents = calendarEvents.filter((calendarEvent) => { const eventStartDate = new Date(calendarEvent.startDate); const eventEndDate = new Date(calendarEvent.endDate); // Event starts and ends on this day if (eventStartDate >= startDayDate && eventEndDate <= endDayDate) { return true; } // Event starts before and ends after this day if (eventStartDate <= startDayDate && eventEndDate >= endDayDate) { return true; } // Event starts on and ends after this day if ( eventStartDate >= startDayDate && eventStartDate <= endDayDate && eventEndDate >= endDayDate ) { return true; } // Event starts before and ends on this day if ( eventStartDate <= startDayDate && eventEndDate >= startDayDate && eventEndDate <= endDayDate ) { return true; } return false; }); return (
{dayEvents.length > 0 ? (
    {[...dayEvents].slice(0, 2).map((dayEvent) => (
  1. onClickOpenEvent(dayEvent)} >

    {dayEvent.title}

  2. ))} {dayEvents.length > 2 ? (
  3. ...{dayEvents.length - 2} more event{dayEvents.length - 2 === 1 ? '' : 's'}

  4. ) : null}
) : null}
); }) )}
); }