Untitled
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> ); }
Leave a Comment