UNPKG

jotai

Version:

👻 Next gen state management that will spook you

57 lines (51 loc) • 1.59 kB
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 };