import { useState, useEffect } from 'react'; import { useParams, useNavigate, Link } from 'react-router-dom'; import { ArrowLeft, Thermometer, Droplets, Wind, Zap, Sprout, Calendar, Edit2, Layers, Clock, CheckCircle2, Activity, ClipboardList, Plus, Box } from 'lucide-react'; import api from '../lib/api'; import { Card } from '../components/ui/card'; import { cn } from '../lib/utils'; import { motion } from 'framer-motion'; import { Room3DViewer } from '../components/facility3d/Room3DViewer'; // Mock sensor data generator for Sparklines function generateMockData(count: number, min: number, max: number) { return Array.from({ length: count }, (_, i) => ({ value: min + Math.random() * (max - min), })); } export default function RoomDetailPage() { const { id } = useParams<{ id: string }>(); const navigate = useNavigate(); const [room, setRoom] = useState(null); const [loading, setLoading] = useState(true); const [activeTab, setActiveTab] = useState<'batches' | 'tasks' | 'environment' | '3d'>('batches'); useEffect(() => { if (id) { setLoading(true); api.get(`/rooms/${id}`) .then(res => setRoom(res.data)) .catch(() => navigate('/rooms')) .finally(() => setLoading(false)); } }, [id, navigate]); if (loading) { return (
); } if (!room) return null; const sensorData = { temp: generateMockData(20, 72, 78), humidity: generateMockData(20, 45, 55), vpd: generateMockData(20, 0.9, 1.3), co2: generateMockData(20, 1000, 1400), }; return (
{/* Header / Hero */}

{room.name?.replace('[DEMO] ', '')}

{room.type} Phase
{room.sqft?.toLocaleString()} SQFT
{room.capacity || 0} Plants max
System Nominal
{/* Environmental Dashboard */}
{/* Content Tabs */}
setActiveTab('batches')} /> setActiveTab('3d')} /> setActiveTab('tasks')} /> setActiveTab('environment')} />
{activeTab === '3d' && ( )} {activeTab === 'batches' && (
{room.batches?.map((batch: any) => (

{batch.name}

{batch.strain} • {batch.plantCount} plants

{batch.stage}
Day {Math.floor((Date.now() - new Date(batch.startDate).getTime()) / 86400000)}
))}
)} {activeTab === 'tasks' && (
{[ { title: 'De-fan Fan Leaves', assignee: 'John D.', priority: 'HIGH', due: 'Today' }, { title: 'Irrigation Maintenance', assignee: 'Sarah K.', priority: 'MED', due: 'Tomorrow' }, { title: 'IPM Foliar Spray', assignee: 'John D.', priority: 'CRITICAL', due: '2h ago' }, { title: 'Verify Light Intensity', assignee: 'None', priority: 'LOW', due: 'Friday' }, ].map((task, i) => (

{task.title}

Assigned: {task.assignee} Due: {task.due}
))}
)}
); } function MetricCard({ icon: Icon, label, value, unit, color, fill, data }: { icon: any; label: string; value: string | number; unit: string; color: string; fill: string; // added back to control sparkline background opacity data: { value: number }[]; }) { return (
{label}
{value} {unit}
); } function SparklineLine({ data, color }: { data: { value: number }[], color: string }) { const values = data.map(d => d.value); const min = Math.min(...values); const max = Math.max(...values); const range = max - min || 1; const width = 80; const height = 30; const points = data.map((d, i) => { const x = (i / (data.length - 1)) * width; const y = height - ((d.value - min) / range) * height; return `${x},${y}`; }).join(' '); return ( ); } function TabButton({ active, icon: Icon, label, count, onClick }: { active: boolean, icon: any, label: string, count?: number, onClick: () => void }) { return ( ); }