UNPKG

jotai

Version:

👻 Next gen state management that will spook you

277 lines (229 loc) • 7.44 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var react = require('react'); var jotai = require('jotai'); function useUpdateAtom(anAtom) { var writeOnlyAtom = react.useMemo(function () { return jotai.atom(null, function (_get, set, update) { return set(anAtom, update); }); }, [anAtom]); writeOnlyAtom.scope = anAtom.scope; return jotai.useAtom(writeOnlyAtom)[1]; } function useAtomValue(anAtom) { return jotai.useAtom(anAtom)[0]; } var RESET = Symbol(); function atomWithReset(initialValue) { var anAtom = jotai.atom(initialValue, function (get, set, update) { if (update === RESET) { set(anAtom, initialValue); } else { set(anAtom, typeof update === 'function' ? update(get(anAtom)) : update); } }); return anAtom; } function useResetAtom(anAtom) { var writeOnlyAtom = react.useMemo(function () { return jotai.atom(null, function (_get, set, _update) { return set(anAtom, RESET); }); }, [anAtom]); writeOnlyAtom.scope = anAtom.scope; return jotai.useAtom(writeOnlyAtom)[1]; } function useReducerAtom(anAtom, reducer) { var _useAtom = jotai.useAtom(anAtom), state = _useAtom[0], setState = _useAtom[1]; var dispatch = react.useCallback(function (action) { setState(function (prev) { return reducer(prev, action); }); }, [setState, reducer]); return [state, dispatch]; } function atomWithReducer(initialValue, reducer) { var anAtom = jotai.atom(initialValue, function (get, set, action) { return set(anAtom, reducer(get(anAtom), action)); }); return anAtom; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } it = o[Symbol.iterator](); return it.next.bind(it); } function atomFamily(initializeRead, initializeWrite, areEqual) { var shouldRemove = null; var atoms = new Map(); var createAtom = function createAtom(param) { var item; if (areEqual === undefined) { item = atoms.get(param); } else { // Custom comparator, iterate over all elements for (var _iterator = _createForOfIteratorHelperLoose(atoms), _step; !(_step = _iterator()).done;) { var _step$value = _step.value, key = _step$value[0], value = _step$value[1]; if (areEqual(key, param)) { item = value; break; } } } if (item !== undefined) { if (shouldRemove != null && shouldRemove(item[1], param)) { atoms.delete(param); } else { return item[0]; } } var newAtom = jotai.atom(initializeRead(param), initializeWrite && initializeWrite(param)); atoms.set(param, [newAtom, Date.now()]); return newAtom; }; createAtom.remove = function (param) { if (areEqual === undefined) { atoms.delete(param); } else { for (var _iterator2 = _createForOfIteratorHelperLoose(atoms), _step2; !(_step2 = _iterator2()).done;) { var _step2$value = _step2.value, key = _step2$value[0]; if (areEqual(key, param)) { atoms.delete(key); break; } } } }; createAtom.setShouldRemove = function (fn) { shouldRemove = fn; if (!shouldRemove) return; for (var _iterator3 = _createForOfIteratorHelperLoose(atoms), _step3; !(_step3 = _iterator3()).done;) { var _step3$value = _step3.value, key = _step3$value[0], value = _step3$value[1]; if (shouldRemove(value[1], key)) { atoms.delete(key); } } }; return createAtom; } function useSelector(anAtom, selector, equalityFn) { if (equalityFn === void 0) { equalityFn = Object.is; } var sliceAtom = react.useMemo(function () { var initialized = false; var prevSlice; var derivedAtom = jotai.atom(function (get) { var slice = selector(get(anAtom)); if (initialized && equalityFn(prevSlice, slice)) { return prevSlice; } initialized = true; prevSlice = slice; // self contained mutation? return slice; }); derivedAtom.scope = anAtom.scope; return derivedAtom; }, [anAtom, selector, equalityFn]); return jotai.useAtom(sliceAtom)[0]; } function useAtomCallback(callback, scope) { var anAtom = react.useMemo(function () { return jotai.atom(null, function (get, set, _ref) { var arg = _ref[0], resolve = _ref[1], reject = _ref[2]; try { resolve(callback(get, set, arg)); } catch (e) { reject(e); } }); }, [callback]); anAtom.scope = scope; var _useAtom = jotai.useAtom(anAtom), invoke = _useAtom[1]; return react.useCallback(function (arg) { return new Promise(function (resolve, reject) { invoke([arg, resolve, reject]); }); }, [invoke]); } var deepFreeze = function deepFreeze(obj) { if (typeof obj !== 'object' || obj === null) return; Object.freeze(obj); var propNames = Object.getOwnPropertyNames(obj); for (var _iterator = _createForOfIteratorHelperLoose(propNames), _step; !(_step = _iterator()).done;) { var name = _step.value; var value = obj[name]; deepFreeze(value); } return obj; }; function freezeAtom(anAtom) { var frozenAtom = jotai.atom(function (get) { return deepFreeze(get(anAtom)); }, function (_get, set, arg) { return set(anAtom, arg); }); frozenAtom.scope = anAtom.scope; return frozenAtom; } var atomFrozen = function atomFrozen(read, write) { var anAtom = jotai.atom(read, write); var origRead = anAtom.read; anAtom.read = function (get) { return deepFreeze(origRead(get)); }; return anAtom; }; var atomFrozenInDev = typeof process === 'object' && process.env.NODE_ENV === 'development' ? atomFrozen : jotai.atom; exports.RESET = RESET; exports.atomFamily = atomFamily; exports.atomFrozenInDev = atomFrozenInDev; exports.atomWithReducer = atomWithReducer; exports.atomWithReset = atomWithReset; exports.freezeAtom = freezeAtom; exports.useAtomCallback = useAtomCallback; exports.useAtomValue = useAtomValue; exports.useReducerAtom = useReducerAtom; exports.useResetAtom = useResetAtom; exports.useSelector = useSelector; exports.useUpdateAtom = useUpdateAtom;