jiti-meet/react/features/base/storage/middleware.js

49 lines
1.2 KiB
JavaScript
Raw Normal View History

2018-01-29 22:20:38 +00:00
// @flow
import _ from 'lodash';
import { MiddlewareRegistry, toState } from '../redux';
import PersistenceRegistry from './PersistenceRegistry';
/**
* The delay in milliseconds that passes between the last state change and the
* persisting of that state in the storage.
*/
2018-01-29 22:20:38 +00:00
const PERSIST_STATE_DELAY = 2000;
/**
* A throttled function to avoid repetitive state persisting.
*/
2018-01-29 22:20:38 +00:00
const throttledPersistState
= _.throttle(
state => PersistenceRegistry.persistState(state),
2018-01-29 22:20:38 +00:00
PERSIST_STATE_DELAY);
// Web only code.
// We need the <tt>if</tt> beacuse it appears that on mobile the polyfill is not
// executed yet.
if (typeof window.addEventListener === 'function') {
window.addEventListener('unload', () => {
throttledPersistState.flush();
});
}
/**
* A master MiddleWare to selectively persist state. Please use the
* {@link persisterconfig.json} to set which subtrees of the redux state should
2018-01-29 22:20:38 +00:00
* be persisted.
*
* @param {Store} store - The redux store.
* @returns {Function}
*/
MiddlewareRegistry.register(store => next => action => {
const oldState = toState(store);
const result = next(action);
const newState = toState(store);
oldState === newState || throttledPersistState(newState);
return result;
});