@jupri-lab/react-store
Version:
A lightweight, easy-to-integrate, and type-safe state management library for React
45 lines (41 loc) • 1.47 kB
JavaScript
import { CombineStores, Store } from '@jupri-lab/store-core';
import { useState, useEffect } from 'react';
const combineStores = (stores) => {
const combinedStores = new CombineStores(stores);
return (selector, subscribe = true) => {
const [selectedStore] = useState(() => combinedStores.getStore(selector));
const [_, setState] = useState(selectedStore.get());
useEffect(() => {
if (subscribe) {
const subscriber = (newState) => {
setState(newState);
};
const unsubscribe = selectedStore.subscribe(subscriber);
return () => unsubscribe();
}
}, []);
return selectedStore;
};
};
function createStore(storeConfigs) {
const store = new Store({
actions: storeConfigs.actions,
initialState: storeConfigs.initialState,
middlewares: storeConfigs.middlewares,
name: storeConfigs.name,
});
return (options = { subscribe: true }) => {
const [, setState] = useState(store.get());
useEffect(() => {
if (options.subscribe) {
const subscriber = (newState) => {
setState(newState);
};
const unsubscribe = store.subscribe(subscriber);
return () => unsubscribe();
}
}, []);
return store;
};
}
export { combineStores, createStore };