0.1.0 • Published 3 years ago

okos v0.1.0

Weekly downloads
-
License
ISC
Repository
github
Last release
3 years ago

okos

okos is a library for storing and managing data in react js, written in TS

Features

  • Immer. I used immer to let you to mutate the state in actions

Get started

1. Import neccessary stuff

import { createStore, selectorFactory } from "okos";

2. First of all you should init yout store

(example.service.ts)
--------------------
import { createStore } from "okos";

export interface ICounterService {
  counter: number;
}

const initialState: ICounterService = {
  counter: 0,
};

export const counterService = createStore(initialState);

3. Then you may add neccessary actions for your store

(example.service.ts)
--------------------
...
export const counterService = createStore(initialState, {
   
  // The only one you should provide is a payload type(it's number here)
  // State type defines automaticlly 
  increment(state, additive: number) {
    state.counter += additive;
  },
  
  // Same here
  decrement(state, additive: number) {
  
    // Also you can use another defined actions by using "this" keyword, example below: 
    this.increment(state, -additive);
  },
});

// Don't forgot about exporting your actions to use them later
export const { increment, decrement } = counterService.actions;
...

4. And try to use it now:

(example.tsx)
------------
import React from "react";
import { increment, decrement } from "./example.service";

export const Example = () => {
  return (
    <div>
      <h2>okos</h2>
      <h3>{/* We will use counter state here */}</h3>
      <button onClick={() => increment(1)}>increment</button>
      <button onClick={() => decrement(1)}>decrement</button>
    </div>
  );
};

You can see, that it's very easy to use it like a common functions

5. Let's try to use our store to make a state of our store

Create specific selector hook for our store

(example.service.ts)
-------------------
import { createStore, selectorFactory } from "okos";
...
export const useCounterSelector = selectorFactory(counterService.store);
...

And use it in our example component

(example.tsx)
------------
...
export const Example = () => {
  const okosCounter = useCounterSelector((state) => state.counter);
  ...
  return(
    <div>
      <h3>{okosCounter}</h3>
      ...
    </div>
  );
};

6. And also you can easily use async function for your actions

(example.service.ts)
-------------------
...
export const counterService = createStore(initialState, {
  ...
}, {
  async asyncIncrement(state, additive: number, actions) {
    // state is provided to async functions to use data from store to build a request
    // all mutation of this state will not apllied
    
    return (newState) => {
      // you can also return function, that is reciving newState,
      // which will the actual state, when async function will complete
      // and you can modify this state as you wish
      actions.increment(newState, additive);
    }
  },
  async asyncDecrement(state, additive: number, actions) {
    // and all the same here
    
    return new Promise((res) => {
      setTimeout(() => {
        res((newState) => { 
          actions.decrement(newState, additive);
        });
      }, 1000);
    })
  }
});
...
// and the same exports
export const { increment, decrement, asyncIncrement, asyncDecrement } = counterService.actions;

And the same use

(example.tsx)
------------
...
import { increment, decrement, asyncIncrement, asyncDecrement } from "./example.service";

export const Example = () => {
  ...
  return(
    <div>
      ...
      <button onClick={() => asyncIncrement(1)}>async increment</button>
      <button onClick={() => asyncDecrement(1)}>async decrement</button>
    </div>
  );
};
0.1.0

3 years ago

0.0.0

3 years ago

0.0.9

3 years ago

0.0.8

3 years ago

0.0.7

3 years ago

0.0.6

3 years ago

0.0.5

3 years ago

0.0.4

3 years ago

0.0.3

3 years ago

0.0.2

3 years ago

0.0.1

3 years ago

1.0.0

3 years ago

1.0.25

3 years ago

1.0.23

3 years ago

1.0.22

3 years ago

1.0.21

3 years ago

1.0.20

3 years ago

1.0.16

3 years ago

1.0.15

3 years ago

1.0.14

3 years ago

1.0.13

3 years ago

1.0.12

3 years ago

1.0.10

3 years ago

1.0.7

3 years ago

1.0.5

3 years ago

1.0.4

3 years ago

1.0.3

3 years ago

1.0.2

3 years ago

1.0.1

3 years ago