From a6cff75c682e5ffdf7a963433923307d5c86a2b9 Mon Sep 17 00:00:00 2001 From: Cosmo Date: Wed, 22 Apr 2026 11:23:13 +0000 Subject: [PATCH] fix: DeviceCard sync initialState from HA on first load --- components/DeviceCard.tsx | 124 ++++++++++++++++---------------------- 1 file changed, 52 insertions(+), 72 deletions(-) diff --git a/components/DeviceCard.tsx b/components/DeviceCard.tsx index b69562e..cd03724 100644 --- a/components/DeviceCard.tsx +++ b/components/DeviceCard.tsx @@ -1,6 +1,6 @@ 'use client' -import { useState } from 'react' +import { useState, useEffect } from 'react' interface DeviceCardProps { id: string @@ -14,21 +14,23 @@ interface DeviceCardProps { } export default function DeviceCard({ - id, - name, - icon, - entityId, - domain, - initialState, - isMock = false, - extraInfo, + 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) + // Sync from HA only once — when real data first arrives (not mock default) + useEffect(() => { + if (!synced && !isMock) { + setIsOn(initialState) + setSynced(true) + } + }, [initialState, isMock, synced]) + const toggle = async () => { const next = !isOn - setIsOn(next) // optimistic update + setIsOn(next) // optimistic if (!isMock && entityId && domain) { setLoading(true) @@ -43,7 +45,6 @@ export default function DeviceCard({ }), }) } catch { - // revert on error setIsOn(!next) } finally { setLoading(false) @@ -51,87 +52,66 @@ export default function DeviceCard({ } } + const accent = '#00d4ff' + return ( -
- {/* Top row: icon + toggle */} +
+ {/* Top: icon + toggle */}
-
+
{icon}
- {/* Toggle button */}
{/* Bottom: name + status */}
-
+
{name}
-
+
{isOn ? 'Включён' : 'Выключен'} {extraInfo && isOn ? ` · ${extraInfo}` : ''}