import { useQuery } from '@tanstack/react-query'; import { api } from '../../lib/api'; import type { ApiResponse } from '../../lib/api'; import { useClinicContext } from '../../hooks/useClinicContext'; interface Slot { start: number; end: number; start_time: string; end_time: string; is_available: boolean; } interface Session { start_time: string; end_time: string; slots: Slot[] } export interface PickedSlot { start: number; end: number; start_time: string } /** * انتخاب نوبت در حالت نوبت‌دهی **اسلاتی**: همان اسلات‌های واقعیِ برنامهٔ کاری پزشک * (`appointment-slots`) که تایم‌لاین هم نشان می‌دهد — نه ساعتِ دستی. اسلات پرشده * غیرقابل انتخاب است، پس ثبت نوبت روی زمان اشغال یا خارج از برنامه ممکن نیست. */ export default function SlotPicker({ doctorUuid, date, value, onSelect, clinicUuidOverride, }: { doctorUuid: string; date: string; value: PickedSlot | null; onSelect: (slot: PickedSlot | null) => void; /** undefined = محیط جاری؛ مقدار صریح (شامل null) = محل انتخاب‌شده خارج از context */ clinicUuidOverride?: string | null; }) { const contextClinicUuid = useClinicContext(); const clinicUuid = clinicUuidOverride === undefined ? contextClinicUuid : clinicUuidOverride; const q = useQuery>({ queryKey: ['appt-slot-picker', doctorUuid, date, clinicUuid], queryFn: () => api.get( `/api/v1/appointment-slots?doctor_uuid=${doctorUuid}&date=${date}&management=1` + (clinicUuid ? `&clinic_uuid=${encodeURIComponent(clinicUuid)}` : ''), ), enabled: !!doctorUuid && !!date, }); const data = q.data?.data as any; const sessions: Session[] = data?.sessions ?? []; const emptyReason = data?.empty_reason; if (q.isLoading) { return
در حال دریافت زمان‌های خالی...
; } if (sessions.length === 0) { return (
{emptyReason?.title ?? 'برای این روز برنامهٔ کاری تعریف نشده است'} {emptyReason?.hint ? — {emptyReason.hint} : null}
); } return (
{sessions.map((s, i) => (
{s.start_time} — {s.end_time}
{s.slots.map((slot) => { const active = value?.start === slot.start; return ( ); })}
))}
); }