import { Check } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Label } from '@/components/ui/label'; import type { WeeklySlot } from '@/types'; interface WeeklySlotSelectorProps { weeklySlots: WeeklySlot[]; onChange: (slots: WeeklySlot[]) => void; slotAvailability?: Map; weekOffset?: number; } const timeSlots = [ { start: '08:30', end: '09:30' }, { start: '09:40', end: '10:40' }, { start: '10:50', end: '11:50' }, { start: '11:50', end: '12:50' }, { start: '13:00', end: '14:00' }, { start: '14:00', end: '15:00' }, { start: '15:10', end: '16:10' }, { start: '16:20', end: '17:20' }, { start: '17:20', end: '18:20' }, ]; const weekDays = [ { value: 1, label: 'Seg' }, { value: 2, label: 'Ter' }, { value: 3, label: 'Qua' }, { value: 4, label: 'Qui' }, { value: 5, label: 'Sex' }, ]; export function WeeklySlotSelector({ weeklySlots, onChange, slotAvailability, weekOffset = 0, }: WeeklySlotSelectorProps) { // Calculate dates for the week const getWeekDates = (offset: number) => { const now = new Date(); const startOfWeek = new Date(now); startOfWeek.setDate(now.getDate() - now.getDay() + 1 + offset * 7); // Monday const dates: Record = {}; for (let i = 0; i < 5; i++) { const date = new Date(startOfWeek); date.setDate(startOfWeek.getDate() + i); dates[i + 1] = date; } return dates; }; const weekDates = getWeekDates(weekOffset); const formatDate = (date: Date) => { return date.toLocaleDateString('pt-PT', { day: '2-digit', month: '2-digit', }); }; const isSlotSelected = (day: number, start: string, end: string) => { return weeklySlots.some( (slot) => slot.day_of_week === day && slot.start_time === start && slot.end_time === end, ); }; const isSlotAvailable = (day: number, start: string, end: string) => { if (!slotAvailability) { return true; } const key = `${day}-${start}-${end}`; return slotAvailability.get(key) ?? true; }; const toggleSlot = (day: number, start: string, end: string) => { if (!isSlotAvailable(day, start, end)) { return; // Don't allow selecting unavailable slots } const existingIndex = weeklySlots.findIndex( (slot) => slot.day_of_week === day && slot.start_time === start && slot.end_time === end, ); if (existingIndex >= 0) { // Remove slot const newSlots = weeklySlots.filter((_, i) => i !== existingIndex); onChange(newSlots); } else { // Add slot onChange([ ...weeklySlots, { day_of_week: day, start_time: start, end_time: end }, ]); } }; const clearAll = () => { onChange([]); }; return (
{weeklySlots.length > 0 && ( )}
{/* Header row with day names */}
{weekDays.map((day) => (
{day.label} {formatDate(weekDates[day.value])}
))}
{/* Time slots rows */} {timeSlots.map((time) => (
{time.start}-{time.end}
{weekDays.map((day) => { const selected = isSlotSelected( day.value, time.start, time.end, ); const available = isSlotAvailable( day.value, time.start, time.end, ); return ( ); })}
))}
{weeklySlots.length === 0 && (
Selecione pelo menos um horário para continuar
)}
); }