Blog>
Snippets

Conditional Dispatch Middleware

Set up a middleware that inspects action types and conditionally stops or modifies actions in Redux 5.0.0 depending on certain state conditions.
function conditionalDispatchMiddleware(store) {
  return function(next) {
    return function(action) {
      // Inspect the state before the action is handled
      const state = store.getState();

      // Check for a specific condition based on the current state
      // and the action being dispatched
      if (action.type === 'SOME_ACTION_TYPE' && state.someCondition) {
        // Stop the action from being dispatched
        console.log('Action stopped by conditionalDispatchMiddleware.');
        return;
      }

      // If desired, modify the action here before it's sent to the next middleware or reducer

      // Send the action to the next middleware
      return next(action);
    };
  };
}
This JavaScript function defines a Redux middleware called `conditionalDispatchMiddleware` that stops or modifies certain actions based on the state of the Redux store. The middleware inspects each action that is dispatched. If the action's type is 'SOME_ACTION_TYPE' and a particular condition in the state (specific in `state.someCondition`) is met, the action is stopped by not calling `next(action)`. If the condition is not met or the action type is different, the middleware passes the action to the next middleware or reducer in the chain by calling `next(action)`.
// Import applyMiddleware from Redux to apply your middleware
import { createStore, applyMiddleware } from 'redux';
import rootReducer from './reducers';

// Create the store and apply the conditionalDispatchMiddleware
const store = createStore(
  rootReducer,
  applyMiddleware(conditionalDispatchMiddleware)
);
This JavaScript snippet makes use of the Redux `applyMiddleware` function to apply the `conditionalDispatchMiddleware` to the Redux store during its creation. It imports the middleware function defined earlier, the root reducer (`rootReducer`) from the reducers file, and creates the store with these configurations. The middleware will now be a part of the store's dispatch chain and can conditionally stop or modify actions based on the current state.
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Redux Middleware Example</title>
  <style>
    body {
      font-family: Arial, sans-serif;
    }
  </style>
</head>
<body>
  <div id="app">
    <!-- Content will be dynamically injected by JS -->
    <h1>Conditional Dispatch Middleware</h1>
  </div>
  <script src="path_to_your_bundled_js"></script>
</body>
</html>
This HTML document provides a basic web page that can serve as the environment for running our Redux application with the conditional dispatch middleware. The `path_to_your_bundled_js` should be replaced with the actual path to your JavaScript bundle that includes Redux, any reducers, and the middleware. It also includes a placeholder element with the ID 'app' where our React components or other dynamic content can be rendered.