Untitled
"use client" import * as React from "react" import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from "recharts" import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { ChartConfig, ChartContainer, ChartLegend, ChartLegendContent, ChartTooltip, ChartTooltipContent, } from "@/components/ui/chart" const chartConfig = { bin1: { label: "Bio", color: "hsl(var(--chart-1))", }, bin2: { label: "Recycling", color: "hsl(var(--chart-2))", }, bin3: { label: "Paper", color: "hsl(var(--chart-3))", }, bin4: { label: "Residual", color: "hsl(var(--chart-4))", }, } satisfies ChartConfig export function FillRates({ data }) { const [timeRange, setTimeRange] = React.useState("90d") // Transform history data into chart format const chartData = Object.entries(data.history || {}).map(([date, levels]) => ({ date, ...levels, })) // Filter data based on selected time range const filteredData = chartData.filter((item) => { const date = new Date(item.date) const referenceDate = new Date() let daysToSubtract = 90 if (timeRange === "30d") daysToSubtract = 30 if (timeRange === "7d") daysToSubtract = 7 const startDate = new Date(referenceDate) startDate.setDate(startDate.getDate() - daysToSubtract) return date >= startDate }) return ( <Card> <CardHeader className="flex items-center gap-2 space-y-0 border-b py-4 sm:flex-row"> <div className="grid flex-1 gap-1 text-center sm:text-left"> <CardTitle>Fill Levels Over Time</CardTitle> <CardDescription>Historical fill levels for all bins</CardDescription> </div> <Select value={timeRange} onValueChange={setTimeRange}> <SelectTrigger className="w-[160px] rounded-lg"> <SelectValue placeholder="Last 3 months" /> </SelectTrigger> <SelectContent> <SelectItem value="90d">Last 3 months</SelectItem> <SelectItem value="30d">Last 30 days</SelectItem> <SelectItem value="7d">Last 7 days</SelectItem> </SelectContent> </Select> </CardHeader> <CardContent className="pt-4"> <ChartContainer config={chartConfig} className="h-[300px]"> <AreaChart data={filteredData}> <defs> {Object.keys(chartConfig).map((bin) => ( <linearGradient key={bin} id={`fill${bin}`} x1="0" y1="0" x2="0" y2="1" > <stop offset="5%" stopColor={`var(--color-${bin})`} stopOpacity={0.8} /> <stop offset="95%" stopColor={`var(--color-${bin})`} stopOpacity={0.1} /> </linearGradient> ))} </defs> <CartesianGrid strokeDasharray="3 3" /> <XAxis dataKey="date" tickLine={false} axisLine={false} tickMargin={8} minTickGap={32} tickFormatter={(value) => { const date = new Date(value) return date.toLocaleDateString("en-US", { month: "short", day: "numeric", }) }} /> <YAxis tickLine={false} axisLine={false} tickMargin={8} domain={[0, 100]} tickFormatter={(value) => `${value}%`} /> <ChartTooltip content={ <ChartTooltipContent labelFormatter={(value) => { return new Date(value).toLocaleDateString("en-US", { month: "long", day: "numeric", year: "numeric", }) }} /> } /> {Object.keys(chartConfig).map((bin) => ( <Area key={bin} dataKey={bin} type="monotone" fill={`url(#fill${bin})`} stroke={`var(--color-${bin})`} strokeWidth={2} /> ))} <ChartLegend content={<ChartLegendContent />} /> </AreaChart> </ChartContainer> </CardContent> </Card> ) }
Leave a Comment