@effect-rx/rx-react 0.1.18 → 0.1.19
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.map +1 -1
- package/index.js +58 -81
- package/index.js.map +1 -1
- package/mjs/index.mjs +58 -81
- package/mjs/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +45 -59
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,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;
|
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;AA8BtF;;;GAGG;AACH,eAAO,MAAM,UAAU,wBAItB,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;AA8CZ;;;GAGG;AACH,eAAO,MAAM,aAAa,mDAEd;IAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE;wBAE7B,OAAO;;CA0B5B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,mDAErB;IAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE;wBAE7B,OAAO;;CAW5B,CAAA"}
|
package/index.js
CHANGED
@@ -28,24 +28,23 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
28
28
|
*/
|
29
29
|
const RegistryContext = /*#__PURE__*/React.createContext( /*#__PURE__*/Registry.make());
|
30
30
|
exports.RegistryContext = RegistryContext;
|
31
|
+
const storeRegistry = /*#__PURE__*/(0, _GlobalValue.globalValue)("@effect-rx/rx-react/storeRegistry", () => new WeakMap());
|
31
32
|
function makeStore(registry, rx) {
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
const [get, unmount] = registry.subscribeGetter(rx, f);
|
37
|
-
getter = get;
|
38
|
-
return unmount;
|
39
|
-
}
|
40
|
-
function snapshot() {
|
41
|
-
return getter();
|
33
|
+
const stores = storeRegistry.get(registry) ?? storeRegistry.set(registry, new WeakMap()).get(registry);
|
34
|
+
const store = stores.get(rx);
|
35
|
+
if (store) {
|
36
|
+
return store;
|
42
37
|
}
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
snapshot
|
38
|
+
const newStore = {
|
39
|
+
subscribe(f) {
|
40
|
+
return registry.subscribe(rx, f);
|
41
|
+
},
|
42
|
+
snapshot() {
|
43
|
+
return registry.get(rx);
|
44
|
+
}
|
48
45
|
};
|
46
|
+
stores.set(rx, newStore);
|
47
|
+
return newStore;
|
49
48
|
}
|
50
49
|
/**
|
51
50
|
* @since 1.0.0
|
@@ -53,11 +52,8 @@ function makeStore(registry, rx) {
|
|
53
52
|
*/
|
54
53
|
const useRxValue = rx => {
|
55
54
|
const registry = React.useContext(RegistryContext);
|
56
|
-
const store =
|
57
|
-
|
58
|
-
store.current = makeStore(registry, rx);
|
59
|
-
}
|
60
|
-
return React.useSyncExternalStore(store.current.subscribe, store.current.snapshot);
|
55
|
+
const store = makeStore(registry, rx);
|
56
|
+
return React.useSyncExternalStore(store.subscribe, store.snapshot);
|
61
57
|
};
|
62
58
|
/**
|
63
59
|
* @since 1.0.0
|
@@ -93,61 +89,40 @@ const useRefreshRx = rx => {
|
|
93
89
|
exports.useRefreshRx = useRefreshRx;
|
94
90
|
const useRx = rx => [useRxValue(rx), useSetRx(rx)];
|
95
91
|
exports.useRx = useRx;
|
96
|
-
const suspenseCache = /*#__PURE__*/(0, _GlobalValue.globalValue)("@effect-rx/rx-react/suspenseCache", () => new
|
97
|
-
const
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
promise: new Promise(resolve => {
|
105
|
-
ctx.addFinalizer(() => {
|
106
|
-
resolve();
|
107
|
-
const unmount = suspenseCache.get(selfRx);
|
108
|
-
if (unmount) {
|
109
|
-
unmount();
|
110
|
-
suspenseCache.delete(selfRx);
|
111
|
-
}
|
112
|
-
});
|
113
|
-
})
|
114
|
-
};
|
115
|
-
}
|
116
|
-
const isWaiting = Result.isWaiting(result);
|
92
|
+
const suspenseCache = /*#__PURE__*/(0, _GlobalValue.globalValue)("@effect-rx/rx-react/suspenseCache", () => new WeakMap());
|
93
|
+
const suspenseRegistry = /*#__PURE__*/new FinalizationRegistry(unmount => {
|
94
|
+
unmount();
|
95
|
+
});
|
96
|
+
const suspenseRx = /*#__PURE__*/Rx.family(rx => Rx.readable((get, ctx) => {
|
97
|
+
const result = get(rx);
|
98
|
+
const value = Result.noWaiting(result);
|
99
|
+
if (value._tag === "Initial") {
|
117
100
|
return {
|
118
|
-
_tag: "
|
119
|
-
|
120
|
-
value
|
101
|
+
_tag: "Suspended",
|
102
|
+
promise: new Promise(resolve => ctx.addFinalizer(resolve))
|
121
103
|
};
|
122
|
-
}
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
resolve();
|
134
|
-
const unmount = suspenseCache.get(rx);
|
135
|
-
if (unmount) {
|
136
|
-
unmount();
|
137
|
-
suspenseCache.delete(rx);
|
138
|
-
}
|
139
|
-
});
|
140
|
-
})
|
141
|
-
};
|
142
|
-
}
|
104
|
+
}
|
105
|
+
const isWaiting = Result.isWaiting(result);
|
106
|
+
return {
|
107
|
+
_tag: "Value",
|
108
|
+
isWaiting,
|
109
|
+
value
|
110
|
+
};
|
111
|
+
}));
|
112
|
+
const suspenseRxWaiting = /*#__PURE__*/Rx.family(rx => Rx.readable((get, ctx) => {
|
113
|
+
const result = get(rx);
|
114
|
+
if (result._tag === "Waiting" || result._tag === "Initial") {
|
143
115
|
return {
|
144
|
-
_tag: "
|
145
|
-
|
146
|
-
value: result
|
116
|
+
_tag: "Suspended",
|
117
|
+
promise: new Promise(resolve => ctx.addFinalizer(resolve))
|
147
118
|
};
|
148
|
-
}
|
149
|
-
return
|
150
|
-
|
119
|
+
}
|
120
|
+
return {
|
121
|
+
_tag: "Value",
|
122
|
+
isWaiting: false,
|
123
|
+
value: result
|
124
|
+
};
|
125
|
+
}));
|
151
126
|
/**
|
152
127
|
* @since 1.0.0
|
153
128
|
* @category hooks
|
@@ -158,9 +133,18 @@ const useRxSuspense = (rx, options) => {
|
|
158
133
|
const result = useRxValue(resultRx);
|
159
134
|
if (result._tag === "Suspended") {
|
160
135
|
if (!suspenseCache.has(resultRx)) {
|
161
|
-
|
136
|
+
const unmount = registry.mount(resultRx);
|
137
|
+
suspenseCache.set(resultRx, unmount);
|
138
|
+
suspenseRegistry.register(resultRx, unmount, resultRx);
|
162
139
|
}
|
163
140
|
throw result.promise;
|
141
|
+
} else if (suspenseCache.has(resultRx)) {
|
142
|
+
const unmount = suspenseCache.get(resultRx);
|
143
|
+
if (unmount) {
|
144
|
+
suspenseCache.delete(resultRx);
|
145
|
+
suspenseRegistry.unregister(resultRx);
|
146
|
+
unmount();
|
147
|
+
}
|
164
148
|
}
|
165
149
|
return result;
|
166
150
|
};
|
@@ -170,15 +154,8 @@ const useRxSuspense = (rx, options) => {
|
|
170
154
|
*/
|
171
155
|
exports.useRxSuspense = useRxSuspense;
|
172
156
|
const useRxSuspenseSuccess = (rx, options) => {
|
173
|
-
const
|
174
|
-
|
175
|
-
const result = useRxValue(resultRx);
|
176
|
-
if (result._tag === "Suspended") {
|
177
|
-
if (!suspenseCache.has(resultRx)) {
|
178
|
-
suspenseCache.set(resultRx, registry.mount(resultRx));
|
179
|
-
}
|
180
|
-
throw result.promise;
|
181
|
-
} else if (result.value._tag === "Failure") {
|
157
|
+
const result = useRxSuspense(rx, options);
|
158
|
+
if (result.value._tag === "Failure") {
|
182
159
|
throw Cause.squash(result.value.cause);
|
183
160
|
}
|
184
161
|
return {
|
package/index.js.map
CHANGED
@@ -1 +1 @@
|
|
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","
|
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","storeRegistry","globalValue","makeStore","registry","rx","stores","store","newStore","subscribe","f","snapshot","useRxValue","useContext","useSyncExternalStore","useSetRx","useCallback","value","useRefreshRx","refresh","useRx","suspenseCache","suspenseRegistry","FinalizationRegistry","unmount","suspenseRx","family","readable","ctx","result","noWaiting","_tag","promise","Promise","resolve","addFinalizer","isWaiting","suspenseRxWaiting","useRxSuspense","options","resultRx","useMemo","suspendOnWaiting","mount","register","delete","unregister","useRxSuspenseSuccess","squash","cause"],"sources":["./src/index.ts"],"sourcesContent":[null],"mappings":"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"}
|
package/mjs/index.mjs
CHANGED
@@ -18,24 +18,23 @@ export { Rx_1 as Rx };
|
|
18
18
|
* @category context
|
19
19
|
*/
|
20
20
|
export const RegistryContext = /*#__PURE__*/React.createContext( /*#__PURE__*/Registry.make());
|
21
|
+
const storeRegistry = /*#__PURE__*/globalValue("@effect-rx/rx-react/storeRegistry", () => new WeakMap());
|
21
22
|
function makeStore(registry, rx) {
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
const [get, unmount] = registry.subscribeGetter(rx, f);
|
27
|
-
getter = get;
|
28
|
-
return unmount;
|
29
|
-
}
|
30
|
-
function snapshot() {
|
31
|
-
return getter();
|
23
|
+
const stores = storeRegistry.get(registry) ?? storeRegistry.set(registry, new WeakMap()).get(registry);
|
24
|
+
const store = stores.get(rx);
|
25
|
+
if (store) {
|
26
|
+
return store;
|
32
27
|
}
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
snapshot
|
28
|
+
const newStore = {
|
29
|
+
subscribe(f) {
|
30
|
+
return registry.subscribe(rx, f);
|
31
|
+
},
|
32
|
+
snapshot() {
|
33
|
+
return registry.get(rx);
|
34
|
+
}
|
38
35
|
};
|
36
|
+
stores.set(rx, newStore);
|
37
|
+
return newStore;
|
39
38
|
}
|
40
39
|
/**
|
41
40
|
* @since 1.0.0
|
@@ -43,11 +42,8 @@ function makeStore(registry, rx) {
|
|
43
42
|
*/
|
44
43
|
export const useRxValue = rx => {
|
45
44
|
const registry = React.useContext(RegistryContext);
|
46
|
-
const store =
|
47
|
-
|
48
|
-
store.current = makeStore(registry, rx);
|
49
|
-
}
|
50
|
-
return React.useSyncExternalStore(store.current.subscribe, store.current.snapshot);
|
45
|
+
const store = makeStore(registry, rx);
|
46
|
+
return React.useSyncExternalStore(store.subscribe, store.snapshot);
|
51
47
|
};
|
52
48
|
/**
|
53
49
|
* @since 1.0.0
|
@@ -79,61 +75,40 @@ export const useRefreshRx = rx => {
|
|
79
75
|
* @category hooks
|
80
76
|
*/
|
81
77
|
export const useRx = rx => [useRxValue(rx), useSetRx(rx)];
|
82
|
-
const suspenseCache = /*#__PURE__*/globalValue("@effect-rx/rx-react/suspenseCache", () => new
|
83
|
-
const
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
promise: new Promise(resolve => {
|
91
|
-
ctx.addFinalizer(() => {
|
92
|
-
resolve();
|
93
|
-
const unmount = suspenseCache.get(selfRx);
|
94
|
-
if (unmount) {
|
95
|
-
unmount();
|
96
|
-
suspenseCache.delete(selfRx);
|
97
|
-
}
|
98
|
-
});
|
99
|
-
})
|
100
|
-
};
|
101
|
-
}
|
102
|
-
const isWaiting = Result.isWaiting(result);
|
78
|
+
const suspenseCache = /*#__PURE__*/globalValue("@effect-rx/rx-react/suspenseCache", () => new WeakMap());
|
79
|
+
const suspenseRegistry = /*#__PURE__*/new FinalizationRegistry(unmount => {
|
80
|
+
unmount();
|
81
|
+
});
|
82
|
+
const suspenseRx = /*#__PURE__*/Rx.family(rx => Rx.readable((get, ctx) => {
|
83
|
+
const result = get(rx);
|
84
|
+
const value = Result.noWaiting(result);
|
85
|
+
if (value._tag === "Initial") {
|
103
86
|
return {
|
104
|
-
_tag: "
|
105
|
-
|
106
|
-
value
|
87
|
+
_tag: "Suspended",
|
88
|
+
promise: new Promise(resolve => ctx.addFinalizer(resolve))
|
107
89
|
};
|
108
|
-
}
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
resolve();
|
120
|
-
const unmount = suspenseCache.get(rx);
|
121
|
-
if (unmount) {
|
122
|
-
unmount();
|
123
|
-
suspenseCache.delete(rx);
|
124
|
-
}
|
125
|
-
});
|
126
|
-
})
|
127
|
-
};
|
128
|
-
}
|
90
|
+
}
|
91
|
+
const isWaiting = Result.isWaiting(result);
|
92
|
+
return {
|
93
|
+
_tag: "Value",
|
94
|
+
isWaiting,
|
95
|
+
value
|
96
|
+
};
|
97
|
+
}));
|
98
|
+
const suspenseRxWaiting = /*#__PURE__*/Rx.family(rx => Rx.readable((get, ctx) => {
|
99
|
+
const result = get(rx);
|
100
|
+
if (result._tag === "Waiting" || result._tag === "Initial") {
|
129
101
|
return {
|
130
|
-
_tag: "
|
131
|
-
|
132
|
-
value: result
|
102
|
+
_tag: "Suspended",
|
103
|
+
promise: new Promise(resolve => ctx.addFinalizer(resolve))
|
133
104
|
};
|
134
|
-
}
|
135
|
-
return
|
136
|
-
|
105
|
+
}
|
106
|
+
return {
|
107
|
+
_tag: "Value",
|
108
|
+
isWaiting: false,
|
109
|
+
value: result
|
110
|
+
};
|
111
|
+
}));
|
137
112
|
/**
|
138
113
|
* @since 1.0.0
|
139
114
|
* @category hooks
|
@@ -144,9 +119,18 @@ export const useRxSuspense = (rx, options) => {
|
|
144
119
|
const result = useRxValue(resultRx);
|
145
120
|
if (result._tag === "Suspended") {
|
146
121
|
if (!suspenseCache.has(resultRx)) {
|
147
|
-
|
122
|
+
const unmount = registry.mount(resultRx);
|
123
|
+
suspenseCache.set(resultRx, unmount);
|
124
|
+
suspenseRegistry.register(resultRx, unmount, resultRx);
|
148
125
|
}
|
149
126
|
throw result.promise;
|
127
|
+
} else if (suspenseCache.has(resultRx)) {
|
128
|
+
const unmount = suspenseCache.get(resultRx);
|
129
|
+
if (unmount) {
|
130
|
+
suspenseCache.delete(resultRx);
|
131
|
+
suspenseRegistry.unregister(resultRx);
|
132
|
+
unmount();
|
133
|
+
}
|
150
134
|
}
|
151
135
|
return result;
|
152
136
|
};
|
@@ -155,15 +139,8 @@ export const useRxSuspense = (rx, options) => {
|
|
155
139
|
* @category hooks
|
156
140
|
*/
|
157
141
|
export const useRxSuspenseSuccess = (rx, options) => {
|
158
|
-
const
|
159
|
-
|
160
|
-
const result = useRxValue(resultRx);
|
161
|
-
if (result._tag === "Suspended") {
|
162
|
-
if (!suspenseCache.has(resultRx)) {
|
163
|
-
suspenseCache.set(resultRx, registry.mount(resultRx));
|
164
|
-
}
|
165
|
-
throw result.promise;
|
166
|
-
} else if (result.value._tag === "Failure") {
|
142
|
+
const result = useRxSuspense(rx, options);
|
143
|
+
if (result.value._tag === "Failure") {
|
167
144
|
throw Cause.squash(result.value.cause);
|
168
145
|
}
|
169
146
|
return {
|
package/mjs/index.mjs.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["Registry","Result","Rx","globalValue","Cause","React","RegistryContext","createContext","make","
|
1
|
+
{"version":3,"file":"index.mjs","names":["Registry","Result","Rx","globalValue","Cause","React","RegistryContext","createContext","make","storeRegistry","WeakMap","makeStore","registry","rx","stores","get","set","store","newStore","subscribe","f","snapshot","useRxValue","useContext","useSyncExternalStore","useSetRx","useCallback","value","useRefreshRx","refresh","useRx","suspenseCache","suspenseRegistry","FinalizationRegistry","unmount","suspenseRx","family","readable","ctx","result","noWaiting","_tag","promise","Promise","resolve","addFinalizer","isWaiting","suspenseRxWaiting","useRxSuspense","options","resultRx","useMemo","suspendOnWaiting","has","mount","register","delete","unregister","useRxSuspenseSuccess","squash","cause"],"sources":["../src/index.ts"],"sourcesContent":[null],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
@@ -19,25 +19,31 @@ export * as Rx from "@effect-rx/rx/Rx"
|
|
19
19
|
export const RegistryContext = React.createContext<Registry.Registry>(Registry.make())
|
20
20
|
|
21
21
|
interface RxStore<A> {
|
22
|
-
readonly rx: Rx.Rx<A>
|
23
|
-
readonly registry: Registry.Registry
|
24
22
|
readonly subscribe: (f: () => void) => () => void
|
25
23
|
readonly snapshot: () => A
|
26
24
|
}
|
27
25
|
|
26
|
+
const storeRegistry = globalValue(
|
27
|
+
"@effect-rx/rx-react/storeRegistry",
|
28
|
+
() => new WeakMap<Registry.Registry, WeakMap<Rx.Rx<any>, RxStore<any>>>()
|
29
|
+
)
|
30
|
+
|
28
31
|
function makeStore<A>(registry: Registry.Registry, rx: Rx.Rx<A>): RxStore<A> {
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
const [get, unmount] = registry.subscribeGetter(rx, f)
|
34
|
-
getter = get
|
35
|
-
return unmount
|
32
|
+
const stores = storeRegistry.get(registry) ?? storeRegistry.set(registry, new WeakMap()).get(registry)!
|
33
|
+
const store = stores.get(rx)
|
34
|
+
if (store) {
|
35
|
+
return store
|
36
36
|
}
|
37
|
-
|
38
|
-
|
37
|
+
const newStore: RxStore<A> = {
|
38
|
+
subscribe(f) {
|
39
|
+
return registry.subscribe(rx, f)
|
40
|
+
},
|
41
|
+
snapshot() {
|
42
|
+
return registry.get(rx)
|
43
|
+
}
|
39
44
|
}
|
40
|
-
|
45
|
+
stores.set(rx, newStore)
|
46
|
+
return newStore
|
41
47
|
}
|
42
48
|
|
43
49
|
/**
|
@@ -46,11 +52,8 @@ function makeStore<A>(registry: Registry.Registry, rx: Rx.Rx<A>): RxStore<A> {
|
|
46
52
|
*/
|
47
53
|
export const useRxValue = <A>(rx: Rx.Rx<A>): A => {
|
48
54
|
const registry = React.useContext(RegistryContext)
|
49
|
-
const store =
|
50
|
-
|
51
|
-
store.current = makeStore(registry, rx)
|
52
|
-
}
|
53
|
-
return React.useSyncExternalStore(store.current.subscribe, store.current.snapshot)
|
55
|
+
const store = makeStore(registry, rx)
|
56
|
+
return React.useSyncExternalStore(store.subscribe, store.snapshot)
|
54
57
|
}
|
55
58
|
|
56
59
|
/**
|
@@ -101,55 +104,38 @@ type SuspenseResult<E, A> =
|
|
101
104
|
readonly value: Result.Success<E, A> | Result.Failure<E, A>
|
102
105
|
}
|
103
106
|
|
104
|
-
const suspenseCache = globalValue("@effect-rx/rx-react/suspenseCache", () => new
|
107
|
+
const suspenseCache = globalValue("@effect-rx/rx-react/suspenseCache", () => new WeakMap<Rx.Rx<any>, () => void>())
|
108
|
+
const suspenseRegistry = new FinalizationRegistry((unmount: () => void) => {
|
109
|
+
unmount()
|
110
|
+
})
|
105
111
|
|
106
|
-
const suspenseRx = Rx.family((rx: Rx.Rx<Result.Result<any, any>>) =>
|
107
|
-
|
112
|
+
const suspenseRx = Rx.family((rx: Rx.Rx<Result.Result<any, any>>) =>
|
113
|
+
Rx.readable((get, ctx): SuspenseResult<any, any> => {
|
108
114
|
const result = get(rx)
|
109
115
|
const value = Result.noWaiting(result)
|
110
116
|
if (value._tag === "Initial") {
|
111
117
|
return {
|
112
118
|
_tag: "Suspended",
|
113
|
-
promise: new Promise<void>((resolve) =>
|
114
|
-
ctx.addFinalizer(() => {
|
115
|
-
resolve()
|
116
|
-
const unmount = suspenseCache.get(selfRx)
|
117
|
-
if (unmount) {
|
118
|
-
unmount()
|
119
|
-
suspenseCache.delete(selfRx)
|
120
|
-
}
|
121
|
-
})
|
122
|
-
})
|
119
|
+
promise: new Promise<void>((resolve) => ctx.addFinalizer(resolve))
|
123
120
|
} as const
|
124
121
|
}
|
125
122
|
const isWaiting = Result.isWaiting(result)
|
126
123
|
return { _tag: "Value", isWaiting, value } as const
|
127
124
|
})
|
128
|
-
|
129
|
-
})
|
125
|
+
)
|
130
126
|
|
131
|
-
const suspenseRxWaiting = Rx.family((rx: Rx.Rx<Result.Result<any, any>>) =>
|
132
|
-
|
127
|
+
const suspenseRxWaiting = Rx.family((rx: Rx.Rx<Result.Result<any, any>>) =>
|
128
|
+
Rx.readable((get, ctx): SuspenseResult<any, any> => {
|
133
129
|
const result = get(rx)
|
134
130
|
if (result._tag === "Waiting" || result._tag === "Initial") {
|
135
131
|
return {
|
136
132
|
_tag: "Suspended",
|
137
|
-
promise: new Promise<void>((resolve) =>
|
138
|
-
ctx.addFinalizer(() => {
|
139
|
-
resolve()
|
140
|
-
const unmount = suspenseCache.get(rx)
|
141
|
-
if (unmount) {
|
142
|
-
unmount()
|
143
|
-
suspenseCache.delete(rx)
|
144
|
-
}
|
145
|
-
})
|
146
|
-
})
|
133
|
+
promise: new Promise<void>((resolve) => ctx.addFinalizer(resolve))
|
147
134
|
} as const
|
148
135
|
}
|
149
136
|
return { _tag: "Value", isWaiting: false, value: result } as const
|
150
137
|
})
|
151
|
-
|
152
|
-
})
|
138
|
+
)
|
153
139
|
|
154
140
|
/**
|
155
141
|
* @since 1.0.0
|
@@ -170,10 +156,20 @@ export const useRxSuspense = <E, A>(
|
|
170
156
|
const result = useRxValue(resultRx)
|
171
157
|
if (result._tag === "Suspended") {
|
172
158
|
if (!suspenseCache.has(resultRx)) {
|
173
|
-
|
159
|
+
const unmount = registry.mount(resultRx)
|
160
|
+
suspenseCache.set(resultRx, unmount)
|
161
|
+
suspenseRegistry.register(resultRx, unmount, resultRx)
|
174
162
|
}
|
175
163
|
throw result.promise
|
164
|
+
} else if (suspenseCache.has(resultRx)) {
|
165
|
+
const unmount = suspenseCache.get(resultRx)
|
166
|
+
if (unmount) {
|
167
|
+
suspenseCache.delete(resultRx)
|
168
|
+
suspenseRegistry.unregister(resultRx)
|
169
|
+
unmount()
|
170
|
+
}
|
176
171
|
}
|
172
|
+
|
177
173
|
return result
|
178
174
|
}
|
179
175
|
|
@@ -188,18 +184,8 @@ export const useRxSuspenseSuccess = <E, A>(
|
|
188
184
|
readonly isWaiting: boolean
|
189
185
|
readonly value: A
|
190
186
|
} => {
|
191
|
-
const
|
192
|
-
|
193
|
-
() => (options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx)),
|
194
|
-
[options?.suspendOnWaiting, rx]
|
195
|
-
)
|
196
|
-
const result = useRxValue(resultRx)
|
197
|
-
if (result._tag === "Suspended") {
|
198
|
-
if (!suspenseCache.has(resultRx)) {
|
199
|
-
suspenseCache.set(resultRx, registry.mount(resultRx))
|
200
|
-
}
|
201
|
-
throw result.promise
|
202
|
-
} else if (result.value._tag === "Failure") {
|
187
|
+
const result = useRxSuspense(rx, options)
|
188
|
+
if (result.value._tag === "Failure") {
|
203
189
|
throw Cause.squash(result.value.cause)
|
204
190
|
}
|
205
191
|
return {
|