'use client' import { useState, useEffect } from 'react' import { Fan, Lightbulb, Tv, Snowflake, Power } from 'lucide-react' interface DeviceCardProps { id: string name: string icon: string entityId?: string domain?: string initialState: boolean isMock?: boolean extraInfo?: string } function getDeviceIcon(id: string, isOn: boolean) { const color = isOn ? '#a5b4fc' : 'rgba(255,255,255,0.35)' const size = 24 if (id.includes('air_purifier')) return if (id.includes('light')) return if (id.includes('tv')) return if (id.includes('ac')) return return } function getDeviceGradient(id: string): string { if (id.includes('air_purifier')) return 'linear-gradient(135deg, rgba(99,102,241,0.2), rgba(139,92,246,0.12))' if (id.includes('light')) return 'linear-gradient(135deg, rgba(251,191,36,0.18), rgba(245,158,11,0.1))' if (id.includes('tv')) return 'linear-gradient(135deg, rgba(59,130,246,0.18), rgba(99,102,241,0.1))' if (id.includes('ac')) return 'linear-gradient(135deg, rgba(34,211,238,0.18), rgba(6,182,212,0.1))' return 'linear-gradient(135deg, rgba(99,102,241,0.15), rgba(139,92,246,0.08))' } function getDeviceBorder(id: string): string { if (id.includes('air_purifier')) return 'rgba(129,140,248,0.25)' if (id.includes('light')) return 'rgba(251,191,36,0.25)' if (id.includes('tv')) return 'rgba(99,102,241,0.25)' if (id.includes('ac')) return 'rgba(34,211,238,0.25)' return 'rgba(129,140,248,0.2)' } export default function DeviceCard({ id, name, icon, entityId, domain, initialState, isMock = false, extraInfo, }: DeviceCardProps) { const [isOn, setIsOn] = useState(initialState) const [synced, setSynced] = useState(false) const [loading, setLoading] = useState(false) useEffect(() => { if (!synced && !isMock) { setIsOn(initialState) setSynced(true) } }, [initialState, isMock, synced]) const toggle = async () => { const next = !isOn setIsOn(next) if (!isMock && entityId && domain) { setLoading(true) try { await fetch('/api/ha', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ domain, service: next ? 'turn_on' : 'turn_off', entity_id: entityId, }), }) } catch { setIsOn(!next) } finally { setLoading(false) } } } return (
{/* Subtle glow effect when on */} {isOn && (
)} {/* Top: icon + toggle */}
{getDeviceIcon(id, isOn)}
{/* Bottom: name + status */}
{name}
{isOn ? 'Включён' : 'Выключен'} {extraInfo && isOn ? ` · ${extraInfo}` : ''}
{isMock && (
demo
)}
) }