import { useEffect, useState } from 'react'; import { Link } from 'react-router-dom'; import { Home, Plus, Thermometer, Droplets, ChevronRight, Activity, Leaf, Flower, ShieldCheck, ArrowRight, Wand2 } from 'lucide-react'; import api from '../lib/api'; import { usePermissions } from '../hooks/usePermissions'; import { Card } from '../components/ui/card'; import { cn } from '../lib/utils'; import { RoomLayoutWizard } from '../components/layout/RoomLayoutWizard'; export default function RoomsPage() { const { isManager } = usePermissions(); const [rooms, setRooms] = useState([]); const [isLoading, setIsLoading] = useState(true); const [isWizardOpen, setIsWizardOpen] = useState(false); useEffect(() => { fetchRooms(); }, []); const fetchRooms = async () => { setIsLoading(true); try { const { data } = await api.get('/rooms'); setRooms(data); } catch (e) { console.error(e); } finally { setIsLoading(false); } }; const getRoomStyle = (type: string) => { const styles: Record = { VEG: { accent: 'emerald', icon: Leaf }, FLOWER: { accent: 'purple', icon: Flower }, DRY: { accent: 'amber', icon: Activity }, CURE: { accent: 'orange', icon: Activity }, MOTHER: { accent: 'pink', icon: Leaf }, TRIM: { accent: 'slate', icon: Activity }, CLONE: { accent: 'teal', icon: Leaf }, }; return styles[type] || { accent: 'slate', icon: Home }; }; const vegCount = rooms.filter(r => r.type === 'VEG').length; const flowerCount = rooms.filter(r => r.type === 'FLOWER').length; const totalBatches = rooms.reduce((acc, r) => acc + (r.batches?.length || 0), 0); return (
{/* Page Header */}

Cultivation Zones

{rooms.length} Active Zones • Environmental Controls Active
{isManager && ( )}
{/* KPI Strip */}

Total Zones

{rooms.length}

Veg Rooms

{vegCount}

Flower Rooms

{flowerCount}

Active Batches

{totalBatches}

{/* Room Grid */} {isLoading ? (
{Array.from({ length: 6 }).map((_, i) => (
))}
) : rooms.length === 0 ? (

No Cultivation Zones Configured

{isManager && (
)}
) : (
{rooms.map(room => { const { accent, icon: Icon } = getRoomStyle(room.type); const accentClasses = { emerald: 'bg-[var(--color-primary)]/10 text-[var(--color-primary)] border-emerald-500/20', purple: 'bg-purple-500/10 text-purple-500 border-purple-500/20', amber: 'bg-[var(--color-warning)]/10 text-[var(--color-warning)] border-amber-500/20', orange: 'bg-orange-500/10 text-orange-500 border-orange-500/20', pink: 'bg-pink-500/10 text-pink-500 border-pink-500/20', slate: 'bg-slate-500/10 text-[var(--color-text-tertiary)] border-slate-500/20', teal: 'bg-teal-500/10 text-teal-500 border-teal-500/20', }; return ( {/* Header */}
{room.type}
{/* Body */}

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

{room.sqft?.toLocaleString()} sqft • Capacity {room.capacity || '—'}

{/* Environmental Vitals */}
{room.targetTemp || '—'}°F
Target Temp
{room.targetHumidity || '—'}%
Target RH
{/* Batch Status */}
0 ? 'bg-[var(--color-primary)]' : 'bg-slate-300 dark:bg-slate-700')} /> {room.batches?.length || 0} Active Batch{room.batches?.length === 1 ? '' : 'es'}
Enter →
); })}
)} setIsWizardOpen(false)} onSuccess={fetchRooms} floorId="default-floor-id" />
); }