"use client"; import { useState, useCallback } from "react"; import { motion, AnimatePresence } from "framer-motion"; import { Wind } from "lucide-react"; import { toggleFan, setFanPreset } from "@/lib/api"; interface Props { entityId: string; state: string; presetMode?: string; onUpdate: () => void; } const MODES = [ { id: "Auto", label: "Авто", color: "#10b981" }, { id: "Night", label: "Ночь", color: "#6366f1" }, { id: "High", label: "Турбо", color: "#f59e0b" }, ]; export default function AirPurifierCard({ entityId, state, presetMode, onUpdate }: Props) { const [localOn, setLocalOn] = useState(state === "on"); const [currentMode, setCurrentMode] = useState(presetMode || "Auto"); const [pending, setPending] = useState(false); const handleToggle = useCallback(async () => { if (pending) return; const newState = !localOn; setLocalOn(newState); setPending(true); try { await toggleFan(entityId, newState); onUpdate(); } catch (e) { setLocalOn(!newState); } setPending(false); }, [entityId, localOn, pending, onUpdate]); const handleMode = useCallback(async (mode: string) => { setCurrentMode(mode); await setFanPreset(entityId, mode); onUpdate(); }, [entityId, onUpdate]); const isOn = localOn; const activeMode = MODES.find((m) => m.id === currentMode) || MODES[0]; const accentColor = isOn ? activeMode.color : "rgba(255,255,255,0.3)"; return ( {/* Top row */}
Очиститель
{isOn ? activeMode.label : "Выключен"}
{/* Toggle — native button */}
{/* Mode buttons */}
{MODES.map((mode) => { const isActive = currentMode === mode.id && isOn; return ( ); })}
); }