( atom: () => Atom.Writable<Atom.PullResult<A, E>, void> )
| 373 | return { |
| 374 | result, |
| 375 | data, |
| 376 | awaitResult, |
| 377 | refetch, |
| 378 | refresh, |
| 379 | registry, |
| 380 | atom: atomRef |
| 381 | } |
| 382 | } |
| 383 | |
| 384 | export const useAtomSuspense = <A, E>( |
| 385 | atom: () => Atom.Atom<AsyncResult.AsyncResult<A, E>> |
| 386 | ): Promise<SuspenseQueryView<A, E>> => { |
| 387 | const [{ view, data }, isMounted, signal] = useScopedSuspenseSetup(() => { |
| 388 | const view = useAtomQuery(atom) |
| 389 | const data = latestDefined(() => view.data.value, "atom suspense") |
| 390 | return { view, data } |
| 391 | }) |
| 392 | |
| 393 | const eff = Effect.gen(function*() { |
| 394 | const exit = yield* view.awaitResult().pipe(Effect.exit) |
| 395 | if (!isMounted.value) { |
| 396 | return yield* Effect.interrupt |
| 397 | } |
| 398 | if (Exit.isFailure(exit)) { |
| 399 | return yield* Exit.failCause(exit.cause) |
| 400 | } |
| 401 | |
| 402 | const fetch = (_options?: RefetchOptions) => view.refetch() |
| 403 | const handle = { |
| 404 | awaitResult: view.awaitResult, |
| 405 | refetch: view.refetch, |
| 406 | refresh: view.refresh, |
| 407 | registry: view.registry, |
| 408 | atom: view.atom |
| 409 | } |
| 410 | return Object.assign( |
| 411 | [ |
| 412 | view.result, |
| 413 | data, |
| 414 | fetch, |
| 415 | handle |
| 416 | ] as const, |
| 417 | { |
| 418 | ...view, |
| 419 | data |
no test coverage detected
searching dependent graphs…