From b4346a9ca6cf283d37d5000bbef97a7505db8e67 Mon Sep 17 00:00:00 2001 From: zeppi Date: Sat, 24 Apr 2021 21:23:34 -0400 Subject: [PATCH] delay preference set two seconds --- dist/bundle.es.js | 59 +++++++++++++----------- src/redux/middleware/shared-state.js | 67 +++++++++++++++------------- 2 files changed, 68 insertions(+), 58 deletions(-) diff --git a/dist/bundle.es.js b/dist/bundle.es.js index b08a080..b3be722 100644 --- a/dist/bundle.es.js +++ b/dist/bundle.es.js @@ -1850,9 +1850,10 @@ function doPreferenceGet(key, success, fail) { // +const RUN_PREFERENCES_DELAY_MS = 2000; const SHARED_PREFERENCE_VERSION = '0.1'; let oldShared = {}; - +let timeout; const buildSharedStateMiddleware = (actions, sharedStateFilters, sharedStateCb) => ({ getState, dispatch @@ -1863,38 +1864,42 @@ const buildSharedStateMiddleware = (actions, sharedStateFilters, sharedStateCb) if (!actions.includes(action.type) || typeof action === 'function') { return next(action); } - + clearTimeout(timeout); const actionResult = next(action); // Call `getState` after calling `next` to ensure the state has updated in response to the action - const nextState = getState(); - const syncEnabled = nextState.settings && nextState.settings.clientSettings && nextState.settings.clientSettings.enable_sync; - const hasVerifiedEmail = nextState.user && nextState.user.user && nextState.user.user.has_verified_email; - const preferenceKey = syncEnabled && hasVerifiedEmail ? 'shared' : 'local'; - const shared = {}; - Object.keys(sharedStateFilters).forEach(key => { - const filter = sharedStateFilters[key]; - const { source, property, transform } = filter; - let value = nextState[source][property]; - if (transform) { - value = transform(value); + function runPreferences() { + const nextState = getState(); + const syncEnabled = nextState.settings && nextState.settings.clientSettings && nextState.settings.clientSettings.enable_sync; + const hasVerifiedEmail = nextState.user && nextState.user.user && nextState.user.user.has_verified_email; + const preferenceKey = syncEnabled && hasVerifiedEmail ? 'shared' : 'local'; + const shared = {}; + + Object.keys(sharedStateFilters).forEach(key => { + const filter = sharedStateFilters[key]; + const { source, property, transform } = filter; + let value = nextState[source][property]; + if (transform) { + value = transform(value); + } + + shared[key] = value; + }); + + if (!isEqual(oldShared, shared)) { + // only update if the preference changed from last call in the same session + oldShared = shared; + dispatch(doPreferenceSet(preferenceKey, shared, SHARED_PREFERENCE_VERSION)); } - shared[key] = value; - }); - - if (!isEqual(oldShared, shared)) { - // only update if the preference changed from last call in the same session - oldShared = shared; - dispatch(doPreferenceSet(preferenceKey, shared, SHARED_PREFERENCE_VERSION)); + if (sharedStateCb) { + // Pass dispatch to the callback to consumers can dispatch actions in response to preference set + sharedStateCb({ dispatch, getState }); + } + clearTimeout(timeout); + return actionResult; } - - if (sharedStateCb) { - // Pass dispatch to the callback to consumers can dispatch actions in response to preference set - sharedStateCb({ dispatch, getState }); - } - - return actionResult; + timeout = setTimeout(runPreferences, RUN_PREFERENCES_DELAY_MS); }; // diff --git a/src/redux/middleware/shared-state.js b/src/redux/middleware/shared-state.js index e4a8c4f..3d40834 100644 --- a/src/redux/middleware/shared-state.js +++ b/src/redux/middleware/shared-state.js @@ -2,9 +2,10 @@ import isEqual from 'util/deep-equal'; import { doPreferenceSet } from 'redux/actions/sync'; +const RUN_PREFERENCES_DELAY_MS = 2000; const SHARED_PREFERENCE_VERSION = '0.1'; let oldShared = {}; - +let timeout; export const buildSharedStateMiddleware = ( actions: Array, sharedStateFilters: {}, @@ -22,40 +23,44 @@ export const buildSharedStateMiddleware = ( if (!actions.includes(action.type) || typeof action === 'function') { return next(action); } - + clearTimeout(timeout); const actionResult = next(action); // Call `getState` after calling `next` to ensure the state has updated in response to the action - const nextState: { user: any, settings: any } = getState(); - const syncEnabled = - nextState.settings && - nextState.settings.clientSettings && - nextState.settings.clientSettings.enable_sync; - const hasVerifiedEmail = - nextState.user && nextState.user.user && nextState.user.user.has_verified_email; - const preferenceKey = syncEnabled && hasVerifiedEmail ? 'shared' : 'local'; - const shared = {}; - Object.keys(sharedStateFilters).forEach(key => { - const filter = sharedStateFilters[key]; - const { source, property, transform } = filter; - let value = nextState[source][property]; - if (transform) { - value = transform(value); + function runPreferences() { + const nextState: { user: any, settings: any } = getState(); + const syncEnabled = + nextState.settings && + nextState.settings.clientSettings && + nextState.settings.clientSettings.enable_sync; + const hasVerifiedEmail = + nextState.user && nextState.user.user && nextState.user.user.has_verified_email; + const preferenceKey = syncEnabled && hasVerifiedEmail ? 'shared' : 'local'; + const shared = {}; + + Object.keys(sharedStateFilters).forEach(key => { + const filter = sharedStateFilters[key]; + const { source, property, transform } = filter; + let value = nextState[source][property]; + if (transform) { + value = transform(value); + } + + shared[key] = value; + }); + + if (!isEqual(oldShared, shared)) { + // only update if the preference changed from last call in the same session + oldShared = shared; + dispatch(doPreferenceSet(preferenceKey, shared, SHARED_PREFERENCE_VERSION)); } - shared[key] = value; - }); - - if (!isEqual(oldShared, shared)) { - // only update if the preference changed from last call in the same session - oldShared = shared; - dispatch(doPreferenceSet(preferenceKey, shared, SHARED_PREFERENCE_VERSION)); + if (sharedStateCb) { + // Pass dispatch to the callback to consumers can dispatch actions in response to preference set + sharedStateCb({ dispatch, getState }); + } + clearTimeout(timeout); + return actionResult; } - - if (sharedStateCb) { - // Pass dispatch to the callback to consumers can dispatch actions in response to preference set - sharedStateCb({ dispatch, getState }); - } - - return actionResult; + timeout = setTimeout(runPreferences, RUN_PREFERENCES_DELAY_MS); };