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

redux-lz-controller

v1.4.0

Published

Controller that regroup Action and Reducer with helpers

Downloads

45

Readme

redux-lz-controller

CodeQL Node.js CI Quality Gate Status codecov

Regrouping action and reducer into a controller

Installation

yarn add redux-lz-controller
npm install redux-lz-controller

Usage

This example shows how to integrate in React

index.js

...
// Import our controller and Redux
import { Controller } from "redux-lz-controller";
import * as ReduxThunk from "redux-thunk";
import { persistReducer } from "redux-persist";
import storage from "redux-persist/lib/storage";
import * as Redux from "redux";
import { Provider } from "react-redux";
//

// Initialization of all our app controllers
import ContactsController from "./controllers/ContactsController";
new ContactsController();
//

const persistConfig = {
  key: "root",
  storage: storage,
  blacklist: ["notifications"]
};

// Retrieve our global reducers
let rootReducer = Controller.getReducers();
//
rootReducer = persistReducer(persistConfig, rootReducer);

let store = Redux.createStore(rootReducer, Redux.compose(Redux.applyMiddleware(ReduxThunk.default)));
// Add store to controller
Controller.setStore(store);

// Now render your application

ContactsController.ts

import { Controller } from "redux-lz-controller";

// Extends library controller
class ContactsController extends Controller {
  constructor() {
    // This controller manage the subtree "contacts" of global Redux state
    super("contacts", { contactsList: [] }); // its default value is an empty array
  }

  // We expose a method to add a contact
  addContact(newContact: any, callback: any) {
    // We simulate an asynchronous action
    this.asyncAction(
      /*
      The name of the Event
      
      It will generate a ADD_CONTACT event first
      Execute the content of the method asynchronously
      Then if success a ADD_CONTACT_SUCCESS
      Or if promise reject a ADD_CONTACT_FAILED
      */
      "ADD_CONTACT",
      async (dispatch: any, getState: any) => {
        let contacts = [...this.getLocalState().contactsList];
        // Here we should use the ajax method
        return { contactsList: [...contacts, newContact] };
      },
      // A Post action callback if UI need to update its local state
      callback
    );
  }
}

export default ContactsController;

Depending on the size of your application, we recommend grouping the different controllers in a single folder (here: /controllers )

In your App or Component

...
import React, { useState } from "react";
import { Controller } from "redux-lz-controller";
import { useSelector } from "react-redux";
// other imports depending on your own cooking
...

const App = () => {

  const classes = useStyles();
  const [current, setCurrent] = useState({ name: "", email: "" })

  const async = useSelector(state => state.contacts._async.ADD_CONTACT || {});
  const contactsList = useSelector(state => state.contacts.contactsList);

  const handleChange = (e, { name, value }) => {
    setCurrent({ ...current, [name]: value })
  };

  const handleSubmit = () => {
    Controller.get("contacts").addContact(current, () => {
      // Add here your callback logic 
      // in this specific example we want the current state to be cleared after contact has been added
      setCurrent({ name: "", email: "" });
    });
  };

  return (
    <div className={classes.app}>
      <header>
        <p>Redux Loopingz Controller integration for React</p>
      </header>
      <Form onSubmit={handleSubmit}>
        <Form.Group>
          <Form.Input
            placeholder="Name"
            name="name"
            value={current.name}
            onChange={handleChange}
          />
          <Form.Input
            placeholder="Email"
            name="email"
            value={current.email}
            onChange={handleChange}
          />
          <Form.Button content="Submit" />
        </Form.Group>
      </Form>
    </div>
  );
}

export default App;

Troubleshoot

Action are visible but state is not updated

This is more likely because you did not register the Controller middleware