| 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; |