public/js/util/storeMiddleware.js (34 lines of code) (raw):

import {replace} from 'react-router-redux'; import _isEqual from 'lodash/isEqual'; import {objectToParamString, paramStringToObject} from './urlParameters'; export const updateUrlFromStateChangeMiddleware = ({dispatch, getState}) => (next) => (action) => { const prevState = getState(); let result = next(action); const newState = getState(); if (!_isEqual(prevState.queryParams, newState.queryParams)) { const location = newState.routing.locationBeforeTransitions; const paramString = `?${objectToParamString(newState.queryParams)}`; if (location && paramString !== location.search) { const newLocation = Object.assign({}, location, { search: paramString || '' }); const updateAction = replace(newLocation); dispatch(updateAction); } } return result; }; export const updateStateFromUrlChangeMiddleware = ({dispatch, getState}) => (next) => (action) => { next(action); const newState = getState(); if (action.type === "@@router/LOCATION_CHANGE") { const urlSearchParams = paramStringToObject(newState.routing.locationBeforeTransitions.search); if (!_isEqual(urlSearchParams, newState.queryParams)) { dispatch({ type: "QUERYPARAMS_UPDATE", queryParams: urlSearchParams, receivedAt: Date.now() }); } } };