From a3723b5ad751c2ba9c0efae03d4f884e06f01ac1 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sat, 27 Feb 2021 12:10:20 -0800 Subject: [PATCH] Fixed: Restoring a backup with a different API didn't reload properly --- frontend/src/Store/Actions/appActions.js | 71 ++++++++++++++++++++- frontend/src/Store/Actions/systemActions.js | 2 + 2 files changed, 72 insertions(+), 1 deletion(-) diff --git a/frontend/src/Store/Actions/appActions.js b/frontend/src/Store/Actions/appActions.js index 0fd5283e9..297df0460 100644 --- a/frontend/src/Store/Actions/appActions.js +++ b/frontend/src/Store/Actions/appActions.js @@ -1,7 +1,9 @@ import _ from 'lodash'; import { createAction } from 'redux-actions'; +import createAjaxRequest from 'Utilities/createAjaxRequest'; import getSectionState from 'Utilities/State/getSectionState'; import updateSectionState from 'Utilities/State/updateSectionState'; +import { createThunk, handleThunks } from 'Store/thunks'; import createHandleActions from './Creators/createHandleActions'; function getDimensions(width, height) { @@ -22,6 +24,8 @@ function getDimensions(width, height) { export const section = 'app'; const messagesSection = 'app.messages'; +let abortPingServer = null; +let pingTimeout = null; // // State @@ -50,6 +54,8 @@ export const SET_VERSION = 'app/setVersion'; export const SET_APP_VALUE = 'app/setAppValue'; export const SET_IS_SIDEBAR_VISIBLE = 'app/setIsSidebarVisible'; +export const PING_SERVER = 'app/pingServer'; + // // Action Creators @@ -59,6 +65,70 @@ export const setIsSidebarVisible = createAction(SET_IS_SIDEBAR_VISIBLE); export const setAppValue = createAction(SET_APP_VALUE); export const showMessage = createAction(SHOW_MESSAGE); export const hideMessage = createAction(HIDE_MESSAGE); +export const pingServer = createThunk(PING_SERVER); + +// +// Helpers + +function pingServerAfterTimeout(getState, dispatch) { + if (abortPingServer) { + abortPingServer(); + abortPingServer = null; + } + + if (pingTimeout) { + clearTimeout(pingTimeout); + pingTimeout = null; + } + + pingTimeout = setTimeout(() => { + if (!getState().isRestarting && getState().isConnected) { + return; + } + + const ajaxOptions = { + url: '/system/status', + method: 'GET', + contentType: 'application/json' + }; + + const { request, abortRequest } = createAjaxRequest(ajaxOptions); + + abortPingServer = abortRequest; + + request.done(() => { + abortPingServer = null; + pingTimeout = null; + + dispatch(setAppValue({ + isRestarting: false + })); + }); + + request.fail((xhr) => { + abortPingServer = null; + pingTimeout = null; + + // Unauthorized, but back online + if (xhr.status === 401) { + dispatch(setAppValue({ + isRestarting: false + })); + } else { + pingServerAfterTimeout(getState, dispatch); + } + }); + }, 5000); +} + +// +// Action Handlers + +export const actionHandlers = handleThunks({ + [PING_SERVER]: function(getState, payload, dispatch) { + pingServerAfterTimeout(getState, dispatch); + } +}); // // Reducers @@ -135,4 +205,3 @@ export const reducers = createHandleActions({ } }, defaultState, section); - diff --git a/frontend/src/Store/Actions/systemActions.js b/frontend/src/Store/Actions/systemActions.js index abc12e3d6..94221ed95 100644 --- a/frontend/src/Store/Actions/systemActions.js +++ b/frontend/src/Store/Actions/systemActions.js @@ -5,6 +5,7 @@ import { createThunk, handleThunks } from 'Store/thunks'; import createAjaxRequest from 'Utilities/createAjaxRequest'; import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers'; import translate from 'Utilities/String/translate'; +import { pingServer } from './appActions'; import { set } from './baseActions'; import createFetchHandler from './Creators/createFetchHandler'; import createHandleActions from './Creators/createHandleActions'; @@ -352,6 +353,7 @@ export const actionHandlers = handleThunks({ promise.done(() => { dispatch(setAppValue({ isRestarting: true })); + dispatch(pingServer()); }); },