"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 isOn = state === "on"; const [currentMode, setCurrentMode] = useState(presetMode || "Auto"); const [pending, setPending] = useState(false); const handleToggle = useCallback(async () => { if (pending) return; setPending(true); await toggleFan(entityId, !isOn); onUpdate(); setPending(false); }, [entityId, isOn, pending, onUpdate]); const handleMode = useCallback( async (mode: string) => { setCurrentMode(mode); await setFanPreset(entityId, mode); onUpdate(); }, [entityId, onUpdate] ); const activeMode = MODES.find((m) => m.id === currentMode) || MODES[0]; const accentColor = isOn ? activeMode.color : "rgba(255,255,255,0.3)"; return ( {/* Top row: icon + name + toggle */}
{/* Animated icon */}
Очиститель воздуха
{isOn ? activeMode.label : "Выключен"}
{/* Toggle */}
{/* Mode buttons */} {isOn && ( {MODES.map((mode) => { const isActive = currentMode === mode.id; return ( handleMode(mode.id)} className="flex-1 py-2.5 rounded-2xl text-sm font-semibold" style={ isActive ? { background: `${mode.color}22`, border: `1.5px solid ${mode.color}60`, color: mode.color, boxShadow: `0 0 14px ${mode.color}30`, } : { background: "rgba(255,255,255,0.05)", border: "1px solid rgba(255,255,255,0.08)", color: "var(--text-secondary)", } } whileTap={{ scale: 0.88 }} > {mode.label} ); })} )} {/* Offline state bottom fill */} {!isOn && (
{MODES.map((mode) => (
{mode.label}
))}
)}
); }