import { useState } from 'react'; interface FoodMilesTrackerProps { data: FoodMilesData[]; currentTotal: number; targetMiles?: number; } export interface FoodMilesData { date: string; miles: number; carbonKg: number; eventType?: string; produceType?: string; } type TimeRange = '7d' | '30d' | '90d' | '365d'; export default function FoodMilesTracker({ data, currentTotal, targetMiles = 50, }: FoodMilesTrackerProps) { const [timeRange, setTimeRange] = useState('30d'); // Filter data based on time range const filterData = (range: TimeRange): FoodMilesData[] => { const now = new Date(); const daysMap: Record = { '7d': 7, '30d': 30, '90d': 90, '365d': 365, }; const cutoff = new Date(now.getTime() - daysMap[range] * 24 * 60 * 60 * 1000); return data.filter((d) => new Date(d.date) >= cutoff); }; const filteredData = filterData(timeRange); // Calculate stats for filtered period const totalMiles = filteredData.reduce((sum, d) => sum + d.miles, 0); const totalCarbon = filteredData.reduce((sum, d) => sum + d.carbonKg, 0); const avgMilesPerDay = filteredData.length > 0 ? totalMiles / filteredData.length : 0; // Group data by day for chart const dailyData: Record = {}; filteredData.forEach((d) => { const day = d.date.split('T')[0]; if (!dailyData[day]) { dailyData[day] = { miles: 0, carbon: 0 }; } dailyData[day].miles += d.miles; dailyData[day].carbon += d.carbonKg; }); const chartData = Object.entries(dailyData).sort((a, b) => a[0].localeCompare(b[0])); const maxMiles = Math.max(...chartData.map(([_, d]) => d.miles), 1); // Progress towards target const progressPercentage = Math.min((currentTotal / targetMiles) * 100, 100); const isOverTarget = currentTotal > targetMiles; // Recent events const recentEvents = [...data].sort( (a, b) => new Date(b.date).getTime() - new Date(a.date).getTime() ).slice(0, 5); return (
{/* Header */}

Food Miles Tracker

Monitor your produce transportation distances

{/* Time range selector */}
{(['7d', '30d', '90d', '365d'] as TimeRange[]).map((range) => ( ))}
{/* Current total with target */}

Current Period Total

{totalMiles.toFixed(1)} km

Target

{targetMiles} km

{/* Progress bar */}
{/* Target marker */}
Target

{isOverTarget ? `${(currentTotal - targetMiles).toFixed(1)} km over target` : `${(targetMiles - currentTotal).toFixed(1)} km remaining to target`}

{/* Stats row */}

{filteredData.length}

Transport Events

{totalCarbon.toFixed(2)}

kg CO2 Total

{avgMilesPerDay.toFixed(1)}

Avg km/day

{/* Simple bar chart */} {chartData.length > 0 && (

Daily Food Miles

{chartData.slice(-14).map(([date, values], index) => { const height = (values.miles / maxMiles) * 100; return (
{new Date(date).getDate()}
); })}

Last 14 days

)} {/* Recent events */} {recentEvents.length > 0 && (

Recent Transport Events

{recentEvents.map((event, index) => (

{event.produceType || event.eventType || 'Transport'}

{new Date(event.date).toLocaleDateString()}

{event.miles.toFixed(1)} km

{event.carbonKg.toFixed(3)} kg CO2

))}
)} {/* Comparison info */}

Did you know?

The average food item in conventional supply chains travels 2,400 km before reaching your plate. LocalGreenChain helps reduce this by connecting you with local growers.

Your average: {avgMilesPerDay.toFixed(1)} km/day vs Conventional: 6.6 km/day {avgMilesPerDay < 6.6 && ( ({((1 - avgMilesPerDay / 6.6) * 100).toFixed(0)}% better!) )}
); }