'use client'; import { Plus, Trash2 } from 'lucide-react'; import { Button } from '@/components/ui/shared/Button'; import { Checkbox } from '@/components/ui/shared/Checkbox'; import { MINUTES_PER_DAY, WEEKDAY_LABELS, minutesToTimeInput, timeInputToMinutes, type WorkingHoursEditorDay, } from '@/components/staff/workingHours'; interface WorkingHoursEditorProps { days: WorkingHoursEditorDay[]; autoRepeatWeekly: boolean; onDaysChange: (days: WorkingHoursEditorDay[]) => void; onAutoRepeatWeeklyChange: (value: boolean) => void; disabled?: boolean; } const timeInputClass = 'w-full rounded-[var(--radius-md)] border border-border bg-background-secondary/90 text-text-primary px-2 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-primary/35'; export function WorkingHoursEditor({ days, autoRepeatWeekly, onDaysChange, onAutoRepeatWeeklyChange, disabled = false, }: WorkingHoursEditorProps) { function updateDay(dayOfWeek: number, patch: Partial) { onDaysChange( days.map((day) => (day.dayOfWeek === dayOfWeek ? { ...day, ...patch } : day)), ); } function updateShift( dayOfWeek: number, shiftIndex: number, field: 'startMinute' | 'endMinute', value: string, ) { const minutes = timeInputToMinutes(value); if (minutes == null) return; const day = days.find((d) => d.dayOfWeek === dayOfWeek); if (!day) return; const shifts = day.shifts.map((shift, index) => index === shiftIndex ? { ...shift, [field]: minutes } : shift, ); updateDay(dayOfWeek, { shifts }); } function addShift(dayOfWeek: number) { const day = days.find((d) => d.dayOfWeek === dayOfWeek); if (!day) return; const last = day.shifts[day.shifts.length - 1]; const startMinute = last ? Math.min(last.endMinute + 60, MINUTES_PER_DAY - 60) : 9 * 60; updateDay(dayOfWeek, { shifts: [...day.shifts, { startMinute, endMinute: Math.min(startMinute + 120, MINUTES_PER_DAY) }], }); } function removeShift(dayOfWeek: number, shiftIndex: number) { const day = days.find((d) => d.dayOfWeek === dayOfWeek); if (!day || day.shifts.length <= 1) return; updateDay(dayOfWeek, { shifts: day.shifts.filter((_, index) => index !== shiftIndex), }); } return (

Set weekly working hours for this provider. The appointments grid uses these hours to show bookable time slots.

{days.map((day) => (
{WEEKDAY_LABELS[day.dayOfWeek]} { updateDay(day.dayOfWeek, { isWorking: checked, shifts: checked ? day.shifts.length > 0 ? day.shifts : [{ startMinute: 9 * 60, endMinute: 17 * 60 }] : day.shifts, }); }} />
{day.isWorking && (
{day.shifts.map((shift, shiftIndex) => (
updateShift(day.dayOfWeek, shiftIndex, 'startMinute', e.target.value) } />
updateShift(day.dayOfWeek, shiftIndex, 'endMinute', e.target.value) } />
))}
)}
))}
); }