From d633803ab54447bf883a507bce34f5d7cc32bbec Mon Sep 17 00:00:00 2001 From: Athou Date: Tue, 12 Sep 2023 20:14:17 +0200 Subject: [PATCH] only poll tree if websocket connection is unavailable --- commafeed-client/src/app/slices/server.ts | 14 +++++++++++--- commafeed-client/src/hooks/useWebSocket.ts | 3 +++ commafeed-client/src/pages/app/Layout.tsx | 9 ++++++--- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/commafeed-client/src/app/slices/server.ts b/commafeed-client/src/app/slices/server.ts index 2ebcdd3c..07d5bbcd 100644 --- a/commafeed-client/src/app/slices/server.ts +++ b/commafeed-client/src/app/slices/server.ts @@ -1,18 +1,25 @@ -import { createAsyncThunk, createSlice } from "@reduxjs/toolkit" +import { PayloadAction, createAsyncThunk, createSlice } from "@reduxjs/toolkit" import { client } from "app/client" import { ServerInfo } from "app/types" interface ServerState { serverInfos?: ServerInfo + webSocketConnected: boolean } -const initialState: ServerState = {} +const initialState: ServerState = { + webSocketConnected: false, +} export const reloadServerInfos = createAsyncThunk("server/infos", () => client.server.getServerInfos().then(r => r.data)) export const serverSlice = createSlice({ name: "server", initialState, - reducers: {}, + reducers: { + setWebSocketConnected: (state, action: PayloadAction) => { + state.webSocketConnected = action.payload + }, + }, extraReducers: builder => { builder.addCase(reloadServerInfos.fulfilled, (state, action) => { state.serverInfos = action.payload @@ -20,4 +27,5 @@ export const serverSlice = createSlice({ }, }) +export const { setWebSocketConnected } = serverSlice.actions export default serverSlice.reducer diff --git a/commafeed-client/src/hooks/useWebSocket.ts b/commafeed-client/src/hooks/useWebSocket.ts index 7ee42eb7..1b9bb618 100644 --- a/commafeed-client/src/hooks/useWebSocket.ts +++ b/commafeed-client/src/hooks/useWebSocket.ts @@ -1,3 +1,4 @@ +import { setWebSocketConnected } from "app/slices/server" import { reloadTree } from "app/slices/tree" import { useAppDispatch } from "app/store" import { useEffect } from "react" @@ -12,6 +13,8 @@ export const useWebSocket = () => { const wsUrl = `${wsProtocol}://${currentUrl.hostname}:${currentUrl.port}/ws` const ws = new WebsocketHeartbeatJs({ url: wsUrl, pingMsg: "ping" }) + ws.onopen = () => dispatch(setWebSocketConnected(true)) + ws.onclose = () => dispatch(setWebSocketConnected(false)) ws.onmessage = event => { const { data } = event if (typeof data === "string") { diff --git a/commafeed-client/src/pages/app/Layout.tsx b/commafeed-client/src/pages/app/Layout.tsx index 06435a01..d3e20a79 100644 --- a/commafeed-client/src/pages/app/Layout.tsx +++ b/commafeed-client/src/pages/app/Layout.tsx @@ -94,6 +94,7 @@ export default function Layout(props: LayoutProps) { const { loading } = useAppLoading() const mobile = useMobile() const mobileMenuOpen = useAppSelector(state => state.tree.mobileMenuOpen) + const webSocketConnected = useAppSelector(state => state.server.webSocketConnected) const sidebarHidden = props.sidebarWidth === 0 const dispatch = useAppDispatch() useWebSocket() @@ -106,10 +107,12 @@ export default function Layout(props: LayoutProps) { dispatch(reloadTree()) dispatch(reloadTags()) - // reload tree periodically - const id = setInterval(() => dispatch(reloadTree()), 30000) + // reload tree periodically if not receiving websocket events + const id = setInterval(() => { + if (!webSocketConnected) dispatch(reloadTree()) + }, 30000) return () => clearInterval(id) - }, [dispatch]) + }, [dispatch, webSocketConnected]) const burger = (