Home Reference Source

src/utils/observeStore.js

import { isEqual, isEmpty } from 'lodash';
/**
 * Утилита позволяющая подписываться на изменения хранилища через селектор. В случае изменения вызывается callback
 * @param {Object} store - хранилище Redux
 * @param {Function} select - селектор возвращающий нужное значение
 * @param {Function} onChange - callback функция вызывающаяся при изменение данных
 * @example
 * class MyObserveExample extends React.Component {
 * ...
 *  componentDidMount() {
 *    observeStore(this.context.store, (state) => state.dataList, (state) =>
 *      this.setState({
 *        data: state
 *      })
 *    );
 *  }
 * ...
 * }
 *
 * MyObserveExample.contextTypes = {
 *  store: PropTypes.object,
 * };
 */
export default function observeStore(store, select, onChange) {
  let currentState;

  function handleChange() {
    let nextState = select(store.getState());
    if (!isEqual(nextState, currentState) && !isEmpty(nextState)) {
      currentState = nextState;
      onChange(currentState);
    }
  }

  let unsubscribe = store.subscribe(handleChange);
  handleChange();
  return unsubscribe;
}