import { useState, useEffect } from 'react' import { useParams } from 'react-router-dom' import { CheckCircle, XCircle, DollarSign, User, FileText, Clock, Sparkles } from 'lucide-react' import { useLanguage } from '../i18n/LanguageContext' export default function PublicBudgetApproval() { const { token } = useParams() const { t, currencySymbol } = useLanguage() const [request, setRequest] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState('') const [expired, setExpired] = useState(false) const [success, setSuccess] = useState('') const [note, setNote] = useState('') const [submitting, setSubmitting] = useState(false) useEffect(() => { loadRequest() }, [token]) const loadRequest = async () => { try { const res = await fetch(`/api/budget-approval/${token}`) if (!res.ok) { const err = await res.json() if (res.status === 410 || err.error?.toLowerCase().includes('expired')) { setExpired(true) } else { setError(err.error || t('budgetApproval.loadFailed') || 'Failed to load request') } setLoading(false) return } const data = await res.json() setRequest(data) } catch { setError(t('budgetApproval.loadFailed') || 'Failed to load request') } finally { setLoading(false) } } const handleAction = async (action) => { setSubmitting(true) try { const res = await fetch(`/api/budget-approval/${token}/respond`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ action, note: note.trim() || undefined }), }) if (!res.ok) { const err = await res.json() setError(err.error || t('budgetApproval.actionFailed') || 'Action failed') setSubmitting(false) return } setSuccess(action === 'approve' ? (t('budgetApproval.approved') || 'Budget request approved') : (t('budgetApproval.rejected') || 'Budget request rejected')) } catch { setError(t('budgetApproval.actionFailed') || 'Action failed') } finally { setSubmitting(false) } } // Loading state if (loading) { return (
) } // Expired state if (expired) { return (

{t('budgetApproval.expired') || 'Request Expired'}

{t('budgetApproval.expiredDesc') || 'This budget approval request has expired.'}

) } // Error state if (error) { return (

{t('budgetApproval.error') || 'Error'}

{error}

) } // Success state if (success) { const isApproved = success.toLowerCase().includes('approved') || success.toLowerCase().includes('approve') return (
{isApproved ? : }

{t('budgetApproval.thankYou') || 'Thank You'}

{success}

) } if (!request) return null // Already handled (not pending) if (request.status && request.status !== 'pending') { const statusLabel = request.status.charAt(0).toUpperCase() + request.status.slice(1) return (

{t('budgetApproval.alreadyHandled') || 'Already Handled'}

{t('budgetApproval.statusIs') || 'This request has been'}: {statusLabel}

) } // Active state — show request details + approve/reject return (
{/* Header card */}

{t('budgetApproval.title') || 'Budget Approval'}

Rawaj

{/* Amount */}
{Number(request.amount).toLocaleString()} {currencySymbol}
{/* Requested by */} {request.requested_by_name && (

{t('budgetApproval.requestedBy') || 'Requested by'}

{request.requested_by_name}

)} {/* Justification */}

{t('budgetApproval.justification') || 'Justification'}

{request.justification}

{/* Earmarked for */} {request.earmark_name && (

{t('budgetApproval.earmarkedFor') || 'Earmarked for'}

{request.earmark_type && {request.earmark_type}: } {request.earmark_name}

)} {/* Note textarea */}