Untitled
unknown
plain_text
a year ago
4.4 kB
7
Indexable
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { DateRangeSelect } from "@/components/DateRangeSelect";
import { useState } from "react";
import type { DateRange } from "@/lib/utils/date";
import type { Metrics } from "@/types/metrics";
import {
BarChart,
Bar,
XAxis,
YAxis,
CartesianGrid,
Tooltip,
ResponsiveContainer,
PieChart,
Pie,
Cell,
} from "recharts";
interface OverviewProps {
metrics: Metrics;
}
const COLORS = ['#0088FE', '#00C49F', '#FFBB28', '#FF8042'];
export function Overview({ metrics }: OverviewProps) {
const [dateRange, setDateRange] = useState<DateRange>('7d');
const apiVsLocalData = [
{ name: 'API', value: metrics.basic_metrics.api_vs_local_usage.api },
{ name: 'Local', value: metrics.basic_metrics.api_vs_local_usage.local },
];
const binUsageData = Object.entries(metrics.basic_metrics.items_sorted_per_bin).map(
([bin, count]) => ({
bin,
count,
})
);
return (
<div className="space-y-8">
<div className="flex justify-between items-center">
<h1 className="text-3xl font-bold">Overview</h1>
<DateRangeSelect value={dateRange} onChange={setDateRange} />
</div>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
<Card>
<CardHeader>
<CardTitle>Total Items Sorted</CardTitle>
</CardHeader>
<CardContent>
<p className="text-3xl font-bold">
{metrics.basic_metrics.total_items_sorted}
</p>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle>Active Bins</CardTitle>
</CardHeader>
<CardContent>
<p className="text-3xl font-bold">
{Object.keys(metrics.basic_metrics.items_sorted_per_bin).length}
</p>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle>Total Bin Emptyings</CardTitle>
</CardHeader>
<CardContent>
<p className="text-3xl font-bold">
{Object.values(metrics.basic_metrics.bin_emptying_counts).reduce(
(a, b) => a + b,
0
)}
</p>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle>Current Streak</CardTitle>
</CardHeader>
<CardContent>
<p className="text-3xl font-bold">
{metrics.time_metrics.daily_weekly_monthly_streaks.daily} days
</p>
</CardContent>
</Card>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<Card>
<CardHeader>
<CardTitle>Items Sorted Per Bin</CardTitle>
</CardHeader>
<CardContent className="h-[300px]">
<ResponsiveContainer width="100%" height="100%">
<BarChart data={binUsageData}>
<CartesianGrid strokeDasharray="3 3" />
<XAxis dataKey="bin" />
<YAxis />
<Tooltip />
<Bar dataKey="count" fill="#8884d8" />
</BarChart>
</ResponsiveContainer>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle>API vs Local Usage</CardTitle>
</CardHeader>
<CardContent className="h-[300px]">
<ResponsiveContainer width="100%" height="100%">
<PieChart>
<Pie
data={apiVsLocalData}
cx="50%"
cy="50%"
labelLine={false}
label={({ name, percent }) =>
`${name} ${(percent * 100).toFixed(0)}%`
}
outerRadius={80}
fill="#8884d8"
dataKey="value"
>
{apiVsLocalData.map((_, index) => (
<Cell
key={`cell-${index}`}
fill={COLORS[index % COLORS.length]}
/>
))}
</Pie>
<Tooltip />
</PieChart>
</ResponsiveContainer>
</CardContent>
</Card>
</div>
</div>
);
}Editor is loading...
Leave a Comment