/** * EditClaimAmountModal Component * Modal for editing claim amount (restricted by role) */ import { useState } from 'react'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { DollarSign, AlertCircle } from 'lucide-react'; import { toast } from 'sonner'; interface EditClaimAmountModalProps { isOpen: boolean; onClose: () => void; currentAmount: number; onSubmit: (newAmount: number) => Promise; currency?: string; } export function EditClaimAmountModal({ isOpen, onClose, currentAmount, onSubmit, currency = '₹', }: EditClaimAmountModalProps) { const [amount, setAmount] = useState(currentAmount.toString()); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(''); const formatCurrency = (value: number) => { return `${currency}${value.toLocaleString('en-IN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`; }; const handleAmountChange = (value: string) => { // Remove non-numeric characters except decimal point const cleaned = value.replace(/[^\d.]/g, ''); // Ensure only one decimal point const parts = cleaned.split('.'); if (parts.length > 2) { return; } setAmount(cleaned); setError(''); }; const handleSubmit = async () => { // Validate amount const numAmount = parseFloat(amount); if (isNaN(numAmount) || numAmount <= 0) { setError('Please enter a valid amount greater than 0'); return; } if (numAmount === currentAmount) { toast.info('Amount is unchanged'); onClose(); return; } try { setSubmitting(true); await onSubmit(numAmount); onClose(); } catch (error) { console.error('Failed to update claim amount:', error); setError('Failed to update claim amount. Please try again.'); } finally { setSubmitting(false); } }; const handleClose = () => { if (!submitting) { setAmount(currentAmount.toString()); setError(''); onClose(); } }; return ( Edit Claim Amount Update the claim amount. This will be recorded in the activity log.
{/* Current Amount Display */}

{formatCurrency(currentAmount)}

{/* New Amount Input */}
{currency} handleAmountChange(e.target.value)} placeholder="Enter amount" className="pl-8 text-lg font-semibold" disabled={submitting} />
{error && (
{error}
)}
{/* Amount Difference */} {amount && !isNaN(parseFloat(amount)) && parseFloat(amount) !== currentAmount && (
Difference: currentAmount ? 'text-green-700' : 'text-red-700' }`}> {parseFloat(amount) > currentAmount ? '+' : ''} {formatCurrency(parseFloat(amount) - currentAmount)}
)} {/* Warning Message */}

Important:

  • Ensure the new amount is verified and approved
  • This change will be logged in the activity trail
  • Budget blocking (IO) may need to be adjusted
); }