mirror of
https://github.com/Athou/commafeed.git
synced 2026-03-21 21:37:29 +00:00
only poll tree if websocket connection is unavailable
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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") {
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user