@effect-rx/rx-react 0.1.14 → 0.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.d.ts +22 -1
- package/index.d.ts.map +1 -1
- package/index.js +97 -5
- package/index.js.map +1 -1
- package/mjs/index.mjs +90 -0
- package/mjs/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +118 -1
package/index.d.ts
CHANGED
@@ -2,7 +2,8 @@
|
|
2
2
|
* @since 1.0.0
|
3
3
|
*/
|
4
4
|
import * as Registry from "@effect-rx/rx/Registry";
|
5
|
-
import
|
5
|
+
import * as Result from "@effect-rx/rx/Result";
|
6
|
+
import * as Rx from "@effect-rx/rx/Rx";
|
6
7
|
import * as React from "react";
|
7
8
|
export * as Registry from "@effect-rx/rx/Registry";
|
8
9
|
export * as Result from "@effect-rx/rx/Result";
|
@@ -32,4 +33,24 @@ export declare const useRefreshRx: <A>(rx: Rx.Rx<A> & Rx.Refreshable) => () => v
|
|
32
33
|
* @category hooks
|
33
34
|
*/
|
34
35
|
export declare const useRx: <R, W>(rx: Rx.Writable<R, W>) => readonly [value: R, setOrUpdate: (_: W | ((_: R) => W)) => void];
|
36
|
+
/**
|
37
|
+
* @since 1.0.0
|
38
|
+
* @category hooks
|
39
|
+
*/
|
40
|
+
export declare const useRxSuspense: <E, A>(rx: Rx.Rx<Result.Result<E, A>>, options?: {
|
41
|
+
readonly suspendOnWaiting?: boolean;
|
42
|
+
}) => {
|
43
|
+
readonly isWaiting: boolean;
|
44
|
+
readonly value: Result.Success<E, A> | Result.Failure<E, A>;
|
45
|
+
};
|
46
|
+
/**
|
47
|
+
* @since 1.0.0
|
48
|
+
* @category hooks
|
49
|
+
*/
|
50
|
+
export declare const useRxSuspenseSuccess: <E, A>(rx: Rx.Rx<Result.Result<E, A>>, options?: {
|
51
|
+
readonly suspendOnWaiting?: boolean;
|
52
|
+
}) => {
|
53
|
+
readonly isWaiting: boolean;
|
54
|
+
readonly value: A;
|
55
|
+
};
|
35
56
|
//# sourceMappingURL=index.d.ts.map
|
package/index.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["./src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAA;AAClD,OAAO,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAA;
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["./src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAA;AAClD,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAA;AAC9C,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAGtC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAA;AAClD,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAA;AAC9C,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAEtC;;;GAGG;AACH,eAAO,MAAM,eAAe,kCAA0D,CAAA;AAwBtF;;;GAGG;AACH,eAAO,MAAM,UAAU,wBAOtB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,6DAA4D,IAUhF,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,wCAAuC,MAAM,IAKrE,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,KAAK,8FAA6F,IAAI,CAIvG,CAAA;AA2DZ;;;GAGG;AACH,eAAO,MAAM,aAAa,mDAEd;IAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE;wBAE7B,OAAO;;CAgB5B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,mDAErB;IAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE;wBAE7B,OAAO;;CAqB5B,CAAA"}
|
package/index.js
CHANGED
@@ -3,15 +3,19 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
-
exports.useSetRx = exports.useRxValue = exports.useRx = exports.useRefreshRx = exports.Rx = exports.Result = exports.RegistryContext = exports.Registry = void 0;
|
6
|
+
exports.useSetRx = exports.useRxValue = exports.useRxSuspenseSuccess = exports.useRxSuspense = exports.useRx = exports.useRefreshRx = exports.Rx = exports.Result = exports.RegistryContext = exports.Registry = void 0;
|
7
7
|
var Registry = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect-rx/rx/Registry"));
|
8
8
|
var Registry_1 = Registry;
|
9
9
|
exports.Registry = Registry;
|
10
|
+
var Result = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect-rx/rx/Result"));
|
11
|
+
var Result_1 = Result;
|
12
|
+
exports.Result = Result;
|
13
|
+
var Rx = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect-rx/rx/Rx"));
|
14
|
+
var Rx_1 = Rx;
|
15
|
+
exports.Rx = Rx;
|
16
|
+
var _GlobalValue = /*#__PURE__*/require("@effect/data/GlobalValue");
|
17
|
+
var Cause = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect/io/Cause"));
|
10
18
|
var React = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("react"));
|
11
|
-
var Result_1 = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect-rx/rx/Result"));
|
12
|
-
exports.Result = Result_1;
|
13
|
-
var Rx_1 = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect-rx/rx/Rx"));
|
14
|
-
exports.Rx = Rx_1;
|
15
19
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
16
20
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
17
21
|
/**
|
@@ -89,4 +93,92 @@ const useRefreshRx = rx => {
|
|
89
93
|
exports.useRefreshRx = useRefreshRx;
|
90
94
|
const useRx = rx => [useRxValue(rx), useSetRx(rx)];
|
91
95
|
exports.useRx = useRx;
|
96
|
+
const suspenseCache = /*#__PURE__*/(0, _GlobalValue.globalValue)("@effect-rx/rx-react/suspenseCache", () => new Map());
|
97
|
+
const suspenseRx = /*#__PURE__*/Rx.family(rx => Rx.readable((get, ctx) => {
|
98
|
+
const result = get(rx);
|
99
|
+
const value = Result.noWaiting(result);
|
100
|
+
if (value._tag === "Initial") {
|
101
|
+
return {
|
102
|
+
_tag: "Suspended",
|
103
|
+
promise: new Promise(resolve => {
|
104
|
+
ctx.addFinalizer(() => {
|
105
|
+
resolve();
|
106
|
+
const unmount = suspenseCache.get(rx);
|
107
|
+
if (unmount) {
|
108
|
+
unmount();
|
109
|
+
suspenseCache.delete(rx);
|
110
|
+
}
|
111
|
+
});
|
112
|
+
})
|
113
|
+
};
|
114
|
+
}
|
115
|
+
const isWaiting = Result.isWaiting(result);
|
116
|
+
return {
|
117
|
+
_tag: "Value",
|
118
|
+
isWaiting,
|
119
|
+
value
|
120
|
+
};
|
121
|
+
}));
|
122
|
+
const suspenseRxWaiting = /*#__PURE__*/Rx.family(rx => Rx.readable((get, ctx) => {
|
123
|
+
const result = get(rx);
|
124
|
+
if (result._tag === "Waiting" || result._tag === "Initial") {
|
125
|
+
return {
|
126
|
+
_tag: "Suspended",
|
127
|
+
promise: new Promise(resolve => {
|
128
|
+
ctx.addFinalizer(() => {
|
129
|
+
resolve();
|
130
|
+
const unmount = suspenseCache.get(rx);
|
131
|
+
if (unmount) {
|
132
|
+
unmount();
|
133
|
+
suspenseCache.delete(rx);
|
134
|
+
}
|
135
|
+
});
|
136
|
+
})
|
137
|
+
};
|
138
|
+
}
|
139
|
+
return {
|
140
|
+
_tag: "Value",
|
141
|
+
isWaiting: false,
|
142
|
+
value: result
|
143
|
+
};
|
144
|
+
}));
|
145
|
+
/**
|
146
|
+
* @since 1.0.0
|
147
|
+
* @category hooks
|
148
|
+
*/
|
149
|
+
const useRxSuspense = (rx, options) => {
|
150
|
+
const registry = React.useContext(RegistryContext);
|
151
|
+
const resultRx = React.useMemo(() => options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx), [options?.suspendOnWaiting, rx]);
|
152
|
+
const result = useRxValue(resultRx);
|
153
|
+
if (result._tag === "Suspended") {
|
154
|
+
if (!suspenseCache.has(resultRx)) {
|
155
|
+
suspenseCache.set(resultRx, registry.mount(resultRx));
|
156
|
+
}
|
157
|
+
throw result.promise;
|
158
|
+
}
|
159
|
+
return result;
|
160
|
+
};
|
161
|
+
/**
|
162
|
+
* @since 1.0.0
|
163
|
+
* @category hooks
|
164
|
+
*/
|
165
|
+
exports.useRxSuspense = useRxSuspense;
|
166
|
+
const useRxSuspenseSuccess = (rx, options) => {
|
167
|
+
const registry = React.useContext(RegistryContext);
|
168
|
+
const resultRx = React.useMemo(() => options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx), [options?.suspendOnWaiting, rx]);
|
169
|
+
const result = useRxValue(resultRx);
|
170
|
+
if (result._tag === "Suspended") {
|
171
|
+
if (!suspenseCache.has(resultRx)) {
|
172
|
+
suspenseCache.set(resultRx, registry.mount(resultRx));
|
173
|
+
}
|
174
|
+
throw result.promise;
|
175
|
+
} else if (result.value._tag === "Failure") {
|
176
|
+
throw Cause.squash(result.value.cause);
|
177
|
+
}
|
178
|
+
return {
|
179
|
+
isWaiting: result.isWaiting,
|
180
|
+
value: result.value.value
|
181
|
+
};
|
182
|
+
};
|
183
|
+
exports.useRxSuspenseSuccess = useRxSuspenseSuccess;
|
92
184
|
//# sourceMappingURL=index.js.map
|
package/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","names":["Registry","_interopRequireWildcard","require","Registry_1","exports","
|
1
|
+
{"version":3,"file":"index.js","names":["Registry","_interopRequireWildcard","require","Registry_1","exports","Result","Result_1","Rx","Rx_1","_GlobalValue","Cause","React","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","RegistryContext","createContext","make","makeStore","registry","rx","getter","subscribe","f","unmount","subscribeGetter","snapshot","useRxValue","useContext","store","useRef","undefined","current","useSyncExternalStore","useSetRx","useCallback","value","useRefreshRx","refresh","useRx","suspenseCache","globalValue","Map","suspenseRx","family","readable","ctx","result","noWaiting","_tag","promise","Promise","resolve","addFinalizer","delete","isWaiting","suspenseRxWaiting","useRxSuspense","options","resultRx","useMemo","suspendOnWaiting","mount","useRxSuspenseSuccess","squash","cause"],"sources":["./src/index.ts"],"sourcesContent":[null],"mappings":";;;;;;AAGA,IAAAA,QAAA,gBAAAC,uBAAA,eAAAC,OAAA;AAAkD,IAAAC,UAAA,GAAAH,QAAA;AAAAI,OAAA,CAAAJ,QAAA,GAAAA,QAAA;AAClD,IAAAK,MAAA,gBAAAJ,uBAAA,eAAAC,OAAA;AAA8C,IAAAI,QAAA,GAAAD,MAAA;AAAAD,OAAA,CAAAC,MAAA,GAAAA,MAAA;AAC9C,IAAAE,EAAA,gBAAAN,uBAAA,eAAAC,OAAA;AAAsC,IAAAM,IAAA,GAAAD,EAAA;AAAAH,OAAA,CAAAG,EAAA,GAAAA,EAAA;AACtC,IAAAE,YAAA,gBAAAP,OAAA;AACA,IAAAQ,KAAA,gBAAAT,uBAAA,eAAAC,OAAA;AACA,IAAAS,KAAA,gBAAAV,uBAAA,eAAAC,OAAA;AAA8B,SAAAU,yBAAAC,WAAA,eAAAC,OAAA,kCAAAC,iBAAA,OAAAD,OAAA,QAAAE,gBAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,WAAA,WAAAA,WAAA,GAAAG,gBAAA,GAAAD,iBAAA,KAAAF,WAAA;AAAA,SAAAZ,wBAAAgB,GAAA,EAAAJ,WAAA,SAAAA,WAAA,IAAAI,GAAA,IAAAA,GAAA,CAAAC,UAAA,WAAAD,GAAA,QAAAA,GAAA,oBAAAA,GAAA,wBAAAA,GAAA,4BAAAE,OAAA,EAAAF,GAAA,UAAAG,KAAA,GAAAR,wBAAA,CAAAC,WAAA,OAAAO,KAAA,IAAAA,KAAA,CAAAC,GAAA,CAAAJ,GAAA,YAAAG,KAAA,CAAAE,GAAA,CAAAL,GAAA,SAAAM,MAAA,WAAAC,qBAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,GAAA,IAAAX,GAAA,QAAAW,GAAA,kBAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAd,GAAA,EAAAW,GAAA,SAAAI,IAAA,GAAAR,qBAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAV,GAAA,EAAAW,GAAA,cAAAI,IAAA,KAAAA,IAAA,CAAAV,GAAA,IAAAU,IAAA,CAAAC,GAAA,KAAAR,MAAA,CAAAC,cAAA,CAAAH,MAAA,EAAAK,GAAA,EAAAI,IAAA,YAAAT,MAAA,CAAAK,GAAA,IAAAX,GAAA,CAAAW,GAAA,SAAAL,MAAA,CAAAJ,OAAA,GAAAF,GAAA,MAAAG,KAAA,IAAAA,KAAA,CAAAa,GAAA,CAAAhB,GAAA,EAAAM,MAAA,YAAAA,MAAA;AAR9B;;;;AAcA;;;;AAIO,MAAMW,eAAe,gBAAGvB,KAAK,CAACwB,aAAa,eAAoBnC,QAAQ,CAACoC,IAAI,EAAE,CAAC;AAAAhC,OAAA,CAAA8B,eAAA,GAAAA,eAAA;AAStF,SAASG,SAASA,CAAIC,QAA2B,EAAEC,EAAY;EAC7D,IAAIC,MAAM,GAAG,SAAAA,CAAA;IACX,OAAOF,QAAQ,CAAChB,GAAG,CAACiB,EAAE,CAAC;EACzB,CAAC;EACD,SAASE,SAASA,CAACC,CAAa;IAC9B,MAAM,CAACpB,GAAG,EAAEqB,OAAO,CAAC,GAAGL,QAAQ,CAACM,eAAe,CAACL,EAAE,EAAEG,CAAC,CAAC;IACtDF,MAAM,GAAGlB,GAAG;IACZ,OAAOqB,OAAO;EAChB;EACA,SAASE,QAAQA,CAAA;IACf,OAAOL,MAAM,EAAE;EACjB;EACA,OAAO;IAAED,EAAE;IAAED,QAAQ;IAAEG,SAAS;IAAEI;EAAQ,CAAE;AAC9C;AAEA;;;;AAIO,MAAMC,UAAU,GAAOP,EAAY,IAAO;EAC/C,MAAMD,QAAQ,GAAG3B,KAAK,CAACoC,UAAU,CAACb,eAAe,CAAC;EAClD,MAAMc,KAAK,GAAGrC,KAAK,CAACsC,MAAM,CAAaC,SAAgB,CAAC;EACxD,IAAIF,KAAK,CAACG,OAAO,EAAEZ,EAAE,KAAKA,EAAE,IAAIS,KAAK,CAACG,OAAO,EAAEb,QAAQ,KAAKA,QAAQ,EAAE;IACpEU,KAAK,CAACG,OAAO,GAAGd,SAAS,CAACC,QAAQ,EAAEC,EAAE,CAAC;;EAEzC,OAAO5B,KAAK,CAACyC,oBAAoB,CAACJ,KAAK,CAACG,OAAO,CAACV,SAAS,EAAEO,KAAK,CAACG,OAAO,CAACN,QAAQ,CAAC;AACpF,CAAC;AAED;;;;AAAAzC,OAAA,CAAA0C,UAAA,GAAAA,UAAA;AAIO,MAAMO,QAAQ,GAAUd,EAAqB,IAAoC;EACtF,MAAMD,QAAQ,GAAG3B,KAAK,CAACoC,UAAU,CAACb,eAAe,CAAC;EAClD,OAAOvB,KAAK,CAAC2C,WAAW,CAAEC,KAAK,IAAI;IACjC,IAAI,OAAOA,KAAK,KAAK,UAAU,EAAE;MAC/BjB,QAAQ,CAACL,GAAG,CAACM,EAAE,EAAGgB,KAAa,CAACjB,QAAQ,CAAChB,GAAG,CAACiB,EAAE,CAAC,CAAC,CAAC;MAClD;KACD,MAAM;MACLD,QAAQ,CAACL,GAAG,CAACM,EAAE,EAAEgB,KAAK,CAAC;;EAE3B,CAAC,EAAE,CAACjB,QAAQ,EAAEC,EAAE,CAAC,CAAC;AACpB,CAAC;AAED;;;;AAAAnC,OAAA,CAAAiD,QAAA,GAAAA,QAAA;AAIO,MAAMG,YAAY,GAAOjB,EAA6B,IAAgB;EAC3E,MAAMD,QAAQ,GAAG3B,KAAK,CAACoC,UAAU,CAACb,eAAe,CAAC;EAClD,OAAOvB,KAAK,CAAC2C,WAAW,CAAC,MAAK;IAC5BhB,QAAQ,CAACmB,OAAO,CAAClB,EAAE,CAAC;EACtB,CAAC,EAAE,CAACD,QAAQ,EAAEC,EAAE,CAAC,CAAC;AACpB,CAAC;AAED;;;;AAAAnC,OAAA,CAAAoD,YAAA,GAAAA,YAAA;AAIO,MAAME,KAAK,GAAUnB,EAAqB,IAC/C,CACEO,UAAU,CAACP,EAAE,CAAC,EACdc,QAAQ,CAACd,EAAE,CAAC,CACJ;AAAAnC,OAAA,CAAAsD,KAAA,GAAAA,KAAA;AAaZ,MAAMC,aAAa,gBAAG,IAAAC,wBAAW,EAAC,mCAAmC,EAAE,MAAM,IAAIC,GAAG,EAA0B,CAAC;AAC/G,MAAMC,UAAU,gBAAGvD,EAAE,CAACwD,MAAM,CAAExB,EAAkC,IAC9DhC,EAAE,CAACyD,QAAQ,CAAC,CAAC1C,GAAG,EAAE2C,GAAG,KAA8B;EACjD,MAAMC,MAAM,GAAG5C,GAAG,CAACiB,EAAE,CAAC;EACtB,MAAMgB,KAAK,GAAGlD,MAAM,CAAC8D,SAAS,CAACD,MAAM,CAAC;EACtC,IAAIX,KAAK,CAACa,IAAI,KAAK,SAAS,EAAE;IAC5B,OAAO;MACLA,IAAI,EAAE,WAAW;MACjBC,OAAO,EAAE,IAAIC,OAAO,CAAQC,OAAO,IAAI;QACrCN,GAAG,CAACO,YAAY,CAAC,MAAK;UACpBD,OAAO,EAAE;UACT,MAAM5B,OAAO,GAAGgB,aAAa,CAACrC,GAAG,CAACiB,EAAE,CAAC;UACrC,IAAII,OAAO,EAAE;YACXA,OAAO,EAAE;YACTgB,aAAa,CAACc,MAAM,CAAClC,EAAE,CAAC;;QAE5B,CAAC,CAAC;MACJ,CAAC;KACO;;EAEZ,MAAMmC,SAAS,GAAGrE,MAAM,CAACqE,SAAS,CAACR,MAAM,CAAC;EAC1C,OAAO;IAAEE,IAAI,EAAE,OAAO;IAAEM,SAAS;IAAEnB;EAAK,CAAW;AACrD,CAAC,CAAC,CACH;AACD,MAAMoB,iBAAiB,gBAAGpE,EAAE,CAACwD,MAAM,CAAExB,EAAkC,IACrEhC,EAAE,CAACyD,QAAQ,CAAC,CAAC1C,GAAG,EAAE2C,GAAG,KAA8B;EACjD,MAAMC,MAAM,GAAG5C,GAAG,CAACiB,EAAE,CAAC;EACtB,IAAI2B,MAAM,CAACE,IAAI,KAAK,SAAS,IAAIF,MAAM,CAACE,IAAI,KAAK,SAAS,EAAE;IAC1D,OAAO;MACLA,IAAI,EAAE,WAAW;MACjBC,OAAO,EAAE,IAAIC,OAAO,CAAQC,OAAO,IAAI;QACrCN,GAAG,CAACO,YAAY,CAAC,MAAK;UACpBD,OAAO,EAAE;UACT,MAAM5B,OAAO,GAAGgB,aAAa,CAACrC,GAAG,CAACiB,EAAE,CAAC;UACrC,IAAII,OAAO,EAAE;YACXA,OAAO,EAAE;YACTgB,aAAa,CAACc,MAAM,CAAClC,EAAE,CAAC;;QAE5B,CAAC,CAAC;MACJ,CAAC;KACO;;EAEZ,OAAO;IAAE6B,IAAI,EAAE,OAAO;IAAEM,SAAS,EAAE,KAAK;IAAEnB,KAAK,EAAEW;EAAM,CAAW;AACpE,CAAC,CAAC,CACH;AAED;;;;AAIO,MAAMU,aAAa,GAAGA,CAC3BrC,EAA8B,EAC9BsC,OAAiD,KAI/C;EACF,MAAMvC,QAAQ,GAAG3B,KAAK,CAACoC,UAAU,CAACb,eAAe,CAAC;EAClD,MAAM4C,QAAQ,GAAGnE,KAAK,CAACoE,OAAO,CAC5B,MAAOF,OAAO,EAAEG,gBAAgB,GAAGL,iBAAiB,CAACpC,EAAE,CAAC,GAAGuB,UAAU,CAACvB,EAAE,CAAE,EAC1E,CAACsC,OAAO,EAAEG,gBAAgB,EAAEzC,EAAE,CAAC,CAChC;EACD,MAAM2B,MAAM,GAAGpB,UAAU,CAACgC,QAAQ,CAAC;EACnC,IAAIZ,MAAM,CAACE,IAAI,KAAK,WAAW,EAAE;IAC/B,IAAI,CAACT,aAAa,CAACtC,GAAG,CAACyD,QAAQ,CAAC,EAAE;MAChCnB,aAAa,CAAC1B,GAAG,CAAC6C,QAAQ,EAAExC,QAAQ,CAAC2C,KAAK,CAACH,QAAQ,CAAC,CAAC;;IAEvD,MAAMZ,MAAM,CAACG,OAAO;;EAEtB,OAAOH,MAAM;AACf,CAAC;AAED;;;;AAAA9D,OAAA,CAAAwE,aAAA,GAAAA,aAAA;AAIO,MAAMM,oBAAoB,GAAGA,CAClC3C,EAA8B,EAC9BsC,OAAiD,KAI/C;EACF,MAAMvC,QAAQ,GAAG3B,KAAK,CAACoC,UAAU,CAACb,eAAe,CAAC;EAClD,MAAM4C,QAAQ,GAAGnE,KAAK,CAACoE,OAAO,CAC5B,MAAOF,OAAO,EAAEG,gBAAgB,GAAGL,iBAAiB,CAACpC,EAAE,CAAC,GAAGuB,UAAU,CAACvB,EAAE,CAAE,EAC1E,CAACsC,OAAO,EAAEG,gBAAgB,EAAEzC,EAAE,CAAC,CAChC;EACD,MAAM2B,MAAM,GAAGpB,UAAU,CAACgC,QAAQ,CAAC;EACnC,IAAIZ,MAAM,CAACE,IAAI,KAAK,WAAW,EAAE;IAC/B,IAAI,CAACT,aAAa,CAACtC,GAAG,CAACyD,QAAQ,CAAC,EAAE;MAChCnB,aAAa,CAAC1B,GAAG,CAAC6C,QAAQ,EAAExC,QAAQ,CAAC2C,KAAK,CAACH,QAAQ,CAAC,CAAC;;IAEvD,MAAMZ,MAAM,CAACG,OAAO;GACrB,MAAM,IAAIH,MAAM,CAACX,KAAK,CAACa,IAAI,KAAK,SAAS,EAAE;IAC1C,MAAM1D,KAAK,CAACyE,MAAM,CAACjB,MAAM,CAACX,KAAK,CAAC6B,KAAK,CAAC;;EAExC,OAAO;IACLV,SAAS,EAAER,MAAM,CAACQ,SAAS;IAC3BnB,KAAK,EAAEW,MAAM,CAACX,KAAK,CAACA;GACrB;AACH,CAAC;AAAAnD,OAAA,CAAA8E,oBAAA,GAAAA,oBAAA"}
|
package/mjs/index.mjs
CHANGED
@@ -2,6 +2,10 @@
|
|
2
2
|
* @since 1.0.0
|
3
3
|
*/
|
4
4
|
import * as Registry from "@effect-rx/rx/Registry";
|
5
|
+
import * as Result from "@effect-rx/rx/Result";
|
6
|
+
import * as Rx from "@effect-rx/rx/Rx";
|
7
|
+
import { globalValue } from "@effect/data/GlobalValue";
|
8
|
+
import * as Cause from "@effect/io/Cause";
|
5
9
|
import * as React from "react";
|
6
10
|
import * as Registry_1 from "@effect-rx/rx/Registry";
|
7
11
|
export { Registry_1 as Registry };
|
@@ -75,4 +79,90 @@ export const useRefreshRx = rx => {
|
|
75
79
|
* @category hooks
|
76
80
|
*/
|
77
81
|
export const useRx = rx => [useRxValue(rx), useSetRx(rx)];
|
82
|
+
const suspenseCache = /*#__PURE__*/globalValue("@effect-rx/rx-react/suspenseCache", () => new Map());
|
83
|
+
const suspenseRx = /*#__PURE__*/Rx.family(rx => Rx.readable((get, ctx) => {
|
84
|
+
const result = get(rx);
|
85
|
+
const value = Result.noWaiting(result);
|
86
|
+
if (value._tag === "Initial") {
|
87
|
+
return {
|
88
|
+
_tag: "Suspended",
|
89
|
+
promise: new Promise(resolve => {
|
90
|
+
ctx.addFinalizer(() => {
|
91
|
+
resolve();
|
92
|
+
const unmount = suspenseCache.get(rx);
|
93
|
+
if (unmount) {
|
94
|
+
unmount();
|
95
|
+
suspenseCache.delete(rx);
|
96
|
+
}
|
97
|
+
});
|
98
|
+
})
|
99
|
+
};
|
100
|
+
}
|
101
|
+
const isWaiting = Result.isWaiting(result);
|
102
|
+
return {
|
103
|
+
_tag: "Value",
|
104
|
+
isWaiting,
|
105
|
+
value
|
106
|
+
};
|
107
|
+
}));
|
108
|
+
const suspenseRxWaiting = /*#__PURE__*/Rx.family(rx => Rx.readable((get, ctx) => {
|
109
|
+
const result = get(rx);
|
110
|
+
if (result._tag === "Waiting" || result._tag === "Initial") {
|
111
|
+
return {
|
112
|
+
_tag: "Suspended",
|
113
|
+
promise: new Promise(resolve => {
|
114
|
+
ctx.addFinalizer(() => {
|
115
|
+
resolve();
|
116
|
+
const unmount = suspenseCache.get(rx);
|
117
|
+
if (unmount) {
|
118
|
+
unmount();
|
119
|
+
suspenseCache.delete(rx);
|
120
|
+
}
|
121
|
+
});
|
122
|
+
})
|
123
|
+
};
|
124
|
+
}
|
125
|
+
return {
|
126
|
+
_tag: "Value",
|
127
|
+
isWaiting: false,
|
128
|
+
value: result
|
129
|
+
};
|
130
|
+
}));
|
131
|
+
/**
|
132
|
+
* @since 1.0.0
|
133
|
+
* @category hooks
|
134
|
+
*/
|
135
|
+
export const useRxSuspense = (rx, options) => {
|
136
|
+
const registry = React.useContext(RegistryContext);
|
137
|
+
const resultRx = React.useMemo(() => options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx), [options?.suspendOnWaiting, rx]);
|
138
|
+
const result = useRxValue(resultRx);
|
139
|
+
if (result._tag === "Suspended") {
|
140
|
+
if (!suspenseCache.has(resultRx)) {
|
141
|
+
suspenseCache.set(resultRx, registry.mount(resultRx));
|
142
|
+
}
|
143
|
+
throw result.promise;
|
144
|
+
}
|
145
|
+
return result;
|
146
|
+
};
|
147
|
+
/**
|
148
|
+
* @since 1.0.0
|
149
|
+
* @category hooks
|
150
|
+
*/
|
151
|
+
export const useRxSuspenseSuccess = (rx, options) => {
|
152
|
+
const registry = React.useContext(RegistryContext);
|
153
|
+
const resultRx = React.useMemo(() => options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx), [options?.suspendOnWaiting, rx]);
|
154
|
+
const result = useRxValue(resultRx);
|
155
|
+
if (result._tag === "Suspended") {
|
156
|
+
if (!suspenseCache.has(resultRx)) {
|
157
|
+
suspenseCache.set(resultRx, registry.mount(resultRx));
|
158
|
+
}
|
159
|
+
throw result.promise;
|
160
|
+
} else if (result.value._tag === "Failure") {
|
161
|
+
throw Cause.squash(result.value.cause);
|
162
|
+
}
|
163
|
+
return {
|
164
|
+
isWaiting: result.isWaiting,
|
165
|
+
value: result.value.value
|
166
|
+
};
|
167
|
+
};
|
78
168
|
//# sourceMappingURL=index.mjs.map
|
package/mjs/index.mjs.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["Registry","
|
1
|
+
{"version":3,"file":"index.mjs","names":["Registry","Result","Rx","globalValue","Cause","React","RegistryContext","createContext","make","makeStore","registry","rx","getter","get","subscribe","f","unmount","subscribeGetter","snapshot","useRxValue","useContext","store","useRef","undefined","current","useSyncExternalStore","useSetRx","useCallback","value","set","useRefreshRx","refresh","useRx","suspenseCache","Map","suspenseRx","family","readable","ctx","result","noWaiting","_tag","promise","Promise","resolve","addFinalizer","delete","isWaiting","suspenseRxWaiting","useRxSuspense","options","resultRx","useMemo","suspendOnWaiting","has","mount","useRxSuspenseSuccess","squash","cause"],"sources":["../src/index.ts"],"sourcesContent":[null],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@effect-rx/rx-react",
|
3
|
-
"version": "0.1.
|
3
|
+
"version": "0.1.16",
|
4
4
|
"description": "Reactive toolkit for Effect",
|
5
5
|
"license": "MIT",
|
6
6
|
"repository": {
|
@@ -35,7 +35,7 @@
|
|
35
35
|
"sideEffects": [],
|
36
36
|
"author": "Effect contributors",
|
37
37
|
"dependencies": {
|
38
|
-
"@effect-rx/rx": "^0.1.
|
38
|
+
"@effect-rx/rx": "^0.1.15"
|
39
39
|
},
|
40
40
|
"peerDependencies": {
|
41
41
|
"@effect/data": "^0.18.5",
|
package/src/index.ts
CHANGED
@@ -2,7 +2,10 @@
|
|
2
2
|
* @since 1.0.0
|
3
3
|
*/
|
4
4
|
import * as Registry from "@effect-rx/rx/Registry"
|
5
|
-
import
|
5
|
+
import * as Result from "@effect-rx/rx/Result"
|
6
|
+
import * as Rx from "@effect-rx/rx/Rx"
|
7
|
+
import { globalValue } from "@effect/data/GlobalValue"
|
8
|
+
import * as Cause from "@effect/io/Cause"
|
6
9
|
import * as React from "react"
|
7
10
|
|
8
11
|
export * as Registry from "@effect-rx/rx/Registry"
|
@@ -86,3 +89,117 @@ export const useRx = <R, W>(rx: Rx.Writable<R, W>): readonly [value: R, setOrUpd
|
|
86
89
|
useRxValue(rx),
|
87
90
|
useSetRx(rx)
|
88
91
|
] as const
|
92
|
+
|
93
|
+
type SuspenseResult<E, A> =
|
94
|
+
| {
|
95
|
+
readonly _tag: "Suspended"
|
96
|
+
readonly promise: Promise<void>
|
97
|
+
}
|
98
|
+
| {
|
99
|
+
readonly _tag: "Value"
|
100
|
+
readonly isWaiting: boolean
|
101
|
+
readonly value: Result.Success<E, A> | Result.Failure<E, A>
|
102
|
+
}
|
103
|
+
|
104
|
+
const suspenseCache = globalValue("@effect-rx/rx-react/suspenseCache", () => new Map<Rx.Rx<any>, () => void>())
|
105
|
+
const suspenseRx = Rx.family((rx: Rx.Rx<Result.Result<any, any>>) =>
|
106
|
+
Rx.readable((get, ctx): SuspenseResult<any, any> => {
|
107
|
+
const result = get(rx)
|
108
|
+
const value = Result.noWaiting(result)
|
109
|
+
if (value._tag === "Initial") {
|
110
|
+
return {
|
111
|
+
_tag: "Suspended",
|
112
|
+
promise: new Promise<void>((resolve) => {
|
113
|
+
ctx.addFinalizer(() => {
|
114
|
+
resolve()
|
115
|
+
const unmount = suspenseCache.get(rx)
|
116
|
+
if (unmount) {
|
117
|
+
unmount()
|
118
|
+
suspenseCache.delete(rx)
|
119
|
+
}
|
120
|
+
})
|
121
|
+
})
|
122
|
+
} as const
|
123
|
+
}
|
124
|
+
const isWaiting = Result.isWaiting(result)
|
125
|
+
return { _tag: "Value", isWaiting, value } as const
|
126
|
+
})
|
127
|
+
)
|
128
|
+
const suspenseRxWaiting = Rx.family((rx: Rx.Rx<Result.Result<any, any>>) =>
|
129
|
+
Rx.readable((get, ctx): SuspenseResult<any, any> => {
|
130
|
+
const result = get(rx)
|
131
|
+
if (result._tag === "Waiting" || result._tag === "Initial") {
|
132
|
+
return {
|
133
|
+
_tag: "Suspended",
|
134
|
+
promise: new Promise<void>((resolve) => {
|
135
|
+
ctx.addFinalizer(() => {
|
136
|
+
resolve()
|
137
|
+
const unmount = suspenseCache.get(rx)
|
138
|
+
if (unmount) {
|
139
|
+
unmount()
|
140
|
+
suspenseCache.delete(rx)
|
141
|
+
}
|
142
|
+
})
|
143
|
+
})
|
144
|
+
} as const
|
145
|
+
}
|
146
|
+
return { _tag: "Value", isWaiting: false, value: result } as const
|
147
|
+
})
|
148
|
+
)
|
149
|
+
|
150
|
+
/**
|
151
|
+
* @since 1.0.0
|
152
|
+
* @category hooks
|
153
|
+
*/
|
154
|
+
export const useRxSuspense = <E, A>(
|
155
|
+
rx: Rx.Rx<Result.Result<E, A>>,
|
156
|
+
options?: { readonly suspendOnWaiting?: boolean }
|
157
|
+
): {
|
158
|
+
readonly isWaiting: boolean
|
159
|
+
readonly value: Result.Success<E, A> | Result.Failure<E, A>
|
160
|
+
} => {
|
161
|
+
const registry = React.useContext(RegistryContext)
|
162
|
+
const resultRx = React.useMemo(
|
163
|
+
() => (options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx)),
|
164
|
+
[options?.suspendOnWaiting, rx]
|
165
|
+
)
|
166
|
+
const result = useRxValue(resultRx)
|
167
|
+
if (result._tag === "Suspended") {
|
168
|
+
if (!suspenseCache.has(resultRx)) {
|
169
|
+
suspenseCache.set(resultRx, registry.mount(resultRx))
|
170
|
+
}
|
171
|
+
throw result.promise
|
172
|
+
}
|
173
|
+
return result
|
174
|
+
}
|
175
|
+
|
176
|
+
/**
|
177
|
+
* @since 1.0.0
|
178
|
+
* @category hooks
|
179
|
+
*/
|
180
|
+
export const useRxSuspenseSuccess = <E, A>(
|
181
|
+
rx: Rx.Rx<Result.Result<E, A>>,
|
182
|
+
options?: { readonly suspendOnWaiting?: boolean }
|
183
|
+
): {
|
184
|
+
readonly isWaiting: boolean
|
185
|
+
readonly value: A
|
186
|
+
} => {
|
187
|
+
const registry = React.useContext(RegistryContext)
|
188
|
+
const resultRx = React.useMemo(
|
189
|
+
() => (options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx)),
|
190
|
+
[options?.suspendOnWaiting, rx]
|
191
|
+
)
|
192
|
+
const result = useRxValue(resultRx)
|
193
|
+
if (result._tag === "Suspended") {
|
194
|
+
if (!suspenseCache.has(resultRx)) {
|
195
|
+
suspenseCache.set(resultRx, registry.mount(resultRx))
|
196
|
+
}
|
197
|
+
throw result.promise
|
198
|
+
} else if (result.value._tag === "Failure") {
|
199
|
+
throw Cause.squash(result.value.cause)
|
200
|
+
}
|
201
|
+
return {
|
202
|
+
isWaiting: result.isWaiting,
|
203
|
+
value: result.value.value
|
204
|
+
}
|
205
|
+
}
|