killa
Version:
State management for Vanilla and React
31 lines (30 loc) • 995 B
JavaScript
import { useRef } from "react";
import UseSyncExternalStoreShim from "use-sync-external-store/shim/with-selector.js";
import { deepEquals } from "killa/deep-equals";
import { SYMBOL_STORE } from "killa/constants";
const useSyncExternalStore = UseSyncExternalStoreShim.useSyncExternalStoreWithSelector;
const fallbackSelector = (state) => state;
const useStore = (store, selector = fallbackSelector, silect = false) => {
if (store.$$store !== SYMBOL_STORE) {
throw new Error("Provide a valid store for useStore.");
}
if (selector === null) {
selector = fallbackSelector;
silect = true;
}
const silentState = useRef(() => {
const state2 = store.getState();
return () => state2;
});
const state = useSyncExternalStore(
store.subscribe,
silect ? silentState.current() : store.getState,
silect ? silentState.current() : store.getServerState || store.getState,
selector,
deepEquals
);
return [state, store.setState];
};
export {
useStore
};