import React, { useState } from 'react'; import ConfirmDialog from './ui/ConfirmDialog'; import { useCancellationPreview, useCancelAppointment } from '../hooks/useCancellation'; import { formatRial } from '../lib/utils'; interface Props { open: boolean; appointmentUuid: string; /** چه کسی لغو می‌کند — جریمه برای لغو کلینیک همیشه صفر است. */ by?: 'user' | 'doctor'; onClose: () => void; onCancelled?: () => void; } /** * لغو نوبت با نمایش پیامد مالی **قبل از** تأیید. * * پیش‌نمایش از همان محاسبه‌ای می‌آید که خودِ لغو انجام می‌دهد، پس عددی که اپراتور * می‌بیند همان است که کسر می‌شود. دکمهٔ لغوِ بی‌پیش‌نمایش یعنی اپراتور جریمهٔ بیمار را * بعد از وقوعش کشف می‌کند. */ export default function CancelAppointmentDialog({ open, appointmentUuid, by = 'doctor', onClose, onCancelled, }: Props) { const [reason, setReason] = useState(''); const { preview, loading } = useCancellationPreview(open ? appointmentUuid : undefined, by); const cancel = useCancelAppointment(); const close = () => { setReason(''); onClose(); }; return ( cancel.mutate( { uuid: appointmentUuid, by, reason }, { onSuccess: () => { close(); onCancelled?.(); }, }, ) } onCancel={close} >
{loading ? ( در حال محاسبهٔ پیامد لغو… ) : !preview ? ( پیامد مالی لغو در دسترس نیست؛ لغو انجام می‌شود ولی مبلغ را دستی بررسی کنید. ) : ( <>
جریمهٔ لغو 0 ? 'var(--danger)' : 'var(--success)' }}> {preview.penalty_rials > 0 ? formatRial(preview.penalty_rials) : 'بدون جریمه'}
مبلغ پرداخت‌شده {formatRial(preview.paid_rials)}
بازگشت اعتبار پکیج {preview.credit_refundable ? 'بله' : 'خیر'}
{preview.within_free_window && (
در بازهٔ لغو رایگان است.
)} {preview.notes.map((note, i) => (
{note}
))} )}