makarkotlov / mobx-persist-store

Persist and rehydrate observable properties in mobx store.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Mobx Persist Store

Persist and rehydrate observable properties in mobx store.

npm version npm downloads

Installation

$ yarn add mobx-persist-store

Usage

Use the StorageAdapter to connect to your library from cache. It can be anything that is able to read and write data. For ReactNative it may be AsyncStorage, FS, etc. and for React - localStorage, sessionStorage, etc.

import { action, observable, computed } from 'mobx';
import { persistence, useClear, useDisposers, isSynchronized, StorageAdapter } from 'mobx-persist-store';

function readStore(name) {
  return new Promise((resolve) => {
    const data = localStorage.getItem(name);
    resolve(JSON.parse(data));
  });
}

function writeStore(name, content) {
  return new Promise((resolve) => {
    localStorage.setItem(name, JSON.stringify(content));
    resolve();
  });
}

@persistence({
  name: 'CounterStore',
  properties: ['counter'],
  adapter: new StorageAdapter({
    read: readStore,
    write: writeStore,
  }),
  reactionOptions: { // optional
    delay: 2000
  },
})
class CounterStore {
  @observable counter: number = 0;

  @action tickCounter = () => {
    this.counter = this.counter + 1;
  };

  @action clearStore = () => {
    useClear(this)
  }

  @action persistDispose = () => {
    useDisposers(this)
  }

  @computed get isSynchronized() => {
    return isSynchronized(this)
  }
}

export default new CounterStore();

Without decorators

import { action, observable, computed, decorate } from 'mobx';
import { persistence, useClear, useDisposers, isSynchronized, StorageAdapter } from 'mobx-persist-store';

function readStore(name) {
  return new Promise((resolve) => {
    const data = localStorage.getItem(name);
    resolve(JSON.parse(data));
  });
}

function writeStore(name, content) {
  return new Promise((resolve) => {
    localStorage.setItem(name, JSON.stringify(content));
    resolve();
  });
}

class CounterStore {
  counter: number = 0;

  tickCounter = () => {
    this.counter = this.counter + 1;
  };

  clearStore = () => {
    useClear(this)
  }

  persistDespose = () => {
    useDisposers(this)
  }

  get isSynchronized() => {
    return isSynchronized(this)
  }
}

decorate(CounterStore, {
  counter: observable,
  tickCounter: action,
  clearStore: action,
  persistDispose: action,
  isSynchronized: computed
})

persistence({
  name: 'CounterStore',
  properties: ['counter'],
  adapter: new StorageAdapter({
    read: readStore,
    write: writeStore,
  }),
  reactionOptions: { // optional
    delay: 2000
  },
})(CounterStore);

export default new CounterStore();

About

Persist and rehydrate observable properties in mobx store.


Languages

Language:TypeScript 85.7%Language:JavaScript 14.3%