jotai
Version:
👻 Next gen state management that will spook you
57 lines (51 loc) • 1.59 kB
JavaScript
import { useCallback, useMemo } from 'react';
import { useSetAtom, useAtom, useStore } from 'jotai/react';
import { RESET } from 'jotai/vanilla/utils';
import { atom } from 'jotai/vanilla';
function useResetAtom(anAtom, options) {
const setAtom = useSetAtom(anAtom, options);
const resetAtom = useCallback(() => setAtom(RESET), [setAtom]);
return resetAtom;
}
function useReducerAtom(anAtom, reducer, options) {
const [state, setState] = useAtom(anAtom, options);
const dispatch = useCallback(
(action) => {
setState((prev) => reducer(prev, action));
},
[setState, reducer]
);
return [state, dispatch];
}
function useAtomCallback(callback, options) {
const anAtom = useMemo(
() => atom(null, (get, set, ...args) => callback(get, set, ...args)),
[callback]
);
return useSetAtom(anAtom, options);
}
const hydratedMap = /* @__PURE__ */ new WeakMap();
function useHydrateAtoms(values, options) {
const store = useStore(options);
const hydratedSet = getHydratedSet(store);
const tuplesToRestore = [];
for (const tuple of values) {
const atom = tuple[0];
if (!hydratedSet.has(atom)) {
hydratedSet.add(atom);
tuplesToRestore.push(tuple);
}
}
if (tuplesToRestore.length) {
store.res(tuplesToRestore);
}
}
const getHydratedSet = (store) => {
let hydratedSet = hydratedMap.get(store);
if (!hydratedSet) {
hydratedSet = /* @__PURE__ */ new WeakSet();
hydratedMap.set(store, hydratedSet);
}
return hydratedSet;
};
export { useAtomCallback, useHydrateAtoms, useReducerAtom, useResetAtom };