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 (
{t('budgetApproval.expiredDesc') || 'This budget approval request has expired.'}
{error}
{success}
{t('budgetApproval.statusIs') || 'This request has been'}: {statusLabel}
Rawaj
{t('budgetApproval.requestedBy') || 'Requested by'}
{request.requested_by_name}
{t('budgetApproval.justification') || 'Justification'}
{request.justification}
{t('budgetApproval.earmarkedFor') || 'Earmarked for'}
{request.earmark_type && {request.earmark_type}: } {request.earmark_name}
{t('review.poweredBy') || 'Powered by Rawaj'}