'use client'; import { useEffect, useState } from 'react'; import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts'; import { format } from 'date-fns'; import { SensorWithLatestReading, Reading, TimeRange } from '@/lib/types'; interface SensorDashboardProps { sensor: SensorWithLatestReading; } export default function SensorDashboard({ sensor }: SensorDashboardProps) { const [readings, setReadings] = useState([]); const [timeRange, setTimeRange] = useState('1d'); const [loading, setLoading] = useState(true); const [customStart, setCustomStart] = useState(''); const [customEnd, setCustomEnd] = useState(''); useEffect(() => { fetchReadings(); }, [sensor.sensorId, timeRange, customStart, customEnd]); const fetchReadings = async () => { setLoading(true); try { let url = `/api/readings?sensorId=${sensor.sensorId}&timeRange=${timeRange}`; if (timeRange === 'custom' && customStart && customEnd) { url = `/api/readings?sensorId=${sensor.sensorId}&startDate=${customStart}&endDate=${customEnd}`; } const response = await fetch(url); const data = await response.json(); setReadings(data); } catch (error) { console.error('Error fetching readings:', error); } finally { setLoading(false); } }; const timeRangeButtons: { value: TimeRange; label: string }[] = [ { value: '1h', label: 'Last Hour' }, { value: '1d', label: 'Last Day' }, { value: '1w', label: 'Last Week' }, { value: '1m', label: 'Last Month' }, { value: 'custom', label: 'Custom' }, ]; // Prepare chart data const chartData = readings.map(reading => ({ timestamp: format(new Date(reading.timestamp), 'MMM dd HH:mm'), ph: reading.ph, turbidity: reading.turbidity, temperature: reading.temperature, hardness: reading.hardness, })); // Calculate statistics const calculateStats = (values: number[]) => { if (values.length === 0) return { min: 0, max: 0, avg: 0 }; return { min: Math.min(...values), max: Math.max(...values), avg: values.reduce((a, b) => a + b, 0) / values.length, }; }; const stats = { ph: calculateStats(readings.map(r => r.ph)), turbidity: calculateStats(readings.map(r => r.turbidity)), temperature: calculateStats(readings.map(r => r.temperature)), hardness: calculateStats(readings.map(r => r.hardness)), }; return (
{/* Time Range Selector */}
{timeRangeButtons.map(({ value, label }) => ( ))}
{timeRange === 'custom' && (
setCustomStart(e.target.value)} className="w-full px-2 py-1.5 text-sm border border-gray-300 rounded" />
setCustomEnd(e.target.value)} className="w-full px-2 py-1.5 text-sm border border-gray-300 rounded" />
)}
{loading ? (
) : readings.length === 0 ? (
No data available for selected time range
) : ( <> {/* Statistics Cards */}
{/* Charts */}
)}
); } function StatCard({ title, current, stats, unit }: any) { return (
{title}
{current?.toFixed(2)} {unit}
Min: {stats.min.toFixed(2)} {unit}
Max: {stats.max.toFixed(2)} {unit}
Avg: {stats.avg.toFixed(2)} {unit}
); } function ChartSection({ title, data, dataKey, color, yDomain }: any) { return (

{title}

); }