diff --git a/CHANGELOG.md b/CHANGELOG.md index 57895389..04e2e81e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,12 @@ See also the [v0.107.42 GitHub milestone][ms-v0.107.42]. NOTE: Add new changes BELOW THIS COMMENT. --> +### Fixed + +- Protection pause timer synchronization ([#5759]). + +[#5759]: https://github.com/AdguardTeam/AdGuardHome/issues/5759 + diff --git a/client/src/actions/index.js b/client/src/actions/index.js index c577011f..e0e50841 100644 --- a/client/src/actions/index.js +++ b/client/src/actions/index.js @@ -338,6 +338,40 @@ export const getDnsStatus = () => async (dispatch) => { } }; +export const timerStatusRequest = createAction('TIMER_STATUS_REQUEST'); +export const timerStatusFailure = createAction('TIMER_STATUS_FAILURE'); +export const timerStatusSuccess = createAction('TIMER_STATUS_SUCCESS'); + +export const getTimerStatus = () => async (dispatch) => { + dispatch(timerStatusRequest()); + + const handleRequestError = () => { + dispatch(addErrorToast({ error: 'dns_status_error' })); + dispatch(dnsStatusFailure()); + window.location.reload(true); + }; + + const handleRequestSuccess = (response) => { + const dnsStatus = response.data; + if (dnsStatus.protection_disabled_duration === 0) { + dnsStatus.protection_disabled_duration = null; + } + const { running } = dnsStatus; + const runningStatus = dnsStatus && running; + if (runningStatus === true) { + dispatch(timerStatusSuccess(dnsStatus)); + } else { + dispatch(setDnsRunningStatus(running)); + } + }; + + try { + checkStatus(handleRequestSuccess, handleRequestError); + } catch (error) { + handleRequestError(); + } +}; + export const testUpstreamRequest = createAction('TEST_UPSTREAM_REQUEST'); export const testUpstreamFailure = createAction('TEST_UPSTREAM_FAILURE'); export const testUpstreamSuccess = createAction('TEST_UPSTREAM_SUCCESS'); diff --git a/client/src/components/App/index.js b/client/src/components/App/index.js index 797bf1bc..9cf0083d 100644 --- a/client/src/components/App/index.js +++ b/client/src/components/App/index.js @@ -28,7 +28,7 @@ import { } from '../../helpers/constants'; import { getLogsUrlParams, setHtmlLangAttr, setUITheme } from '../../helpers/helpers'; import Header from '../Header'; -import { changeLanguage, getDnsStatus } from '../../actions'; +import { changeLanguage, getDnsStatus, getTimerStatus } from '../../actions'; import Dashboard from '../../containers/Dashboard'; import SetupGuide from '../../containers/SetupGuide'; @@ -126,6 +126,18 @@ const App = () => { useEffect(() => { dispatch(getDnsStatus()); + + const handleVisibilityChange = () => { + if (document.visibilityState === 'visible') { + dispatch(getTimerStatus()); + } + }; + + document.addEventListener('visibilitychange', handleVisibilityChange); + + return () => { + document.removeEventListener('visibilitychange', handleVisibilityChange); + }; }, []); const setLanguage = () => { diff --git a/client/src/reducers/dashboard.js b/client/src/reducers/dashboard.js index f23717f9..f47a1732 100644 --- a/client/src/reducers/dashboard.js +++ b/client/src/reducers/dashboard.js @@ -44,6 +44,19 @@ const dashboard = handleActions( return newState; }, + [actions.timerStatusSuccess]: (state, { payload }) => { + const { + protection_enabled: protectionEnabled, + protection_disabled_duration: protectionDisabledDuration, + } = payload; + const newState = { + ...state, + protectionEnabled, + protectionDisabledDuration, + }; + + return newState; + }, [actions.getVersionRequest]: (state) => ({ ...state,