diff --git a/packages/extension-query/src/MutationRunner.ts b/packages/extension-query/src/MutationRunner.ts index 3f943c5..323c344 100644 --- a/packages/extension-query/src/MutationRunner.ts +++ b/packages/extension-query/src/MutationRunner.ts @@ -1,12 +1,14 @@ import * as AsyncData from "@typed/async-data" -import { type Context, Effect, Ref, SubscriptionRef } from "effect" +import { type Context, Effect, type Fiber, Ref, SubscriptionRef } from "effect" import type * as QueryClient from "./QueryClient.js" export interface MutationRunner { readonly context: Context.Context readonly stateRef: SubscriptionRef.SubscriptionRef> + readonly mutate: (...key: K) => Effect.Effect + readonly forkMutate: (...key: K) => Effect.Effect> } @@ -40,9 +42,13 @@ export const make = ( Effect.provide(context), ) + const forkMutate = (...key: K) => Effect.forkDaemon(mutate(...key)) + return { context, stateRef, + mutate, + forkMutate, } }) diff --git a/packages/extension-query/src/MutationService.ts b/packages/extension-query/src/MutationService.ts new file mode 100644 index 0000000..e366571 --- /dev/null +++ b/packages/extension-query/src/MutationService.ts @@ -0,0 +1,13 @@ +import type * as AsyncData from "@typed/async-data" +import { Effect, type Fiber, type SubscriptionRef } from "effect" + + +export interface MutationService { + readonly state: SubscriptionRef.SubscriptionRef> + readonly mutate: (...key: K) => Effect.Effect + readonly forkMutate: (...key: K) => Effect.Effect> +} + +export const Tag = (id: Id) => < + Self, K extends readonly unknown[], A, E = never, +>() => Effect.Tag(id)>() diff --git a/packages/extension-query/src/QueryExtension.ts b/packages/extension-query/src/QueryExtension.ts index 4deeebb..0fa0b87 100644 --- a/packages/extension-query/src/QueryExtension.ts +++ b/packages/extension-query/src/QueryExtension.ts @@ -3,6 +3,7 @@ import { type Cause, type Context, Effect, type Fiber, Layer, type Option, type 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 * as QueryRunner from "./QueryRunner.js" import type * as QueryService from "./QueryService.js" @@ -31,10 +32,12 @@ export interface UseMutationProps { export interface UseMutationResult { readonly state: SubscriptionRef.SubscriptionRef> + readonly mutate: (...key: K) => Effect.Effect + readonly forkMutate: (...key: K) => Effect.Effect> - // readonly layer: ( - // tag: Context.TagClass> - // ) => Layer.Layer + readonly layer: ( + tag: Context.TagClass> + ) => Layer.Layer } @@ -96,12 +99,14 @@ export const QueryExtension = ReffuseExtension.make(() => ({ return React.useMemo(() => ({ state: runner.stateRef, + mutate: runner.mutate, + forkMutate: runner.forkMutate, - // layer: tag => Layer.succeed(tag, { - // latestKey: runner.latestKeyRef, - // state: runner.stateRef, - // refresh: runner.forkRefresh, - // }), + layer: tag => Layer.succeed(tag, { + state: runner.stateRef, + mutate: runner.mutate, + forkMutate: runner.forkMutate, + }), }), [runner]) }, })) diff --git a/packages/extension-query/src/index.ts b/packages/extension-query/src/index.ts index 6f603b6..e249d09 100644 --- a/packages/extension-query/src/index.ts +++ b/packages/extension-query/src/index.ts @@ -1,5 +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 QueryRunner from "./QueryRunner.js"