@ -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 ) ;