import { useEffect, useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { api } from '../../lib/api'; import type { ApiResponse } from '../../lib/api'; import type { BookingService } from '../../hooks/useDoctorBookingServices'; interface ServiceSlot { start: number; end: number; start_time: string } /** * انتخاب سرویس (یک/چند) + زمان‌های خالیِ کافیِ پیشنهادی برای نوبت‌دهی سرویسی. * مدت نوبت از مجموع مدت سرویس‌ها می‌آید؛ زمان‌ها از `appointment-service-slots`. * انتخاب را از طریق onSelect بالا می‌فرستد تا فرمِ میزبان payload بسازد. */ export default function ServiceSlotPicker({ doctorUuid, date, services, onSelect, }: { doctorUuid: string; date: string; services: BookingService[]; onSelect: (v: { serviceUuids: string[]; slot: ServiceSlot | null }) => void; }) { const [serviceUuids, setServiceUuids] = useState([]); const [pickedSlot, setPickedSlot] = useState(null); useEffect(() => { setPickedSlot(null); }, [serviceUuids, date, doctorUuid]); useEffect(() => { onSelect({ serviceUuids, slot: pickedSlot }); }, [serviceUuids, pickedSlot]); const slotsQ = useQuery>({ queryKey: ['service-slots-picker', doctorUuid, date, serviceUuids], queryFn: () => api.get( `/api/v1/appointment-service-slots?doctor_uuid=${doctorUuid}&date=${date}` + serviceUuids.map(u => `&service_item_uuids[]=${encodeURIComponent(u)}`).join('') ), enabled: !!doctorUuid && !!date && serviceUuids.length > 0, }); const startTimes: ServiceSlot[] = (slotsQ.data?.data as any)?.start_times ?? []; const totalMinutes = (slotsQ.data?.data as any)?.total_duration_minutes as number | undefined; const label = { fontSize: 12.5, color: 'var(--text-3)', display: 'block' } as const; const toggle = (uuid: string) => setServiceUuids(prev => prev.includes(uuid) ? prev.filter(u => u !== uuid) : [...prev, uuid]); return (
{services.length === 0 ? (
سرویسی با «نمایش در نوبت‌دهی» برای این پزشک تعریف نشده است.
) : (
{services.map(s => { const active = serviceUuids.includes(s.uuid); return ( ); })}
)} {serviceUuids.length > 0 && ( <> {slotsQ.isLoading ? (
در حال محاسبه...
) : startTimes.length === 0 ? (
برای این سرویس در این روز زمان خالی کافی نیست؛ روز دیگری انتخاب کنید.
) : (
{startTimes.map(s => { const active = pickedSlot?.start === s.start; return ( ); })}
)} )}
); }