react-cache-promise
Version:
react-cache-promise
92 lines (87 loc) • 2.64 kB
JavaScript
!function (e, t) {
"object" == typeof exports && "undefined" != typeof module ? t(exports, require("react")) : "function" == typeof define && define.amd ? define(["exports", "react"], t) : t((e = "undefined" != typeof globalThis ? globalThis : e || self).ReactAsyncStates = {}, e.React)
}(this, (function (e, t) {
"use strict";
function n(e) {
var t = Object.create(null);
return e && Object.keys(e).forEach((function (n) {
if ("default" !== n) {
var r = Object.getOwnPropertyDescriptor(e, n);
Object.defineProperty(t, n, r.get ? r : {
enumerable: !0,
get: function () {
return e[n]
}
})
}
})), t.default = e, Object.freeze(t)
}
var r = n(t), i = new Map, u = new Map;
function s(e, t) {
var n = {
subscribe: function (e) {
n.index || (n.index = 0);
n.listeners || (n.listeners = []);
var t = ++n.index;
return n.listeners[t] = e, function () {
delete n.listeners[t]
}
}, state: null, active: !0
};
return t.then((function (e) {
n.active && (n.state = {
status: "fulfilled",
value: e
}, n.listeners && Object.values(n.listeners).forEach((function (t) {
r.startTransition((function () {
return t(e)
}))
})))
}), (function (e) {
n.active && (n.state = {
status: "rejected",
reason: e
}, n.listeners && Object.values(n.listeners).forEach((function (t) {
r.startTransition((function () {
return t(e)
}))
})))
})), n
}
e.evict = function (e) {
var t = i.get(e);
if (t) {
var n = u.get(t);
if (n) {
var s = i.delete(e) && u.delete(t);
n.active = !1, n.state = null;
var a = n.listeners;
if (a) {
var c = {};
Object.values(a).forEach((function (e) {
r.startTransition((function () {
return e(c)
}))
}))
}
return s
}
}
}, e.patchQuery = function (e, t) {
return function () {
for (var n = [], r = 0; r < arguments.length; r++) n[r] = arguments[r];
var a = t.apply(null, n), c = i.get(a);
if (c) return c;
var f = e.apply(null, n);
return i.set(a, f), u.set(f, s(0, f)), f
}
}, e.usePromise = function (e) {
var t = u.get(e), n = t.state;
if (null === n) throw e;
if ("rejected" === n.status) throw n.reason;
var i = r.useState()[1];
return r.useEffect((function () {
return t.subscribe(i)
}), [t]), n.value
}
}));