jotai
Version:
👻 Next gen state management that will spook you
277 lines (229 loc) • 7.44 kB
JavaScript
;
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;