/** * Admin CSV Rates Management Page * * ADMIN-only page for: * - Uploading CSV rate files * - Viewing CSV configurations * - Managing carrier rate data */ 'use client'; import { useEffect, useState } from 'react'; import { useTranslations, useLocale } from 'next-intl'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { Loader2, RefreshCw, Trash2 } from 'lucide-react'; import { CsvUpload } from '@/components/admin/CsvUpload'; import { listCsvFiles, deleteCsvFile, type CsvFileInfo } from '@/lib/api/admin/csv-rates'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; export default function AdminCsvRatesPage() { const t = useTranslations('dashboard.admin.csvRates'); const locale = useLocale(); const dateLocale = locale === 'fr' ? 'fr-FR' : 'en-US'; const [files, setFiles] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const fetchFiles = async () => { setLoading(true); setError(null); try { const data = await listCsvFiles(); setFiles(data.files || []); } catch (err: any) { setError(err?.message || t('loadError')); } finally { setLoading(false); } }; useEffect(() => { fetchFiles(); }, []); const handleDelete = async (filename: string) => { if (!confirm(t('confirmDelete', { filename }))) { return; } try { await deleteCsvFile(filename); alert(t('deleteSuccess', { filename })); fetchFiles(); // Refresh list } catch (err: any) { alert(t('deleteError', { message: err?.message || t('deleteFailedFallback') })); } }; return (
{/* Page Header */}

{t('title')}

{t('subtitle')}

{t('adminBadge')}
{/* Upload Section */} {/* Configurations Table */}
{t('cardTitle')} {t('cardDescription')}
{error && ( {error} )} {loading ? (
) : files.length === 0 ? (
{t('empty')}
) : (
{t('table.filename')} {t('table.size')} {t('table.rows')} {t('table.uploadedAt')} {t('table.email')} {t('table.actions')} {files.map(file => ( {file.filename} {(file.size / 1024).toFixed(2)} KB {file.rowCount ? ( {t('table.rowCount', { count: file.rowCount })} ) : ( - )}
{new Date(file.uploadedAt).toLocaleDateString(dateLocale)}
{file.companyEmail ?? '—'}
))}
)}
{/* Info Card */} {t('infoTitle')}

{t('info.formatLabel')} {t('info.formatBody')}

{t('info.sizeLabel')} {t('info.sizeBody')}

{t('info.updateLabel')} {t('info.updateBody')}

{t('info.validationLabel')} {t('info.validationBody')}

); }