diff --git a/packages/example/src/query/services/Uuid4Query.ts b/packages/example/src/query/services/Uuid4Query.ts index ab11b0e..ab9d4cf 100644 --- a/packages/example/src/query/services/Uuid4Query.ts +++ b/packages/example/src/query/services/Uuid4Query.ts @@ -10,11 +10,13 @@ export class Uuid4Query extends QueryService.Tag("Uuid4Query")() {} -export const Uuid4QueryLive = QueryService.layer(Uuid4Query, Console.log("Querying...").pipe( - Effect.andThen(Effect.sleep("500 millis")), - Effect.andThen(HttpClient.get("https://www.uuidtools.com/api/generate/v4")), - HttpClient.withTracerPropagation(false), - Effect.flatMap(res => res.json), - Effect.flatMap(Schema.decodeUnknown(Result)), - Effect.scoped, -)) +export const Uuid4QueryLive = QueryService.layer(Uuid4Query, { + query: Console.log("Querying...").pipe( + Effect.andThen(Effect.sleep("500 millis")), + Effect.andThen(HttpClient.get("https://www.uuidtools.com/api/generate/v4")), + HttpClient.withTracerPropagation(false), + Effect.flatMap(res => res.json), + Effect.flatMap(Schema.decodeUnknown(Result)), + Effect.scoped, + ) +}) diff --git a/packages/example/src/routes/query.tsx b/packages/example/src/routes/query.tsx index 8a2c328..bef9373 100644 --- a/packages/example/src/routes/query.tsx +++ b/packages/example/src/routes/query.tsx @@ -17,7 +17,7 @@ function RouteComponent() { const runSync = R.useRunSync() const { state, refresh } = R.useQuery({ - effect: () => Console.log("Querying...").pipe( + query: () => Console.log("Querying...").pipe( Effect.andThen(Effect.sleep("500 millis")), Effect.andThen(HttpClient.get("https://www.uuidtools.com/api/generate/v4")), HttpClient.withTracerPropagation(false), @@ -25,7 +25,7 @@ function RouteComponent() { Effect.flatMap(Schema.decodeUnknown(Result)), Effect.scoped, ), - deps: [], + key: [], }) const [queryState] = R.useRefState(state) diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 83ecdd7..380ff56 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -7,8 +7,8 @@ import * as QueryRunner from "./QueryRunner.js" export interface UseQueryProps { - effect: () => Effect.Effect - readonly deps: React.DependencyList + readonly query: () => Effect.Effect + readonly key: React.DependencyList } export interface UseQueryResult { @@ -22,12 +22,14 @@ export const QueryExtension = ReffuseExtension.make(() => ({ this: ReffuseHelpers.ReffuseHelpers, props: UseQueryProps, ): UseQueryResult { - const runner = this.useMemo(() => QueryRunner.make(props.effect()), []) + const runner = this.useMemo(() => QueryRunner.make({ + query: props.query() + }), []) this.useEffect(() => Effect.addFinalizer(() => runner.forkInterrupt).pipe( - Effect.andThen(Ref.set(runner.queryRef, props.effect())), + Effect.andThen(Ref.set(runner.queryRef, props.query())), Effect.andThen(runner.forkFetch), - ), [runner, ...props.deps]) + ), [runner, ...props.key]) this.useFork(() => Stream.runForEach( BrowserStream.fromEventListenerWindow("focus"), diff --git a/packages/extension-query/src/QueryRunner.ts b/packages/extension-query/src/QueryRunner.ts index 072e816..93cef0f 100644 --- a/packages/extension-query/src/QueryRunner.ts +++ b/packages/extension-query/src/QueryRunner.ts @@ -13,12 +13,16 @@ export interface QueryRunner { } +export interface MakeProps { + readonly query: Effect.Effect +} + export const make = ( - query: Effect.Effect + props: MakeProps ): Effect.Effect, never, R> => Effect.gen(function*() { const context = yield* Effect.context() - const queryRef = yield* SubscriptionRef.make(query) + const queryRef = yield* SubscriptionRef.make(props.query) const stateRef = yield* SubscriptionRef.make(AsyncData.noData()) const fiberRef = yield* SubscriptionRef.make(Option.none>()) diff --git a/packages/extension-query/src/QueryService.ts b/packages/extension-query/src/QueryService.ts index bde1206..6dc92d7 100644 --- a/packages/extension-query/src/QueryService.ts +++ b/packages/extension-query/src/QueryService.ts @@ -8,16 +8,22 @@ export interface QueryService { readonly refresh: Effect.Effect> } - export const Tag = (id: Id) => < Self, A, E = never, >() => Effect.Tag(id)>() + +export interface LayerProps { + readonly query: Effect.Effect +} + export const layer = ( tag: Context.TagClass>, - query: Effect.Effect, + props: LayerProps, ): Layer.Layer => Layer.effect(tag, Effect.gen(function*() { - const runner = yield* QueryRunner.make(query) + const runner = yield* QueryRunner.make({ + query: props.query + }) return { state: runner.stateRef,