diff --git a/packages/example/src/routes/query/usemutation.tsx b/packages/example/src/routes/query/usemutation.tsx index cfaae0d..caaa1a3 100644 --- a/packages/example/src/routes/query/usemutation.tsx +++ b/packages/example/src/routes/query/usemutation.tsx @@ -1,6 +1,7 @@ import { R } from "@/reffuse" import { HttpClient } from "@effect/platform" import { Button, Container, Flex, Slider, Text } from "@radix-ui/themes" +import { QueryProgress } from "@reffuse/extension-query" import { createFileRoute } from "@tanstack/react-router" import * as AsyncData from "@typed/async-data" import { Array, Console, Effect, flow, Option, Schema, Stream } from "effect" @@ -22,6 +23,7 @@ function RouteComponent() { const mutation = R.useMutation({ mutation: ([count]: readonly [count: number]) => Console.log(`Querying ${ count } IDs...`).pipe( Effect.andThen(Effect.sleep("500 millis")), + Effect.tap(() => QueryProgress.QueryProgress.get), Effect.andThen(HttpClient.get(`https://www.uuidtools.com/api/generate/v4/count/${ count }`)), HttpClient.withTracerPropagation(false), Effect.flatMap(res => res.json), diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index ef0be44..55d2068 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -2,13 +2,11 @@ import type * as AsyncData from "@typed/async-data" import { type Cause, type Context, Effect, type Fiber, Layer, type Option, type Stream, type SubscriptionRef } from "effect" import * as React from "react" import { ReffuseExtension, type ReffuseHelpers } from "reffuse" -import * as MutationRunner from "./MutationRunner.js" import type * as MutationService from "./MutationService.js" import * as QueryClient from "./QueryClient.js" import type * as QueryProgress from "./QueryProgress.js" -import * as QueryRunner from "./QueryRunner.js" import type * as QueryService from "./QueryService.js" -import type * as QueryState from "./QueryState.js" +import { MutationRunner, QueryRunner } from "./internal/index.js" export interface UseQueryProps { @@ -29,7 +27,7 @@ export interface UseQueryResult { export interface UseMutationProps { - readonly mutation: (key: K) => Effect.Effect> + readonly mutation: (key: K) => Effect.Effect } export interface UseMutationResult { diff --git a/packages/extension-query/src/QueryProgress.ts b/packages/extension-query/src/QueryProgress.ts index 665da94..4a78ec5 100644 --- a/packages/extension-query/src/QueryProgress.ts +++ b/packages/extension-query/src/QueryProgress.ts @@ -1,36 +1,37 @@ import * as AsyncData from "@typed/async-data" import { Effect, flow, Layer, Match, Option } from "effect" -import * as QueryState from "./QueryState.js" +import { QueryState } from "./internal/index.js" export class QueryProgress extends Effect.Tag("@reffuse/extension-query/QueryProgress"), never, QueryState.QueryState> + readonly get: Effect.Effect> readonly update: ( f: (previous: Option.Option) => AsyncData.Progress - ) => Effect.Effect> + ) => Effect.Effect }>() { - static readonly Live = Layer.sync(this, () => { - const queryStateTag = QueryState.makeTag() + static readonly Live: Layer.Layer< + QueryProgress, + never, + QueryState.QueryState + > = Layer.effect(this, Effect.gen(function*() { + const state = yield* QueryState.makeTag() - const get = queryStateTag.pipe( - Effect.flatMap(state => state.get), + const get = state.get.pipe( Effect.map(flow(Match.value, Match.tag("Loading", v => v.progress), Match.tag("Refreshing", v => v.progress), Match.orElse(() => Option.none()), - )), + )) ) const update = (f: (previous: Option.Option) => AsyncData.Progress) => get.pipe( Effect.map(f), - Effect.flatMap(progress => queryStateTag.pipe( - Effect.flatMap(queryState => queryState.update(previous => - AsyncData.updateProgress(previous, progress) - )) + Effect.flatMap(progress => state.update(previous => + AsyncData.updateProgress(previous, progress) )), ) return { get, update } - }) + })) } diff --git a/packages/extension-query/src/index.ts b/packages/extension-query/src/index.ts index 080c361..d30d000 100644 --- a/packages/extension-query/src/index.ts +++ b/packages/extension-query/src/index.ts @@ -1,9 +1,6 @@ export * as ErrorHandler from "./ErrorHandler.js" -export * as MutationRunner from "./MutationRunner.js" export * as MutationService from "./MutationService.js" export * as QueryClient from "./QueryClient.js" export * from "./QueryExtension.js" export * as QueryProgress from "./QueryProgress.js" -export * as QueryRunner from "./QueryRunner.js" export * as QueryService from "./QueryService.js" -export * as QueryState from "./QueryState.js" diff --git a/packages/extension-query/src/MutationRunner.ts b/packages/extension-query/src/internal/MutationRunner.ts similarity index 95% rename from packages/extension-query/src/MutationRunner.ts rename to packages/extension-query/src/internal/MutationRunner.ts index 0f5d06f..6a7bace 100644 --- a/packages/extension-query/src/MutationRunner.ts +++ b/packages/extension-query/src/internal/MutationRunner.ts @@ -1,7 +1,7 @@ import * as AsyncData from "@typed/async-data" import { type Context, Effect, type Fiber, Queue, Ref, Stream, SubscriptionRef } from "effect" -import type * as QueryClient from "./QueryClient.js" -import * as QueryProgress from "./QueryProgress.js" +import type * as QueryClient from "../QueryClient.js" +import * as QueryProgress from "../QueryProgress.js" import * as QueryState from "./QueryState.js" @@ -19,7 +19,7 @@ export interface MutationRunner { export interface MakeProps { readonly QueryClient: QueryClient.GenericTagClass - readonly mutation: (key: K) => Effect.Effect>> + readonly mutation: (key: K) => Effect.Effect } export const make = ( diff --git a/packages/extension-query/src/QueryRunner.ts b/packages/extension-query/src/internal/QueryRunner.ts similarity index 98% rename from packages/extension-query/src/QueryRunner.ts rename to packages/extension-query/src/internal/QueryRunner.ts index ca1f6ae..c0b18c9 100644 --- a/packages/extension-query/src/QueryRunner.ts +++ b/packages/extension-query/src/internal/QueryRunner.ts @@ -1,7 +1,7 @@ import { BrowserStream } from "@effect/platform-browser" import * as AsyncData from "@typed/async-data" import { type Cause, type Context, Effect, Fiber, identity, Option, Ref, type Scope, Stream, SubscriptionRef } from "effect" -import type * as QueryClient from "./QueryClient.js" +import type * as QueryClient from "../QueryClient.js" export interface QueryRunner { diff --git a/packages/extension-query/src/QueryState.ts b/packages/extension-query/src/internal/QueryState.ts similarity index 94% rename from packages/extension-query/src/QueryState.ts rename to packages/extension-query/src/internal/QueryState.ts index 3fd2951..97bf412 100644 --- a/packages/extension-query/src/QueryState.ts +++ b/packages/extension-query/src/internal/QueryState.ts @@ -1,4 +1,4 @@ -import * as AsyncData from "@typed/async-data" +import type * as AsyncData from "@typed/async-data" import { Context, Effect, Layer } from "effect" diff --git a/packages/extension-query/src/internal/index.ts b/packages/extension-query/src/internal/index.ts new file mode 100644 index 0000000..bf9fec6 --- /dev/null +++ b/packages/extension-query/src/internal/index.ts @@ -0,0 +1,6 @@ +/** @internal */ +export * as MutationRunner from "./MutationRunner.js" +/** @internal */ +export * as QueryRunner from "./QueryRunner.js" +/** @internal */ +export * as QueryState from "./QueryState.js"