Untitled
unknown
plain_text
a year ago
4.4 kB
12
Indexable
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { DateRangeSelect } from "@/components/DateRangeSelect";
import { Progress } from "@/components/ui/progress";
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,
Legend,
} from "recharts";
interface BinAnalyticsProps {
metrics: Metrics;
}
const COLORS = ['#0088FE', '#00C49F', '#FFBB28', '#FF8042', '#8884d8'];
export function BinAnalytics({ metrics }: BinAnalyticsProps) {
const [dateRange, setDateRange] = useState<DateRange>('7d');
const [selectedBin, setSelectedBin] = useState<string | null>(
Object.keys(metrics.bin_specialization)[0] || null
);
const binSpecializations = Object.entries(metrics.bin_specialization).map(
([binId, data]) => ({
binId,
...data,
})
);
const selectedBinData = selectedBin
? metrics.bin_specialization[selectedBin]
: null;
const typeDistributionData = selectedBinData
? Object.entries(selectedBinData.items_by_type).map(([type, count]) => ({
name: type,
value: count,
}))
: [];
return (
<div className="space-y-8">
<div className="flex justify-between items-center">
<h1 className="text-3xl font-bold">Bin Analytics</h1>
<div className="flex gap-4">
<select
className="px-3 py-2 rounded-md border"
value={selectedBin || ""}
onChange={(e) => setSelectedBin(e.target.value)}
>
{binSpecializations.map((bin) => (
<option key={bin.binId} value={bin.binId}>
{bin.binId}
</option>
))}
</select>
<DateRangeSelect value={dateRange} onChange={setDateRange} />
</div>
</div>
{selectedBinData && (
<>
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
<Card>
<CardHeader>
<CardTitle>Total Items</CardTitle>
</CardHeader>
<CardContent>
<p className="text-3xl font-bold">{selectedBinData.total_items}</p>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle>Most Common Type</CardTitle>
</CardHeader>
<CardContent>
<p className="text-3xl font-bold">
{selectedBinData.most_common_type || "N/A"}
</p>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle>Type Accuracy</CardTitle>
</CardHeader>
<CardContent>
<div className="space-y-2">
<Progress value={selectedBinData.type_accuracy} />
<p className="text-sm text-muted-foreground text-center">
{selectedBinData.type_accuracy.toFixed(1)}%
</p>
</div>
</CardContent>
</Card>
</div>
<Card>
<CardHeader>
<CardTitle>Type Distribution</CardTitle>
</CardHeader>
<CardContent className="h-[400px]">
<ResponsiveContainer width="100%" height="100%">
<PieChart>
<Pie
data={typeDistributionData}
cx="50%"
cy="50%"
labelLine={false}
label={({ name, percent }) =>
`${name} (${(percent * 100).toFixed(0)}%)`
}
outerRadius={150}
fill="#8884d8"
dataKey="value"
>
{typeDistributionData.map((_, index) => (
<Cell
key={`cell-${index}`}
fill={COLORS[index % COLORS.length]}
/>
))}
</Pie>
<Tooltip />
<Legend />
</PieChart>
</ResponsiveContainer>
</CardContent>
</Card>
</>
)}
</div>
);
}Editor is loading...
Leave a Comment