123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- // @flow
-
- import { APP_WILL_MOUNT, APP_WILL_UNMOUNT } from '../app';
- import { MiddlewareRegistry } from '../redux';
-
- import { USER_INTERACTION_RECEIVED } from './actionTypes';
-
- /**
- * Reference to any callback that has been created to be invoked on user
- * interaction.
- *
- * @type {Function|null}
- */
- let userInteractionListener = null;
-
- /**
- * Implements the entry point of the middleware of the feature base/user-interaction.
- *
- * @param {Store} store - The redux store.
- * @returns {Function}
- */
- MiddlewareRegistry.register(store => next => action => {
- switch (action.type) {
- case APP_WILL_MOUNT:
- _startListeningForUserInteraction(store);
- break;
-
- case APP_WILL_UNMOUNT:
- _stopListeningForUserInteraction();
- break;
- }
-
- return next(action);
- });
-
- /**
- * Callback invoked when the user interacts with the page.
- *
- * @param {Function} dispatch - The redux dispatch function.
- * @param {Object} event - The DOM event for a user interacting with the page.
- * @private
- * @returns {void}
- */
- function _onUserInteractionReceived(dispatch, event) {
- if (event.isTrusted) {
- dispatch({
- type: USER_INTERACTION_RECEIVED
- });
-
- _stopListeningForUserInteraction();
- }
- }
-
- /**
- * Registers listeners to notify redux of any user interaction with the page.
- *
- * @param {Object} store - The redux store.
- * @private
- * @returns {void}
- */
- function _startListeningForUserInteraction({ dispatch }) {
- _stopListeningForUserInteraction();
-
- userInteractionListener = _onUserInteractionReceived.bind(null, dispatch);
-
- window.addEventListener('mousedown', userInteractionListener);
- window.addEventListener('keydown', userInteractionListener);
- }
-
- /**
- * De-registers listeners for user interaction with the page.
- *
- * @private
- * @returns {void}
- */
- function _stopListeningForUserInteraction() {
- window.removeEventListener('mousedown', userInteractionListener);
- window.removeEventListener('keydown', userInteractionListener);
-
- userInteractionListener = null;
- }
|