import React, { useMemo } from 'react'; import { Line, LineChart, CartesianGrid, XAxis, YAxis, ResponsiveContainer } from "recharts"; import { Card, CardHeader, CardContent, CardTitle, CardDescription, CardFooter } from "@/components/ui/card"; import { ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent } from "@/components/ui/chart"; interface WeatherDataPoint { date: string; minTemp: number; maxTemp: number; } interface WeatherChartProps { result: any; } const WeatherChart: React.FC = React.memo(({ result }) => { const { chartData, minTemp, maxTemp } = useMemo(() => { const weatherData: WeatherDataPoint[] = result.list.map((item: any) => ({ date: new Date(item.dt * 1000).toLocaleDateString(), minTemp: Number((item.main.temp_min - 273.15).toFixed(1)), maxTemp: Number((item.main.temp_max - 273.15).toFixed(1)), })); const groupedData: { [key: string]: WeatherDataPoint } = weatherData.reduce((acc, curr) => { if (!acc[curr.date]) { acc[curr.date] = { ...curr }; } else { acc[curr.date].minTemp = Math.min(acc[curr.date].minTemp, curr.minTemp); acc[curr.date].maxTemp = Math.max(acc[curr.date].maxTemp, curr.maxTemp); } return acc; }, {} as { [key: string]: WeatherDataPoint }); const chartData = Object.values(groupedData); const minTemp = Math.min(...chartData.map(d => d.minTemp)); const maxTemp = Math.max(...chartData.map(d => d.maxTemp)); return { chartData, minTemp, maxTemp }; }, [result]); const chartConfig: ChartConfig = useMemo(() => ({ minTemp: { label: "Min Temp.", color: "hsl(var(--chart-1))", }, maxTemp: { label: "Max Temp.", color: "hsl(var(--chart-2))", }, }), []); return ( Weather Forecast for {result.city.name} Showing min and max temperatures for the next 5 days new Date(value).toLocaleDateString(undefined, { month: 'short', day: 'numeric' })} stroke="#9CA3AF" /> `${value}°C`} stroke="#9CA3AF" /> } />
{result.city.name}, {result.city.country}
Next 5 days forecast
); }); WeatherChart.displayName = 'WeatherChart'; export default WeatherChart;