import { Calendar, CalendarEvent } from '/lib/types.ts'; import { getDaysForWeek } from '/lib/utils.ts'; interface CalendarViewWeekProps { startDate: Date; visibleCalendars: Pick[]; calendarEvents: CalendarEvent[]; onClickAddEvent: (startDate?: Date, isAllDay?: boolean) => void; onClickOpenEvent: (calendarEvent: CalendarEvent) => void; } export default function CalendarViewWeek( { startDate, visibleCalendars, calendarEvents, onClickAddEvent, onClickOpenEvent }: CalendarViewWeekProps, ) { const today = new Date().toISOString().substring(0, 10); const hourFormat = new Intl.DateTimeFormat('en-GB', { hour12: false, hour: '2-digit', minute: '2-digit' }); const weekDayFormat = new Intl.DateTimeFormat('en-GB', { weekday: 'short' }); const days = getDaysForWeek(new Date(startDate)); return (
{days.map((day, dayIndex) => { const allDayEvents: CalendarEvent[] = calendarEvents.filter((calendarEvent) => { if (!calendarEvent.is_all_day) { return false; } const startDayDate = new Date(day.date); const endDayDate = new Date(day.date); endDayDate.setHours(23); endDayDate.setMinutes(59); endDayDate.setSeconds(59); endDayDate.setMilliseconds(999); const eventStartDate = new Date(calendarEvent.start_date); const eventEndDate = new Date(calendarEvent.end_date); // 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; }); const isFirstDay = dayIndex === 0; const isLastDay = dayIndex === 6; const isToday = new Date(day.date).toISOString().substring(0, 10) === today; return ( <>
{weekDayFormat.format(day.date)}
{allDayEvents.length > 0 ? (
    {allDayEvents.map((calendarEvent) => (
  1. calendar.id === calendarEvent.calendar_id) ?.color || 'bg-gray-700' }`} onClick={() => onClickOpenEvent(calendarEvent)} >

    {calendarEvent.title}

  2. ))}
) : null}
{day.hours.map((hour, hourIndex) => { const shortIsoDate = hour.date.toISOString().substring(0, 10); const startHourDate = new Date(shortIsoDate); startHourDate.setHours(hour.date.getHours()); const endHourDate = new Date(shortIsoDate); endHourDate.setHours(hour.date.getHours()); endHourDate.setMinutes(59); endHourDate.setSeconds(59); endHourDate.setMilliseconds(999); const isLastHourOfFirstDay = hourIndex === 23 && dayIndex === 0; const isLastHourOfLastDay = hourIndex === 23 && dayIndex === 6; const hourEvents = calendarEvents.filter((calendarEvent) => { if (calendarEvent.is_all_day) { return false; } const eventStartDate = new Date(calendarEvent.start_date); const eventEndDate = new Date(calendarEvent.end_date); eventEndDate.setSeconds(eventEndDate.getSeconds() - 1); // Take one second back so events don't bleed into the next hour // Event starts and ends on this hour if (eventStartDate >= startHourDate && eventEndDate <= endHourDate) { return true; } // Event starts before and ends after this hour if (eventStartDate <= startHourDate && eventEndDate >= endHourDate) { return true; } // Event starts on and ends after this hour if ( eventStartDate >= startHourDate && eventStartDate <= endHourDate && eventEndDate >= endHourDate ) { return true; } // Event starts before and ends on this hour if ( eventStartDate <= startHourDate && eventEndDate >= startHourDate && eventEndDate <= endHourDate ) { return true; } return false; }); return (
{hourEvents.length > 0 ? (
    {hourEvents.map((hourEvent) => (
  1. calendar.id === hourEvent.calendar_id) ?.color || 'bg-gray-700' }`} onClick={() => onClickOpenEvent(hourEvent)} >

    {hourEvent.title}

  2. ))}
) : null}
); })} ); })}
); }