Skip to content

Commit fa35f7d

Browse files
authored
tie useRxSetPromise lifetime to an optional AbortSignal instead of component (#251)
1 parent 0226984 commit fa35f7d

2 files changed

Lines changed: 19 additions & 17 deletions

File tree

.changeset/calm-moose-speak.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@effect-rx/rx-react": patch
3+
---
4+
5+
tie useRxSetPromise lifetime to an optional AbortSignal instead of component

packages/rx-react/src/Hooks.ts

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22
* @since 1.0.0
33
*/
44
"use client"
5-
import type * as Registry from "@effect-rx/rx/Registry"
6-
import * as Result from "@effect-rx/rx/Result"
5+
import * as Registry from "@effect-rx/rx/Registry"
6+
import type * as Result from "@effect-rx/rx/Result"
77
import * as Rx from "@effect-rx/rx/Rx"
88
import type * as RxRef from "@effect-rx/rx/RxRef"
9+
import { Effect } from "effect"
910
import * as Cause from "effect/Cause"
1011
import type * as Exit from "effect/Exit"
1112
import { globalValue } from "effect/GlobalValue"
@@ -129,22 +130,18 @@ export const useRxSet = <R, W>(rx: Rx.Writable<R, W>): (_: W | ((_: R) => W)) =>
129130
*/
130131
export const useRxSetPromise = <E, A, W>(
131132
rx: Rx.Writable<Result.Result<A, E>, W>
132-
): (_: W) => Promise<Exit.Exit<A, E>> => {
133+
): (
134+
_: W,
135+
options?: {
136+
readonly signal?: AbortSignal | undefined
137+
} | undefined
138+
) => Promise<Exit.Exit<A, E>> => {
133139
const registry = React.useContext(RegistryContext)
134-
const resolves = React.useMemo(() => new Set<(result: Exit.Exit<A, E>) => void>(), [])
135-
React.useEffect(() =>
136-
registry.subscribe(rx, (result) => {
137-
if (result.waiting || result._tag === "Initial") return
138-
const fns = Array.from(resolves)
139-
resolves.clear()
140-
const exit = Result.toExit(result)
141-
fns.forEach((resolve) => resolve(exit as any))
142-
}, { immediate: true }), [registry, rx, resolves])
143-
return React.useCallback((value) =>
144-
new Promise((resolve) => {
145-
resolves.add(resolve)
146-
registry.set(rx, value)
147-
}), [registry, rx, resolves])
140+
mountRx(registry, rx)
141+
return React.useCallback((value, options) => {
142+
registry.set(rx, value)
143+
return Effect.runPromiseExit(Registry.getResult(registry, rx), options)
144+
}, [registry, rx])
148145
}
149146

150147
/**

0 commit comments

Comments
 (0)