@_dawiidio/react-rx-store

Ractive store with RxJS for React

Usage no npm install needed!

<script type="module">
  import DawiidioReactRxStore from 'https://cdn.skypack.dev/@_dawiidio/react-rx-store';
</script>

README

Reactive store

Store for React which uses RxJS

Project launch

build

npm run build

NPM install

npm i -P @_dawiidio/react-rx-store

Simple case study:

State creation:

// file: counterState.jsx
import { map, merge, bufferTime } from "rxjs/operators";
import { interval } from "rxjs";
import { createState } from "@dawiidio/reactive-store";

export const counter = createState(
  // first argument - initial state
  {
      counter: 0
  },
  // second - actions, all in state scope. Every action gets own, custom
  // subject in first param and every action needs to return Observable.
  // Real action exists in `map`, it gets value passed during call and 
  // must return second function which will get in first param current state
  // and return new one.
  {
    increment: (subject) => 
      subject
        .pipe(
          merge(interval(1000)),
          map((value) => (state) => ({
                  ...state,
                  counter: state.counter + value,
              }
            )
          ),
        )
  }
);

How to connect component and state:

// file: Counter.jsx
import { counter } from 'counterState.jsx'; 
import { withStore } from '@dawiidio/reactive-store'; 

export function _Counter({ counter, increment }) {
  // increment(value) is action from our state and it is equal to
  // call next(value)  on action subject
  const onClick = () => increment(counter + 10);
  
  return (
    <div>
      <p>Counter value: </p>
      <h3>{ counter }</h3>
      <button onClick={onClick}>Add 10 to counter</button>
    </div>
  );
}

export const Counter = withStore(counter)(state => {
  // state === state declared in store, you can pass many stores like 
  // withStore(counter, users, ...etc) all their actions and fields will
  // be available in connected component props. 
  
  // if you just return the same state without mutating like me then 
  // leave call empty - withStore(counter)()(_Counter); which is equal 
  // to state => state.
  return state;
}, actions => {
  // second functions can mutate actions from stores, same as state, if you
  // leave empty call it means "return all actions under the same names".
  return actions;
})(_Counter);