Add Redux custom middleware dynamically

Writing a custom middleware and injecting it on runtime.

Thu, 12 Apr 2018

Redux middlewares can be used for a variety of things. You can basically tap into a redux event and perform some action with it. Logging and analytics are very common use cases for Redux middleware.

In my case, I have a middleware component, that needs to be injected while initializing the Redux store. The middleware component will be served dynamically when the app loads.

Exporting the middleware component

This middleware detects a specific redux action and persist an information to the local storage. It’s a custom middleware with a minimal change. This custom function takes in middlewareAPI as the parameter instead of having the state.

  const persistInfo = middlewareAPI => next => (action) => {
    if (action.type === "SOME_ACTION") {
      const result = next(action);
      const state =
            JSON.stringify(middlewareAPI.getState().listen.value);
      window.localStorage.setItem('PERSIST_THIS_INFO', state);
      return result;
    }
    return next(action);
  };
  
  export default persistInfo;
  

Loading the custom middleware

Here is a small utility function that can take in a custom middleware and initialize the store.

  import { createStore, compose } from 'redux';
  import reducers from './reducers';
  
  class Store {
      constructor() {
        const composeEnhancers =
          typeof window === 'object' &&
          window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ?
            window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({}) : compose;
  
        this.store = createStore(reducers);
      }
    
      instance() {
        return this.store;
      }
    
      addMiddleware(middleware) {
        const middlewareAPI = {
          getState: this.store.getState,
          dispatch: action => this.store.dispatch(action),
        };
        this.store.dispatch = compose(middleware(middlewareAPI))(this.store.dispatch);
      }
    }
    export default new Store();

This is my store class with the store initialization happens in the constructor. Simply, importing this store class and calling the addMiddleware function it’s possible to inject the custom middleware component to your redux store.

Loading...
Prasanna

Prasanna is a full stack web developer, loves to build user interfaces with Javascript. Considers himself as a geek, quick learner and a team player 😃

  • rants and writings through personal experience