"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' ? (
| Date |
Currency |
Buy Cash |
Buy Transfer |
Sell |
Name (VI) |
Name (EN) |
{results.map((result, idx) => (
| {result.date} |
{result.currency} |
{result.muaTm} |
{result.muaCk} |
{result.ban} |
{result.nameVI} |
{result.nameEN} |
))}
) : (
| Date |
Label |
Ask Rate |
Bid Rate CK |
Bid Rate TM |
Ask Rate TM |
From |
To |
{results.map((result, idx) => (
| {result.date} |
{result.label} |
{result.askRate} |
{result.bidRateCK} |
{result.bidRateTM} |
{result.askRateTM} |
{result.sourceCurrency} |
{result.targetCurrency} |
))}
)}
)}
);
}