only poll tree if websocket connection is unavailable

This commit is contained in:
Athou
2023-09-12 20:14:17 +02:00
parent d7a3b75687
commit d633803ab5
3 changed files with 20 additions and 6 deletions

View File

@@ -1,18 +1,25 @@
import { createAsyncThunk, createSlice } from "@reduxjs/toolkit" import { PayloadAction, createAsyncThunk, createSlice } from "@reduxjs/toolkit"
import { client } from "app/client" import { client } from "app/client"
import { ServerInfo } from "app/types" import { ServerInfo } from "app/types"
interface ServerState { interface ServerState {
serverInfos?: ServerInfo 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 reloadServerInfos = createAsyncThunk("server/infos", () => client.server.getServerInfos().then(r => r.data))
export const serverSlice = createSlice({ export const serverSlice = createSlice({
name: "server", name: "server",
initialState, initialState,
reducers: {}, reducers: {
setWebSocketConnected: (state, action: PayloadAction<boolean>) => {
state.webSocketConnected = action.payload
},
},
extraReducers: builder => { extraReducers: builder => {
builder.addCase(reloadServerInfos.fulfilled, (state, action) => { builder.addCase(reloadServerInfos.fulfilled, (state, action) => {
state.serverInfos = action.payload state.serverInfos = action.payload
@@ -20,4 +27,5 @@ export const serverSlice = createSlice({
}, },
}) })
export const { setWebSocketConnected } = serverSlice.actions
export default serverSlice.reducer export default serverSlice.reducer

View File

@@ -1,3 +1,4 @@
import { setWebSocketConnected } from "app/slices/server"
import { reloadTree } from "app/slices/tree" import { reloadTree } from "app/slices/tree"
import { useAppDispatch } from "app/store" import { useAppDispatch } from "app/store"
import { useEffect } from "react" import { useEffect } from "react"
@@ -12,6 +13,8 @@ export const useWebSocket = () => {
const wsUrl = `${wsProtocol}://${currentUrl.hostname}:${currentUrl.port}/ws` const wsUrl = `${wsProtocol}://${currentUrl.hostname}:${currentUrl.port}/ws`
const ws = new WebsocketHeartbeatJs({ url: wsUrl, pingMsg: "ping" }) const ws = new WebsocketHeartbeatJs({ url: wsUrl, pingMsg: "ping" })
ws.onopen = () => dispatch(setWebSocketConnected(true))
ws.onclose = () => dispatch(setWebSocketConnected(false))
ws.onmessage = event => { ws.onmessage = event => {
const { data } = event const { data } = event
if (typeof data === "string") { if (typeof data === "string") {

View File

@@ -94,6 +94,7 @@ export default function Layout(props: LayoutProps) {
const { loading } = useAppLoading() const { loading } = useAppLoading()
const mobile = useMobile() const mobile = useMobile()
const mobileMenuOpen = useAppSelector(state => state.tree.mobileMenuOpen) const mobileMenuOpen = useAppSelector(state => state.tree.mobileMenuOpen)
const webSocketConnected = useAppSelector(state => state.server.webSocketConnected)
const sidebarHidden = props.sidebarWidth === 0 const sidebarHidden = props.sidebarWidth === 0
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
useWebSocket() useWebSocket()
@@ -106,10 +107,12 @@ export default function Layout(props: LayoutProps) {
dispatch(reloadTree()) dispatch(reloadTree())
dispatch(reloadTags()) dispatch(reloadTags())
// reload tree periodically // reload tree periodically if not receiving websocket events
const id = setInterval(() => dispatch(reloadTree()), 30000) const id = setInterval(() => {
if (!webSocketConnected) dispatch(reloadTree())
}, 30000)
return () => clearInterval(id) return () => clearInterval(id)
}, [dispatch]) }, [dispatch, webSocketConnected])
const burger = ( const burger = (
<Center> <Center>