jotai
Version:
👻 Primitive and flexible state management for React
58 lines (52 loc) • 1.82 kB
JavaScript
'use client';
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) {
if ((import.meta.env ? import.meta.env.MODE : void 0) !== "production") {
console.warn(
"[DEPRECATED] useReducerAtom is deprecated and will be removed in the future. Please create your own version using the recipe. https://github.com/pmndrs/jotai/pull/2467"
);
}
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);
for (const [atom, value] of values) {
if (!hydratedSet.has(atom) || (options == null ? void 0 : options.dangerouslyForceHydrate)) {
hydratedSet.add(atom);
store.set(atom, value);
}
}
}
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 };