import { useMemo, useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { useAuthStore } from '../stores/authStore'; import { api } from '../lib/api'; import type { ApiResponse } from '../lib/api'; import SettingsLayout from '../components/layout/SettingsLayout'; import FreeVisitPrice from '../components/FreeVisitPrice'; import { ScheduleSection } from '../components/schedule/ScheduleSection'; import type { AddressData } from '../components/schedule/ScheduleSection'; import SearchableSelect from '../components/ui/SearchableSelect'; import { usePermissions } from '../hooks/usePermissions'; const PERSONAL = 'personal'; /** * مدیریت نوبت دهی — the doctor's appointment settings: visit price and the full * weekly/overrides/holidays schedule. * * یک پزشک می‌تواند هم مطب شخصی داشته باشد و هم عضو یک/چند کلینیک باشد. هر محیط * برنامهٔ نوبت‌دهی مستقل خودش را دارد (schedule per-context با clinic_id). پزشک عضو * کلینیک آدرس مستقل ثبت نمی‌کند و از Location همان کلینیک استفاده می‌کند؛ پس اگر * بیش از یک محیط داشته باشد، یک انتخابگر محیط نمایش داده می‌شود تا برنامهٔ همان * محیط را مدیریت کند. پیش‌فرض روی محیطی می‌رود که مکان فعال دارد. */ export default function AppointmentSettingsPage() { const doctorUuid = useAuthStore((s) => s.doctorUuid); const dbUuid = useAuthStore((s) => s.dbUuid); const uuid = doctorUuid ?? dbUuid ?? undefined; const { can } = usePermissions(); // منشیِ بدون مجوزِ ویرایشِ تنظیمات نوبت‌دهی، فقط مشاهده می‌کند. const apptReadOnly = !can('appointment_settings', 'update'); // کلینیک‌هایی که پزشک عضوشان است (منبع: پروفایل خود پزشک). const profileQ = useQuery({ queryKey: ['doctor-clinics', uuid], queryFn: () => api.get>(`/api/v1/doctor/${uuid}`), enabled: !!uuid, staleTime: 300_000, }); // پاسخِ doctor دو لایه تو در تو است: success(['data' => [...]]) → data.data. const clinics: { uuid: string; name: string }[] = (profileQ.data?.data as any)?.data?.clinics ?? (profileQ.data?.data as any)?.clinics ?? []; // آیا مطب شخصی مکان فعال دارد؟ برای انتخاب پیش‌فرضِ درست. const personalLocationsQ = useQuery({ queryKey: ['available-locations', uuid, null], queryFn: () => api.get>(`/api/v1/appointment-settings/available-locations/${uuid}`), enabled: !!uuid, }); const personalLocations: AddressData[] = (personalLocationsQ.data?.data as any)?.data ?? personalLocationsQ.data?.data ?? []; const options = useMemo(() => [ { value: PERSONAL, label: 'مطب شخصی' }, ...clinics.map((c) => ({ value: c.uuid, label: c.name })), ], [clinics]); const [picked, setPicked] = useState(null); // پیش‌فرض: مطب شخصی اگر مکان فعال دارد یا کلینیکی نیست؛ وگرنه اولین کلینیک — // تا پزشکِ عضوِ کلینیکِ بدونِ مطب شخصی پیام «ابتدا آدرس مطب را ثبت کنید» نبیند. const defaultContext = useMemo(() => { if (personalLocations.length > 0 || clinics.length === 0) return PERSONAL; return clinics[0].uuid; }, [personalLocations.length, clinics]); const selected = picked ?? defaultContext; const clinicUuid = selected === PERSONAL ? null : selected; const ready = !profileQ.isLoading && !personalLocationsQ.isLoading; return (

مدیریت نوبت دهی

{!uuid ? (
این بخش فقط برای پزشک در دسترس است.
) : !ready ? (
{Array.from({ length: 4 }).map((_, i) =>
)}
) : ( <> {clinics.length > 0 && (
setPicked(v == null ? PERSONAL : String(v))} ariaLabelledBy="appt-context-label" />
)} )}
); }