Untitled
import React, { useState } from 'react'; import { Bar, BarChart, CartesianGrid, XAxis, YAxis, Tooltip, Pie, PieChart, Cell } from 'recharts'; import { RefreshCcw, Leaf, Trees } from 'lucide-react'; import { useMetrics } from '@/hooks/useMetrics'; import { AppSidebar } from "@/components/app-sidebar"; import { SidebarInset, SidebarProvider, SidebarTrigger } from "@/components/ui/sidebar"; import { Separator } from "@/components/ui/separator"; import { Breadcrumb, BreadcrumbItem, BreadcrumbList, BreadcrumbLink } from "@/components/ui/breadcrumb"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { ChartContainer, ChartTooltip, ChartTooltipContent, } from "@/components/ui/chart"; const chartConfig = { co2: { label: "CO2 Saved (kg)", color: "hsl(var(--chart-1))", }, trees: { label: "Trees Saved", color: "hsl(var(--chart-2))", }, paper: { label: "Paper", color: "hsl(var(--chart-1))", }, plastic: { label: "Plastic", color: "hsl(var(--chart-2))", }, organic: { label: "Organic", color: "hsl(var(--chart-3))", }, }; export default function EnvironmentalImpactPage() { const { metrics, loading, error } = useMetrics(); const [timeRange, setTimeRange] = useState("all"); if (loading) return <div>Loading...</div>; if (error) return <div>Error: {error}</div>; if (!metrics) return null; const { environmental_impact } = metrics; // Transform data for recycling by type pie chart const recyclingData = [ { name: "Paper", value: environmental_impact.paper_weight_recycled }, { name: "Plastic", value: environmental_impact.plastic_weight_recycled }, { name: "Organic", value: environmental_impact.organic_weight_processed } ]; return ( <SidebarProvider> <AppSidebar /> <SidebarInset> <header className="flex shrink-0 items-center gap-2 border-b px-4 py-6"> <SidebarTrigger className="-ml-1" /> <Separator orientation="vertical" className="mr-2 h-4" /> <Breadcrumb> <BreadcrumbList> <BreadcrumbItem> <BreadcrumbLink href="/">Home</BreadcrumbLink> </BreadcrumbItem> <BreadcrumbItem> <BreadcrumbLink href="/impact">Environmental Impact</BreadcrumbLink> </BreadcrumbItem> </BreadcrumbList> </Breadcrumb> </header> <main className="p-4 space-y-4"> <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-2"> {/* CO2 Savings Chart */} <Card> <CardHeader> <CardTitle className="flex items-center gap-2"> <RefreshCcw className="h-4 w-4" /> CO2 Savings </CardTitle> </CardHeader> <CardContent> <div className="flex justify-end mb-4"> <Select defaultValue={timeRange} onValueChange={setTimeRange}> <SelectTrigger className="w-32"> <SelectValue placeholder="Select Range" /> </SelectTrigger> <SelectContent> <SelectItem value="all">All Time</SelectItem> <SelectItem value="year">Past Year</SelectItem> <SelectItem value="month">Past Month</SelectItem> </SelectContent> </Select> </div> <ChartContainer config={chartConfig} className="h-[200px]"> <BarChart data={[{ co2: environmental_impact.co2_saved }]} margin={{ top: 20, right: 30, left: 20, bottom: 5 }}> <CartesianGrid strokeDasharray="3 3" /> <XAxis dataKey="name" /> <YAxis /> <ChartTooltip content={<ChartTooltipContent />} /> <Bar dataKey="co2" fill="var(--color-co2)" radius={[4, 4, 0, 0]} /> </BarChart> </ChartContainer> </CardContent> </Card> {/* Trees Saved Chart */} <Card> <CardHeader> <CardTitle className="flex items-center gap-2"> <Trees className="h-4 w-4" /> Trees Saved </CardTitle> </CardHeader> <CardContent> <div className="flex justify-end mb-4"> <Select defaultValue={timeRange} onValueChange={setTimeRange}> <SelectTrigger className="w-32"> <SelectValue placeholder="Select Range" /> </SelectTrigger> <SelectContent> <SelectItem value="all">All Time</SelectItem> <SelectItem value="year">Past Year</SelectItem> <SelectItem value="month">Past Month</SelectItem> </SelectContent> </Select> </div> <ChartContainer config={chartConfig} className="h-[200px]"> <BarChart data={[{ trees: environmental_impact.trees_saved }]} margin={{ top: 20, right: 30, left: 20, bottom: 5 }}> <CartesianGrid strokeDasharray="3 3" /> <XAxis dataKey="name" /> <YAxis /> <ChartTooltip content={<ChartTooltipContent />} /> <Bar dataKey="trees" fill="var(--color-trees)" radius={[4, 4, 0, 0]} /> </BarChart> </ChartContainer> </CardContent> </Card> {/* Materials Recycled by Type */} <Card className="md:col-span-2"> <CardHeader> <CardTitle className="flex items-center gap-2"> <Leaf className="h-4 w-4" /> Materials Recycled by Type </CardTitle> </CardHeader> <CardContent> <div className="flex justify-end mb-4"> <Select defaultValue={timeRange} onValueChange={setTimeRange}> <SelectTrigger className="w-32"> <SelectValue placeholder="Select Range" /> </SelectTrigger> <SelectContent> <SelectItem value="all">All Time</SelectItem> <SelectItem value="year">Past Year</SelectItem> <SelectItem value="month">Past Month</SelectItem> </SelectContent> </Select> </div> <ChartContainer config={chartConfig} className="h-[300px]"> <PieChart> <Pie data={recyclingData} dataKey="value" nameKey="name" cx="50%" cy="50%" outerRadius={80} label > {recyclingData.map((entry, index) => ( <Cell key={`cell-${index}`} fill={`var(--color-${entry.name.toLowerCase()})`} /> ))} </Pie> <ChartTooltip content={<ChartTooltipContent />} /> </PieChart> </ChartContainer> </CardContent> </Card> </div> </main> </SidebarInset> </SidebarProvider> ); }
Leave a Comment