feat(clinic): implement doctor detachment functionality with API endpoint and confirmation dialog

This commit is contained in:
hamed
2026-06-19 01:10:06 +03:30
parent b3883a6e90
commit dd1ca98cb4
4 changed files with 106 additions and 0 deletions
+34
View File
@@ -480,6 +480,7 @@ export default function ClinicDetailPage() {
const [editingClinicAddr, setEditingClinicAddr] = useState<ClinicAddress | null>(null);
const [deleteAddrConfirm, setDeleteAddrConfirm] = useState<ClinicAddress | null>(null);
const [deleteImageConfirm, setDeleteImageConfirm] = useState<string | null>(null);
const [detachDoctorConfirm, setDetachDoctorConfirm] = useState<ClinicDoctorItem | null>(null);
const emptyAddrForm = { name: '', address: '', telephone: '', province_id: null as number | null, city_id: null as number | null, latitude: null as number | null, longitude: null as number | null };
const [addrForm, setAddrForm] = useState(emptyAddrForm);
@@ -587,6 +588,17 @@ export default function ClinicDetailPage() {
onError: (e: Error) => toast.error(e.message),
});
const detachDoctorMut = useMutation({
mutationFn: (doctorUuid: string) =>
api.delete<ApiResponse<{ message: string }>>(`/api/v1/admin/clinic/${uuid}/doctor/${doctorUuid}`),
onSuccess: () => {
toast.success('پزشک از کلینیک جدا شد');
qc.invalidateQueries({ queryKey: ['clinic-doctors', uuid] });
qc.invalidateQueries({ queryKey: ['clinic-detail', uuid] });
},
onError: (e: Error) => toast.error(e.message),
});
const handleLogoUpload = async (file: File) => {
setLogoUploading(true);
try {
@@ -825,6 +837,13 @@ export default function ClinicDetailPage() {
>
<EyeIcon style={{ width: 14, height: 14 }} />
</button>
<button
className="mini-btn danger"
title="جداسازی از کلینیک"
onClick={() => setDetachDoctorConfirm(doc)}
>
<TrashIcon style={{ width: 14, height: 14 }} />
</button>
</div>
</div>
);
@@ -1195,6 +1214,21 @@ export default function ClinicDetailPage() {
onCancel={() => setDeleteImageConfirm(null)}
/>
{/* Detach Doctor From Clinic Confirm */}
<ConfirmDialog
open={detachDoctorConfirm !== null}
title="جداسازی پزشک از کلینیک"
message={`آیا پزشک "${detachDoctorConfirm?.name ?? ''}" از این کلینیک جدا شود؟ این کار فقط ارتباط پزشک با این کلینیک را حذف می‌کند.`}
confirmLabel="جداسازی"
danger
loading={detachDoctorMut.isPending}
onConfirm={() => {
if (detachDoctorConfirm) detachDoctorMut.mutate(detachDoctorConfirm.uuid);
setDetachDoctorConfirm(null);
}}
onCancel={() => setDetachDoctorConfirm(null)}
/>
{/* Edit modal — portal to escape Leaflet transform context */}
{editOpen && createPortal(
<EditModal