import React, { useState, useEffect } from 'react' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, } from '@/components/ui/dialog' import { Button } from '@/components/ui/button' import { Ic } from '@/icons' import type { FactorItem } from '../types' import { BillingStatusBadge } from './BillingStatusBadge' import { resolveMediaUrl, getMediaFallbackUrl, toFa } from '@/lib/utils' interface Props { factor: FactorItem | null open: boolean onClose: () => void onClearReceipt?: (factorId: number) => Promise } export function ReceiptLightboxDialog({ factor, open, onClose, onClearReceipt, }: Props) { const [zoom, setZoom] = useState(1) const [rotation, setRotation] = useState(0) const [imageError, setImageError] = useState(false) const [imageLoading, setImageLoading] = useState(true) const [imgSrc, setImgSrc] = useState('') const [fallbackTried, setFallbackTried] = useState(false) useEffect(() => { if (open && factor) { setZoom(1) setRotation(0) setImageError(false) setImageLoading(true) setFallbackTried(false) setImgSrc(resolveMediaUrl(factor.transaction_receipt)) } }, [open, factor?.id, factor?.transaction_receipt]) if (!factor) return null const receiptUrl = imgSrc || resolveMediaUrl(factor.transaction_receipt) const hasReceipt = Boolean(receiptUrl) const handleZoomIn = () => setZoom((prev) => Math.min(4, +(prev + 0.25).toFixed(2))) const handleZoomOut = () => setZoom((prev) => Math.max(0.5, +(prev - 0.25).toFixed(2))) const handleReset = () => { setZoom(1) setRotation(0) } const handleRotate = () => setRotation((prev) => (prev + 90) % 360) const handleToggleZoom = () => { setZoom((prev) => (prev > 1 ? 1 : 2)) } return ( !val && onClose()}> {/* هدر مدال پیش‌نمایش فیش */}
تصویر فیش پرداختی صورت‌حساب #{factor.id} مشتری: {factor.user_info?.fullname || factor.user_info?.email || 'نامشخص'} • مبلغ:{' '} ${Number(factor.amount).toLocaleString()}
{/* نوار ابزار بزرگنمایی و کنترل تصویر */} {hasReceipt && !imageError && (
{(zoom !== 1 || rotation !== 0) && ( )} {toFa(Math.round(zoom * 100))}%
)} {/* کادر نمایش تصویر فیش */}
{hasReceipt && !imageError ? (
{imageLoading && (
در حال بارگذاری تصویر فیش...
)} {`فیش 1 ? 'cursor-zoom-out' : 'cursor-zoom-in' }`} style={{ transform: `scale(${zoom}) rotate(${rotation}deg)`, transformOrigin: 'center center', }} onDoubleClick={handleToggleZoom} title={zoom > 1 ? 'دوبار کلیک برای بازنشانی اندازه' : 'دوبار کلیک برای بزرگ‌نمایی'} onLoad={() => setImageLoading(false)} onError={() => { if (!fallbackTried && factor.transaction_receipt) { setFallbackTried(true) const fallback = getMediaFallbackUrl(factor.transaction_receipt) if (fallback && imgSrc !== fallback) { setImgSrc(fallback) return } } setImageLoading(false) setImageError(true) }} />
) : (

{imageError ? 'خطا در بارگذاری تصویر فیش پرداختی.' : 'هنوز فیش واریزی برای این صورت‌حساب ثبت نشده است.'}

{imageError ? 'آدرس فایل در سرور در دسترس نیست یا فرمت تصویر نامعتبر می‌باشد.' : 'وضعیت فاکتور در انتظار پرداخت توسط مشتری می‌باشد.'}

{imageError && onClearReceipt && ( )}
)}
{/* اطلاعات شماره کارت و توضیحات جانبی */} {factor.card_number && (
شماره کارت مقصد: {factor.card_number}
)} {/* فوتر مودال: دکمه بستن و دکمه حذف فیش (در صورت وجود) */}
{onClearReceipt && factor.transaction_receipt && ( )}
) }