"use client"; import React, { useState } from 'react'; import DatePicker from 'react-datepicker'; import 'react-datepicker/dist/react-datepicker.css'; import { parse, isDate } from 'date-fns'; export default function ExchangeRateViewer({ defaultStartDate, defaultEndDate }) { const [startDate, setStartDate] = useState( defaultStartDate ? (isDate(defaultStartDate) ? defaultStartDate : parse(defaultStartDate, 'yyyy-MM-dd', new Date())) : null ); const [endDate, setEndDate] = useState( defaultEndDate ? (isDate(defaultEndDate) ? defaultEndDate : parse(defaultEndDate, 'yyyy-MM-dd', new Date())) : null ); const [selectedBank, setSelectedBank] = useState('bidv'); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(''); const [results, setResults] = useState([]); const [showTable, setShowTable] = useState(false); const handleFetch = async () => { if (!startDate || !endDate) { setError('Please select both start and end dates'); return; } setError(''); setIsLoading(true); setResults([]); setShowTable(false); try { const start = startDate; const end = endDate; if (start > end) { setError('Start date cannot be after end date'); setIsLoading(false); return; } const response = await fetch('/api/exchange-rates', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ startDate: start.toISOString().split('T')[0], endDate: end.toISOString().split('T')[0], bank: selectedBank }) }); if (!response.ok) { const errorData = await response.json(); throw new Error(errorData.error || 'Failed to fetch exchange rates'); } const data = await response.json(); setResults(data.data || []); setShowTable(true); } catch (err) { setError(`An error occurred while fetching exchange rates: ${err.message}`); console.error(err); } finally { setIsLoading(false); } }; const handleExport = () => { if (results.length === 0) return; let csvContent = ''; let headers = []; if (selectedBank === 'bidv') { headers = ['Date', 'Currency', 'Buy Cash', 'Buy Transfer', 'Sell', 'Name VI', 'Name EN']; csvContent = headers.join(',') + '\n'; csvContent += results.map(row => `"${row.date}","${row.currency}","${row.muaTm}","${row.muaCk}","${row.ban}","${row.nameVI}","${row.nameEN}"` ).join('\n'); } else { headers = ['Date', 'Label', 'Ask Rate', 'Bid Rate CK', 'Bid Rate TM', 'Ask Rate TM', 'From', 'To']; csvContent = headers.join(',') + '\n'; csvContent += results.map(row => `"${row.date}","${row.label}","${row.askRate}","${row.bidRateCK}","${row.bidRateTM}","${row.askRateTM}","${row.sourceCurrency}","${row.targetCurrency}"` ).join('\n'); } const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' }); const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.download = `exchange_rates_${selectedBank}_${new Date().toISOString().split('T')[0]}.csv`; document.body.appendChild(link); link.click(); document.body.removeChild(link); }; return (

Exchange Rate Export

setStartDate(date)} maxDate={endDate || new Date()} dateFormat="yyyy-MM-dd" className="border rounded p-2" placeholderText="Select start date" />
setEndDate(date)} minDate={startDate} maxDate={new Date()} dateFormat="yyyy-MM-dd" className="border rounded p-2" placeholderText="Select end date" />
{error &&
{error}
} {isLoading &&
Loading data, please wait...
} {showTable && (
{selectedBank === 'bidv' ? ( {results.map((result, idx) => ( ))}
Date Currency Buy Cash Buy Transfer Sell Name (VI) Name (EN)
{result.date} {result.currency} {result.muaTm} {result.muaCk} {result.ban} {result.nameVI} {result.nameEN}
) : ( {results.map((result, idx) => ( ))}
Date Label Ask Rate Bid Rate CK Bid Rate TM Ask Rate TM From To
{result.date} {result.label} {result.askRate} {result.bidRateCK} {result.bidRateTM} {result.askRateTM} {result.sourceCurrency} {result.targetCurrency}
)}
)}
); }