Untitled
unknown
plain_text
a year ago
7.8 kB
8
Indexable
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>
);
}Editor is loading...
Leave a Comment