From a2475718297600ea3900bc438cad4d99e8245206 Mon Sep 17 00:00:00 2001
From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com>
Date: Fri, 13 Oct 2023 21:20:25 -0500
Subject: [PATCH] check ready state
---
web/src/api/ws.jsx | 45 ++++++++++++++++++++++-----------------------
1 file changed, 22 insertions(+), 23 deletions(-)
diff --git a/web/src/api/ws.jsx b/web/src/api/ws.jsx
index 727bb59d0..9765ccca8 100644
--- a/web/src/api/ws.jsx
+++ b/web/src/api/ws.jsx
@@ -2,7 +2,7 @@ import { createContext } from 'preact';
import { baseUrl } from './baseUrl';
import { produce } from 'immer';
import { useCallback, useContext, useEffect, useReducer } from 'preact/hooks';
-import useWebSocket from 'react-use-websocket';
+import useWebSocket, { ReadyState } from 'react-use-websocket';
const initialState = Object.freeze({ __connected: false });
export const WS = createContext({ state: initialState, connection: null });
@@ -35,9 +35,8 @@ export function WsProvider({
wsUrl = `${baseUrl.replace(/^http/, 'ws')}ws`,
}) {
const [state, dispatch] = useReducer(reducer, initialState);
- console.log(dispatch);
- const { sendJsonMessage } = useWebSocket(wsUrl, {
+ const { sendJsonMessage, readyState } = useWebSocket(wsUrl, {
onMessage: (event) => {
dispatch(event.data);
@@ -47,37 +46,37 @@ export function WsProvider({
});
useEffect(() => {
- Object.keys(config.cameras).forEach((camera) => {
- console.log("Setting up")
- const { name, record, detect, snapshots, audio } = config.cameras[camera];
- dispatch({ topic: `${name}/recordings/state`, payload: record.enabled ? 'ON' : 'OFF', retain: false });
- dispatch({ topic: `${name}/detect/state`, payload: detect.enabled ? 'ON' : 'OFF', retain: false });
- dispatch({ topic: `${name}/snapshots/state`, payload: snapshots.enabled ? 'ON' : 'OFF', retain: false });
- dispatch({ topic: `${name}/audio/state`, payload: audio.enabled ? 'ON' : 'OFF', retain: false });
- });
- }, [config]);
+ if (readyState === ReadyState.OPEN) {
+ Object.keys(config.cameras).forEach((camera) => {
+ const { name, record, detect, snapshots, audio } = config.cameras[camera];
+ dispatch({ topic: `${name}/recordings/state`, payload: record.enabled ? 'ON' : 'OFF', retain: false });
+ dispatch({ topic: `${name}/detect/state`, payload: detect.enabled ? 'ON' : 'OFF', retain: false });
+ dispatch({ topic: `${name}/snapshots/state`, payload: snapshots.enabled ? 'ON' : 'OFF', retain: false });
+ dispatch({ topic: `${name}/audio/state`, payload: audio.enabled ? 'ON' : 'OFF', retain: false });
+ });
+ }
+ }, [config, readyState]);
- return {children};
+ return {children};
}
export function useWs(watchTopic, publishTopic) {
- const { state, sendJsonMessage } = useContext(WS);
-
- console.log(state);
+ const { state, readyState, sendJsonMessage } = useContext(WS);
const value = state[watchTopic] || { payload: null };
const send = useCallback(
(payload, retain = false) => {
- console.log("sending json");
- sendJsonMessage({
- topic: publishTopic || watchTopic,
- payload: payload,
- retain,
- });
+ if (readyState === ReadyState.OPEN) {
+ sendJsonMessage({
+ topic: publishTopic || watchTopic,
+ payload,
+ retain,
+ });
+ }
},
- [sendJsonMessage, watchTopic, publishTopic]
+ [sendJsonMessage, readyState, watchTopic, publishTopic]
);
return { value, send, connected: state.__connected };