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-flow-manager

v1.0.42

Published

Flow Manager System Base

Downloads

240

Readme

redux-flow-manager

Flow Manager helps you manage flow information details and steps (such as showing the next step in the flow), for complicated website relays and flows, i.e eCommerce, buy flows, etc. Flow Manger is using XState for state machine to calculate current position in the flow and where you need to go next.

Motivation

redux-flow-manager was created to help you manage application based flows. In the flow diagram below you can see an example of one representative flow such as you might find in your application. In that flow diagram, each color is a sub flow, and the green and red steps represent start and end of the flow. Redux Flow Manager helps you manage these sub flows and understand where you are and where you need to go.

Foo

Install

npm install --save redux-flow-manager

Usage

Check out the the example in the files app.ts and flowManger.browser.ts in the test folder.

Step 1: Add the flow manager reducer to your project.

import { combineReducers } from 'redux';
import { flowManagerReducer } from 'redux-flow-manager';

const rootReducer = combineReducers({
	flowManager: flowManagerReducer
});

...

Step 2: Create Steps Configuration file - steps config define the set of steps for each sub flow types. (config files properties are explained below. Steps Configuration

Step 3: Create Flows Configuration file - flow config file define the sub flow types name and the conditions that should be success to make this sub flow valid. (config files properties are explained below. Flows Configuration

Step 4: Call CreateFlowManagerAPI with your store, reducer slice name, flows configuration and steps configuration. ( more details of how configuration should be look like will explain later )

// ./index.js
import store from './store';
import CreateFlowManagerAPI from 'redux-flow-manager';

export default CreateFlowManagerAPI(store, 'flowManager', flowsConfig, stepsConfig);

Step 5: CreateFlowManagerAPI return an instance of Flow Manager with functionality that will help you manage flows in your app.

// ./SomeComponent.jsx

class App extends SomeComponent {
    // will set teh main flow type when clock on button
    render() {
        return (
            <button onClick={() => flowManagerAPI.startFlow('CHQ', true);}>
                Start CHQ Flow
            </button>
        );
    }
}
// ./OtherComponent


class App extends OtherComponent {
    // get the next step
    const nextStep = flowManagerAPI.getNextStep();

    render() {
        return (
            <button onClick={() => redirectToStep(nextStep)}>
                Move to Next Step
            </button>
        );
    }
}

Store Structure

interface FlowManagerState {
	flowType: string;
	subFlowTypes: Array<string>;
	currentStep: string;
	nextStep: string;
	steps: Array<string>;
}

Initial Flow Manager

CreateFlowManagerAPI(store, sliceName, flowsConfig, stepsConfig);

Create new instance of flow manager. All the API methods of flow manager describe below.

arguments:

| Property | Type | Required | Default | Description | |:--------------|:--------------|:--------------|:--------------|:--------------| | store | object | Required | undefined | Pass in the redux store. | | sliceName | string | Required | undefined | the name of the reducer slice | | flowsConfig | SubFlowsConfig | Required | undefined | Flows Configuration) | | stepsConfig | StepsConfig | Required | undefined | Steps Configuration) | | nestedSlice | string | Optional | undefined | Set the flow manager data under specific nested slice in the store |

Start and End Flow

async startFlow(flowType, autoUpdate, currentStep, debounceTime)

Start flow is used when your app should initial the main flow type in the store. That flow type represent a set of sub flow types in your Flows Configuration

arguments:

| Property | Type | Required | Default | Description | |:--------------|:--------------|:--------------|:--------------|:--------------| | flowType | string | Required | undefined | The flow type that represent a set of sub flow types Flows Configuration | | currentStep | string | Required | undefined | Initial specific step by start the flow instead of the first step that define in steps array | | autoUpdate | boolean | Optional | undefined | Optionally pass indicate to automatic run state machine calculator to calculate the flow information data for any change in store | | debounceTime | boolean | Optional | undefined | Optionally pass indicate how many time to bounce between auto updates |

endFlow()

End the flow. Clear all the data from flow manager.

arguments:

None

Steps Actions

async updateInformation()

Update Information running the state machine to calculate the sub flows condition and update the steps information and sub flows.

NOTE: If you call startFlow with autoUpdate true, this method invoke automatic for every change in store. This is very useful for auto calculation nd update your component automatic without worry when to call to updateInformation.

arguments:

None

nextStep(step?)

Next Step method update the current step with the next step and the next step with the new next step return the next step value.

NOTE: To Promise last updated result, call to updateInformation before.

arguments:

| Property | Type | Required | Default | Description | |:--------------|:--------------|:--------------|:--------------|:--------------| | step | string | Optional | currentStep | Optional to pass the step move to. by default it move to the next step according to steps array.

isLastStep()

Return if the current step is the last step.

NOTE: To Promise last updated result, call to updateInformation before.

arguments:

None

Selectors

Each Selector return the corresponding value from the store.

NOTE is not recommended to use directly with selector. Use Step Actions async methods to get the most updated result before navigate to next step for example.

  • getFlowType()
  • getSubFlowTypes()
  • getCurrentStep()
  • getSteps()
  • getNextStep()

Flows Configuration

Flows Config is an array of object, that each object define the sub flow that may be in your entire application. Each flow object have conditions array taht each condition include callback. that callback can check anything related to the condition, if the condition you check is success then return resolve, if the condition is failed then return reject.

If all conditions of a sub flow pass, then this sub flow added to the subFlowTypes array

Flow Object Properties:

  • flowName: string - unique name of the sub flow type
  • runInFlowTypes: array<string> - define lise of main flowTypes that this set of conditions will run in
  • conditions: array<condition> - an array of Condition Object
  • conditionName: string - the name of the condition
  • onCheck: function - a promise function that return resolve when the condition success and reject if the condition should be failed
  • mandatory: boolean - optional property. define if to remove that sub flow from the array if this condition failed. true by default.

Each Condition function get in props:

  • state - the current state in the store.
  • context - the current context in the state machine.
  • event - the state machine event who invoke that condition

NOTE The Order of the Flow Objects in the array are matter. The checks will run by that order.

const flowsConfig = [
    {
        flowName: 'planOnlyFlow',
        conditions: [
            {
                conditionName: 'conditionA',
                onCheck: conditionA
            },
            {
                conditionName: 'conditionB',
                onCheck: conditionB,
                mandatory: false
            }
        ]
    },
    {
        flowName: 'onlyAccessoryFlow',
        runInFlowTypes: ['COP'], // this onlyAccessoryFlow check will run only for main COP flowType
        conditions: [
            {
                conditionName: 'conditionC',
                onCheck: conditionC
            },
            {
                conditionName: 'conditionD',
                onCheck: conditionD
            }
        ]
    },
    {
        flowName: 'changePlanFlow',
        runInFlowTypes: ['CHQ'],
        conditions: [
            {
                conditionName: 'conditionA',
                onCheck: conditionA
            },
            {
                conditionName: 'conditionD',
                onCheck: conditionD
            }
        ]
    }
];

Steps Configuration

Steps configuration define for each flow and sub flow, the set of steps that the user need to complete in your application.

Step Object Properties:

  • key: flowType (Example: COP) - the key represent the flowType
  • key: subFlowType (Example: planOnlyFlow) - represent the subFlowType
  • stesp: array - set of steps for this flowType and subFlowType

NOTE The Order of the Sub flow Objects in the object are matter. The checks will run by that order. For example: if you put planOnlyFlow before planOnlyFlow,changePlanFlow, then planOnlyFlow always wil be set before planOnlyFlow,changePlanFlow.

const stepsConfig = {
	COP: {
		onlyAccessoryFlow: {
			steps: [
				'STEP_A',
				'STEP_B',
				'STEP_C',
			]
		}
	},
	CHQ: {
		'planOnlyFlow,changePlanFlow': {
			steps: [
				'STEP_R',
				'STEP_T',
				'STEP_X',
			]
		},
		planOnlyFlow: {
			steps: [
				'STEP_B',
				'STEP_C',
				'STEP_D',
			]
		},
		changePlanFlow: {
			steps: [
				'STEP_A',
				'STEP_D',
				'STEP_E',
			]
		}
	}
};

XState

getMachineFlowConfig()

Return an XState config that can be set in XState visualizer to see your state machine created by your config.

arguments:

None

XState Visualizer Alt text

License

MIT