import { addDays, format, isAfter, isSameDay, isSameMonth, startOfDay, startOfISOWeek, subDays } from 'date-fns' import type { WeekDateRange } from './types' const capitalizeFirstLetter = (value: string): string => { if (!value) return value return value.charAt(0).toUpperCase() + value.slice(1) } export const getOverlappingMonths = (week: Date, locale = 'sv-SE'): string => { const startDayMonth = startOfISOWeek(week) const endDayMonth = addDays(startDayMonth, 6) const shortMonthFormatter = new Intl.DateTimeFormat(locale, { month: 'short' }) const longMonthFormatter = new Intl.DateTimeFormat(locale, { month: 'long' }) if (!isSameMonth(startDayMonth, endDayMonth)) { return `${capitalizeFirstLetter(shortMonthFormatter.format(startDayMonth).replace('.', ''))} - ${capitalizeFirstLetter( shortMonthFormatter.format(endDayMonth).replace('.', ''), )}` } return capitalizeFirstLetter(longMonthFormatter.format(startOfISOWeek(week))) } export const getDaysInWeek = (weekStart: Date): Date[] => { const startOfWeek = startOfISOWeek(weekStart) const day = subDays(startOfWeek, 1) const calendar: Date[] = [] for (let index = 0; index < 7; index++) { calendar.push(addDays(day, index + 1)) } return calendar } export const getDaysOfLastWeek = (week: Date): Date[] => getDaysInWeek(week) export const getStartAndEndRangeFromWeek = (week: Date[]): Partial => { const lastDay = week.at(-1) const firstDay = week.at(0) return { endDate: lastDay ? format(lastDay, 'yyyy-MM-dd') : undefined, startDate: firstDay ? format(firstDay, 'yyyy-MM-dd') : undefined, } } export const checkIfDateIsBeforeToday = (date: Date): boolean => { const startOfDate = startOfDay(date) const startOfToday = startOfDay(new Date()) return isAfter(startOfToday, startOfDate) } export const checkIfDateIsEnabled = (date: Date, enabledDates: Date[]): boolean => enabledDates.some((enabledDate) => isSameDay(enabledDate, date))