boyinfuture's picture
more efficiewnt backend
6ffbf76
import React, { useState, useEffect } from 'react';
import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts';
import axios from 'axios';
const PROXY_URL = 'https://api.allorigins.win/raw?url=';
const fetchHistoricalData = async (ticker) => {
const yahooUrl = `https://query1.finance.yahoo.com/v8/finance/chart/${ticker}?range=100d&interval=1d`;
const encodedUrl = encodeURIComponent(yahooUrl);
try {
const response = await axios.get(PROXY_URL + encodedUrl);
const data = response.data.chart.result[0];
const timestamps = data.timestamp;
const prices = data.indicators.quote[0].close;
return timestamps
.map((ts, i) => ({
date: new Date(ts * 1000).toLocaleDateString('en-IN', {day: 'numeric', month: 'short'}),
price: prices[i] ? prices[i].toFixed(2) : null,
}))
.filter(point => point.price !== null);
} catch (error) {
console.error("Failed to fetch historical data for chart:", error);
return [];
}
};
function HistoricalChart({ ticker }) {
const [data, setData] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
if (ticker) {
setLoading(true);
fetchHistoricalData(ticker).then(chartData => {
setData(chartData);
setLoading(false);
});
}
}, [ticker]);
if (loading) return <div className="h-[300px] flex items-center justify-center"><p className="text-gray-400">Loading Chart Data...</p></div>;
if (data.length === 0) return <div className="h-[300px] flex items-center justify-center"><p className="text-gray-400">Could not load chart data.</p></div>;
return (
<div style={{ width: '100%', height: 300 }}>
<ResponsiveContainer>
<LineChart data={data} margin={{ top: 5, right: 10, left: -20, bottom: 5 }}>
<CartesianGrid strokeDasharray="3 3" stroke="rgba(255, 255, 255, 0.1)" />
<XAxis dataKey="date" stroke="#9CA3AF" tick={{ fontSize: 12 }} />
<YAxis stroke="#9CA3AF" tick={{ fontSize: 12 }} domain={['auto', 'auto']} />
<Tooltip
contentStyle={{ backgroundColor: '#1F2937', border: '1px solid #374151' }}
labelStyle={{ color: '#F3F4F6' }}
/>
<Line type="monotone" dataKey="price" stroke="#34D399" strokeWidth={2} name="Close Price" dot={false} />
</LineChart>
</ResponsiveContainer>
</div>
);
}
export default HistoricalChart;