From cabceaffcd7374b30510b99f091986de7449b004 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 7 Mar 2025 04:26:39 +0100 Subject: [PATCH] Key work --- .../extension-query/src/QueryExtension.ts | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 443d95c..fe7dd1e 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -1,5 +1,5 @@ import * as AsyncData from "@typed/async-data" -import { Context, Effect, ExecutionStrategy, Fiber, Layer, Ref, SubscriptionRef } from "effect" +import { Array, Context, Effect, ExecutionStrategy, Fiber, Layer, Ref, Schema, Stream, SubscriptionRef } from "effect" import * as React from "react" import { ReffuseExtension, type ReffuseHelpers } from "reffuse" import * as QueryRunner from "./QueryRunner.js" @@ -7,8 +7,9 @@ import * as QueryService from "./QueryService.js" export interface UseQueryProps { - readonly key: React.DependencyList + readonly key: Stream.Stream | readonly unknown[] readonly query: () => Effect.Effect + readonly refreshOnWindowFocus?: boolean } export interface UseQueryResult { @@ -29,12 +30,26 @@ export const QueryExtension = ReffuseExtension.make(() => ({ query: props.query() }), []) - this.useEffect(() => Effect.addFinalizer(() => runner.forkInterrupt).pipe( - Effect.andThen(Ref.set(runner.queryRef, props.query())), - Effect.andThen(runner.forkFetch), - ), [runner, ...props.key], { finalizerExecutionStrategy: ExecutionStrategy.parallel }) + const key = React.useMemo(() => + (Array.isArray as (self: unknown) => self is readonly unknown[])(props.key) + ? props.key + : props.key, + [props.key]) - this.useFork(() => runner.refreshOnWindowFocus, [runner]) + this.useEffect( + () => Effect.addFinalizer(() => runner.forkInterrupt).pipe( + Effect.andThen(Ref.set(runner.queryRef, props.query())), + Effect.andThen(runner.forkFetch), + ), + + [runner, ...(Array.isArray(props.key) ? props.key : [])], + { finalizerExecutionStrategy: ExecutionStrategy.parallel }, + ) + + this.useFork(() => (props.refreshOnWindowFocus ?? true) + ? runner.refreshOnWindowFocus + : Effect.void, + [props.refreshOnWindowFocus, runner]) return React.useMemo(() => ({ state: runner.stateRef,