From be8098fb7d7f8b20e6caacfd7bfa6038f7000871 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 10 Mar 2025 01:56:11 +0100 Subject: [PATCH] Query work --- packages/example/src/query/services/Uuid4Query.ts | 1 + packages/example/src/routes/query/service.tsx | 2 +- packages/extension-query/src/QueryExtension.ts | 10 +++++++--- packages/extension-query/src/QueryService.ts | 9 +++++---- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/packages/example/src/query/services/Uuid4Query.ts b/packages/example/src/query/services/Uuid4Query.ts index ffc2b36..a7336bd 100644 --- a/packages/example/src/query/services/Uuid4Query.ts +++ b/packages/example/src/query/services/Uuid4Query.ts @@ -6,6 +6,7 @@ import { ParseResult, Schema } from "effect" export const Result = Schema.Array(Schema.String) export class Uuid4Query extends QueryService.Tag("Uuid4Query")() {} diff --git a/packages/example/src/routes/query/service.tsx b/packages/example/src/routes/query/service.tsx index 71b97a5..6a926a8 100644 --- a/packages/example/src/routes/query/service.tsx +++ b/packages/example/src/routes/query/service.tsx @@ -14,7 +14,7 @@ export const Route = createFileRoute("/query/service")({ function RouteComponent() { const query = R.useQuery({ - key: R.useStreamFromValues(["uuid4", 10]), + key: R.useStreamFromValues(["uuid4", 10 as number]), query: ([, count]) => Console.log(`Querying ${ count } IDs...`).pipe( Effect.andThen(Effect.sleep("500 millis")), Effect.andThen(HttpClient.get(`https://www.uuidtools.com/api/generate/v4/count/${ count }`)), diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 49967b2..acd5cf9 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -12,11 +12,13 @@ export interface UseQueryProps { readonly refreshOnWindowFocus?: boolean } -export interface UseQueryResult { +export interface UseQueryResult { + readonly keyStream: Stream.Stream readonly state: SubscriptionRef.SubscriptionRef> readonly refresh: Effect.Effect> + readonly layer: ( - tag: Context.TagClass> + tag: Context.TagClass> ) => Layer.Layer } @@ -25,7 +27,7 @@ export const QueryExtension = ReffuseExtension.make(() => ({ useQuery( this: ReffuseHelpers.ReffuseHelpers, props: UseQueryProps, - ): UseQueryResult { + ): UseQueryResult { const runner = this.useMemo(() => QueryRunner.make({ key: props.key, query: props.query, @@ -39,10 +41,12 @@ export const QueryExtension = ReffuseExtension.make(() => ({ [props.refreshOnWindowFocus, runner]) return React.useMemo(() => ({ + keyStream: props.key, state: runner.stateRef, refresh: runner.forkRefresh, layer: tag => Layer.succeed(tag, { + keyStream: props.key, state: runner.stateRef, refresh: runner.forkRefresh, }), diff --git a/packages/extension-query/src/QueryService.ts b/packages/extension-query/src/QueryService.ts index fd047bc..8025cb6 100644 --- a/packages/extension-query/src/QueryService.ts +++ b/packages/extension-query/src/QueryService.ts @@ -1,15 +1,16 @@ import type * as AsyncData from "@typed/async-data" -import { type Cause, Effect, type Fiber, type SubscriptionRef } from "effect" +import { type Cause, Effect, type Fiber, type Stream, type SubscriptionRef } from "effect" -export interface QueryService { +export interface QueryService { + readonly keyStream: Stream.Stream readonly state: SubscriptionRef.SubscriptionRef> readonly refresh: Effect.Effect> } export const Tag = (id: Id) => < - Self, A, E = never, ->() => Effect.Tag(id)>() + Self, K extends readonly unknown[], A, E = never, +>() => Effect.Tag(id)>() // export interface LayerProps {