npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@jordwest/redux-effects

v0.1.2

Published

Minimalistic side effects library for Redux

Downloads

5

Readme

redux-effects

Simple, tiny side-effects library for Redux

This library is a simple middleware to deal with side effects outside your action creators without using thunks or other complex frameworks.

Example

First, import and add the middleware to your reducer

import {applyMiddleware} from "redux";
import {Effect, effectsMiddleware, afterEffect} from '@jordwest/redux-effects';

return Redux.createStore(
  rootReducer,
  undefined,
  applyMiddleware(effectsMiddleware(rootEffect))
);

Let's say you want to fire an API request when a GET_WIDGETS action is dispatched.

let rootEffect = Effect.all(getWidgets);

const getWidgets = afterEffect(store => async (action) => {
  if (action.type === ActionType.GET_WIDGETS) {
    const widgets = await myApi.getWidgets();

    store.dispatch({ type: POPULATE_WIDGETS, widgets });
  }
});

Because each effect is effectively just a function, you can also pass dependencies to each effect, making it really easy to mock them out in tests.

let rootEffect = myApi => Effect.all(getWidgets(myApi));

const getWidgets = myApi => afterEffect(store => async (action) => {
  if (action.type === ActionType.GET_WIDGETS) {
    const widgets = await myApi.getWidgets();

    store.dispatch({ type: POPULATE_WIDGETS, widgets });
  }
});

You can also perform one-time initialization of an effect in the first function:

const dragDrop = afterEffect(store => {
  let keyDownHandler = (e) => {
    store.dispatch({ type: ActionType.KEY_PRESSED, key: e.key });
  }

  return action => {
    if (action.type === ActionType.START_REPORTING_KEYS) {
      document.addEventListener('keydown', keyDownHandler);
    }
    if (action.type === ActionType.STOP_REPORTING_KEYS) {
      document.removeEventListener('keydown', keyDownHandler);
    }
  }
});

Note that handlers wrapped with afterEffect run actions after the action has been dispatched. For effects that need to run before the action has been dispatched and before state has changed, use beforeEffect.

These functions are just convenience functions that are shorthand for returning an object as the second parameter. If you need to add an effect that acts both before and after dispatch, you can skip the convenience functions and instead do:

const myEffect = store => ({
    before: (action) => { ... },
    after: (action) => { ... },
})

TypeScript

Type definitions are included. For easier type checking, it's recommended to create your own effect type to reuse:

export type AppEffect = Effect<RootState, RootAction>;

const myEffect: AppEffect = afterEffect(store => action => { ... });

// With dependency injection
const myDepEffect = (dependencies: Dependencies): AppEffect => afterEffect(store => action => { ... });