import React from 'react'; import { useQuery } from '@tanstack/react-query'; import { api } from '../../lib/api'; import type { ApiResponse } from '../../lib/api'; import TurnsTimeline from './TurnsTimeline'; import { buildServiceTimeline } from './serviceTimeline'; import type { TimelineSlot } from './types'; import type { Appointment, ClinicResource } from '../../types'; interface DaySlotsData { windows: { start: number; end: number; start_time: string; end_time: string }[]; empty_reason: string | null; } /** * نمای روزِ یک منبع — همان تایم‌لاینِ نوبت‌دهی سرویسیِ پزشک، با تقویم خودِ منبع. * * منبع اسلاتِ ثابت ندارد: بازهٔ کاری از شیفت خودش می‌آید و طول هر نوبت از سرویس‌هایش، * پس ردیف‌ها «نوبت‌های رزروشده + بازه‌های خالیِ بینشان»اند. کامپوننت تایم‌لاین یکی * است تا کارت، وضعیت و عملیاتِ نوبت در هر دو نما یک چیز باشند. */ export default function ResourceDayPanel({ resource, date, appointments, loading, canCreate, queryKey, onBook, onView, }: { resource: ClinicResource; /** روزِ نمایش، ISO `Y-m-d`. */ date: string; appointments: Appointment[]; loading: boolean; canCreate: boolean; queryKey: unknown[]; onBook: (slot: TimelineSlot | null) => void; onView: (appointment: Appointment) => void; }) { const dayQuery = useQuery>({ queryKey: ['resource-day-slots', resource.uuid, date], queryFn: () => api.get(`/api/v1/resource/${resource.uuid}/day-slots?date=${date}`), }); const data = dayQuery.data?.data; const windows = data?.windows ?? []; const slots = React.useMemo( () => buildServiceTimeline(windows, appointments), [windows, appointments], ); const workingRange = windows.length > 0 ? { start: windows[0].start_time, end: windows[windows.length - 1].end_time } : null; return (
نوبت‌دهی سرویسی — نوبت‌ها بر اساس مدت سرویس چیده می‌شوند. {workingRange && ( ساعت کاری: {workingRange.start} - {workingRange.end} )}
s.appointment !== null)} loading={loading || dayQuery.isLoading} queryKey={queryKey} onView={onView} onBook={onBook} emptyReason={data?.empty_reason ?? null} errorMessage={dayQuery.isError ? ((dayQuery.error as Error)?.message || 'خطای نامشخص') : null} />
); }