Untitled
unknown
plain_text
9 months ago
4.9 kB
5
Indexable
"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>
)
}Editor is loading...
Leave a Comment