guarding component web socket a little better
This commit is contained in:
parent
db9742ed32
commit
55bff3af00
1 changed files with 17 additions and 7 deletions
|
|
@ -172,15 +172,25 @@ export default function DevicePage() {
|
|||
// Streams all component changes for this device.
|
||||
// When the backend receives a new reading and updates a component,
|
||||
// this fires and updates the component in state without a page refresh.
|
||||
useWebSocket<{ key: string; component: Component }>({
|
||||
path: `/v1/live/devices/${deviceID}/components`,
|
||||
useWebSocket<{ key: string; component: Component } | null>({
|
||||
path: `/live/devices/${deviceID}/components`,
|
||||
parse: (e) => {
|
||||
const raw = JSON.parse(e.data);
|
||||
const comp = Component.any(raw);
|
||||
return { key: comp.key(), component: comp };
|
||||
try {
|
||||
const raw = JSON.parse(e.data);
|
||||
const comp = Component.any(raw);
|
||||
if (!comp?.settings) {
|
||||
console.warn("[ws] received component without settings:", raw);
|
||||
return null;
|
||||
}
|
||||
return { key: comp.key(), component: comp };
|
||||
} catch (err) {
|
||||
console.warn("[ws] failed to parse component:", err);
|
||||
return null;
|
||||
}
|
||||
},
|
||||
onMessage: ({ key, component }) => {
|
||||
// Functional update so we always work with the latest state
|
||||
onMessage: (data) => {
|
||||
if (!data) return;
|
||||
const { key, component } = data;
|
||||
setComponents((prev) => {
|
||||
const updated = new Map(prev);
|
||||
updated.set(key, component);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue