import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { apiClient } from '@/lib/api-client'; import type { RecurringBookingGroup } from '@repo/api-contract'; import { useEffect, useState } from 'react'; import { useBooking } from '../booking-provider'; import { minutesToTime, timeToMinutes } from '../lib/booking-time'; const DAY_OPTIONS = [ { value: 'MONDAY', label: 'Lunes' }, { value: 'TUESDAY', label: 'Martes' }, { value: 'WEDNESDAY', label: 'Miércoles' }, { value: 'THURSDAY', label: 'Jueves' }, { value: 'FRIDAY', label: 'Viernes' }, { value: 'SATURDAY', label: 'Sábado' }, { value: 'SUNDAY', label: 'Domingo' }, ]; interface RecurringBookingEditDialogProps { group: RecurringBookingGroup; open: boolean; onClose: () => void; } export function RecurringBookingEditDialog({ group, open, onClose, }: RecurringBookingEditDialogProps) { const { courts, refreshRecurringGroups } = useBooking(); const [courtId, setCourtId] = useState(group.courtId); const [dayOfWeek, setDayOfWeek] = useState(group.dayOfWeek); const [startTime, setStartTime] = useState(group.startTime); const [customerName, setCustomerName] = useState(group.customerName); const [customerPhone, setCustomerPhone] = useState(group.customerPhone); const [customerEmail, setCustomerEmail] = useState(group.customerEmail); const [error, setError] = useState(''); const [saving, setSaving] = useState(false); useEffect(() => { setCourtId(group.courtId); setDayOfWeek(group.dayOfWeek); setStartTime(group.startTime); setCustomerName(group.customerName); setCustomerPhone(group.customerPhone); setCustomerEmail(group.customerEmail); }, [group]); const selectedCourt = courts.find((c) => c.id === courtId); const slotDuration = selectedCourt?.slotDurationMinutes ?? 60; const availableSlots: string[] = []; if (selectedCourt) { const availabilities = selectedCourt.availability.filter((a) => a.dayOfWeek === dayOfWeek); for (const avail of availabilities) { const startMins = timeToMinutes(avail.startTime); const endMins = timeToMinutes(avail.endTime); for (let m = startMins; m + slotDuration <= endMins; m += slotDuration) { availableSlots.push(minutesToTime(m)); } } } const handleSave = async () => { if (!customerName || customerName.trim().length < 2) { setError('El nombre debe tener al menos 2 caracteres.'); return; } setError(''); setSaving(true); try { await apiClient.adminBookings.updateRecurringGroup(group.id, { ...(courtId !== group.courtId && { courtId }), ...(dayOfWeek !== group.dayOfWeek && { dayOfWeek: dayOfWeek as | 'MONDAY' | 'TUESDAY' | 'WEDNESDAY' | 'THURSDAY' | 'FRIDAY' | 'SATURDAY' | 'SUNDAY', }), ...(startTime !== group.startTime && { startTime }), ...(customerName !== group.customerName && { customerName }), ...(customerPhone !== group.customerPhone && { customerPhone }), ...(customerEmail !== group.customerEmail && { customerEmail }), }); await refreshRecurringGroups(); onClose(); } catch (e) { setError(e instanceof Error ? e.message : 'Error al guardar los cambios.'); } finally { setSaving(false); } }; return ( !open && onClose()}> Editar turno fijo
setCustomerName(e.target.value)} placeholder="Nombre del cliente" />
setCustomerPhone(e.target.value)} placeholder="Teléfono" />
setCustomerEmail(e.target.value)} placeholder="Email" />
{error &&

{error}

}
); }