import { useEffect, useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { toast } from 'sonner'; import { api, ApiError, type ApiResponse } from '../lib/api'; import SettingsLayout from '../components/layout/SettingsLayout'; import SearchableSelect from '../components/ui/SearchableSelect'; import { useAuthStore } from '../stores/authStore'; import { usePermissions } from '../hooks/usePermissions'; import type { PracticeDomain } from '../types'; /** * حوزهٔ فعالیت کلینیک. * * تخصصِ پزشکی نیست — آن برچسبی است برای سایت عمومی. این یک کلید پیکربندی است که * تعیین می‌کند کدام workflow درمان صدا زده شود، پس کدش پایدار می‌ماند و فقط ادمین * پلتفرم می‌تواند حوزهٔ تازه بسازد. */ export default function PracticeDomainSettingsPage() { const qc = useQueryClient(); // محیط جاری با `db_uuid` شناخته می‌شود؛ همان uuid کلینیک است. const clinicUuid = useAuthStore((s) => s.context?.db_uuid ?? null); const { can } = usePermissions(); const canUpdate = can('clinic_info', 'update'); const { data: domainsData, isLoading } = useQuery({ queryKey: ['practice-domains'], queryFn: () => api.get>('/api/v1/practice-domains'), staleTime: 300_000, }); const { data: clinicData } = useQuery({ queryKey: ['clinic-practice-domain', clinicUuid], queryFn: () => api.get>( `/api/v1/clinic/${clinicUuid}`, ), enabled: !!clinicUuid, }); const current = clinicData?.data?.data?.practice_domain ?? null; const [selected, setSelected] = useState(null); useEffect(() => setSelected(current?.uuid ?? null), [current]); const save = useMutation({ mutationFn: (uuid: string | null) => api.patch>( `/api/v1/clinic/${clinicUuid}`, { practice_domain_uuid: uuid ?? '' }, ), onSuccess: () => { toast.success('حوزهٔ فعالیت ذخیره شد'); qc.invalidateQueries({ queryKey: ['clinic-practice-domain', clinicUuid] }); }, onError: (e) => toast.error(e instanceof ApiError ? e.message : 'ذخیرهٔ حوزهٔ فعالیت ناموفق بود'), }); const domains = domainsData?.data ?? []; const options = domains.map((d) => ({ value: d.uuid, label: d.name })); const chosen = domains.find((d) => d.uuid === selected) ?? null; return ( // پوستهٔ تنظیمات، مثل بقیهٔ صفحات همین منو. بدون آن، این صفحه تنها صفحه‌ای بود که // منوی تنظیمات را نشان نمی‌داد و کاربر برای رفتن به بخش بعدی باید «بازگشت» می‌زد.

حوزهٔ فعالیت

حوزهٔ فعالیت تعیین می‌کند سیستم چه فرآیند درمانی برای کلینیک شما اجرا کند. این با «تخصص» فرق دارد: تخصص برچسبی است که در سایت عمومی دیده می‌شود، این یک تنظیم است. انتخاب‌نکردنش خطا نیست و کلینیک مثل امروز کار می‌کند.

{isLoading ? ( در حال بارگذاری... ) : ( <> setSelected(v === null ? null : String(v))} placeholder="حوزه‌ای انتخاب نشده" isClearable ariaLabel="حوزهٔ فعالیت کلینیک" /> {chosen && !chosen.has_workflow && ( برای این حوزه هنوز فرآیند اختصاصی تعریف نشده است؛ رفتار پیش‌فرض اعمال می‌شود. )} {/* پزشکِ عضو ممکن است «مشاهده» داشته باشد و «ویرایش» نه؛ دکمهٔ فعالی که حتماً ۴۰۳ می‌گیرد، خطای کاربر نیست — خطای رابط است. */} {!canUpdate && ( برای تغییر حوزهٔ فعالیت، دسترسی «ویرایش اطلاعات کلینیک» لازم است. )} )}
); }