diff --git a/packages/example/src/main.tsx b/packages/example/src/main.tsx index 2800e09..0f73461 100644 --- a/packages/example/src/main.tsx +++ b/packages/example/src/main.tsx @@ -5,7 +5,7 @@ import { Layer } from "effect" import { StrictMode } from "react" import { createRoot } from "react-dom/client" import { ReffuseRuntime } from "reffuse" -import { AppQueryClientLive, AppQueryErrorHandlerLive } from "./query" +import { AppQueryClient, AppQueryErrorHandlerLive } from "./query" import { GlobalContext } from "./reffuse" import { routeTree } from "./routeTree.gen" @@ -15,7 +15,7 @@ const layer = Layer.empty.pipe( Layer.provideMerge(Geolocation.layer), Layer.provideMerge(Permissions.layer), Layer.provideMerge(FetchHttpClient.layer), - Layer.provideMerge(AppQueryClientLive), + Layer.provideMerge(AppQueryClient.Live), Layer.provideMerge(AppQueryErrorHandlerLive), ) diff --git a/packages/example/src/query.ts b/packages/example/src/query.ts index c51a83c..db47f2b 100644 --- a/packages/example/src/query.ts +++ b/packages/example/src/query.ts @@ -7,4 +7,5 @@ export class AppQueryErrorHandler extends ErrorHandler.Tag("AppQueryErrorHandler >() {} export const AppQueryErrorHandlerLive = ErrorHandler.layer(AppQueryErrorHandler) -export const [AppQueryClient, AppQueryClientLive] = QueryClient.make({ ErrorHandler: AppQueryErrorHandler }) + +export class AppQueryClient extends QueryClient.Service({ ErrorHandler: AppQueryErrorHandler })() {} diff --git a/packages/example/src/reffuse.ts b/packages/example/src/reffuse.ts index 41facb2..f23c07e 100644 --- a/packages/example/src/reffuse.ts +++ b/packages/example/src/reffuse.ts @@ -2,7 +2,6 @@ import { HttpClient } from "@effect/platform" import { Clipboard, Geolocation, Permissions } from "@effect/platform-browser" import { LazyRefExtension } from "@reffuse/extension-lazyref" import { QueryExtension } from "@reffuse/extension-query" -import { Context } from "effect" import { Reffuse, ReffuseContext } from "reffuse" import { AppQueryClient, AppQueryErrorHandler } from "./query" @@ -12,7 +11,7 @@ export const GlobalContext = ReffuseContext.make< | Geolocation.Geolocation | Permissions.Permissions | HttpClient.HttpClient - | Context.Tag.Service + | AppQueryClient | AppQueryErrorHandler >() diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts index 1f19be5..bc49195 100644 --- a/packages/extension-query/src/QueryClient.ts +++ b/packages/extension-query/src/QueryClient.ts @@ -1,4 +1,5 @@ import { Context, Effect, Layer } from "effect" +import type { Mutable } from "effect/Types" import * as ErrorHandler from "./ErrorHandler.js" @@ -18,71 +19,35 @@ export interface ServiceProps { readonly ErrorHandler?: Context.Tag> } -export const Service: < +export interface ServiceResult extends Context.TagClass> { + readonly Live: Layer.Layer< + | Self + | (EH extends ErrorHandler.DefaultErrorHandler + ? ErrorHandler.DefaultErrorHandler + : never) + > +} + +export const Service = < EH = ErrorHandler.DefaultErrorHandler, HandledE = never, >( props?: ServiceProps -) => - () => - & Context.TagClass> - & { readonly Live: Layer.Layer< - | QueryClient - | (EH extends ErrorHandler.DefaultErrorHandler - ? ErrorHandler.DefaultErrorHandler - : never) - > } -= props => () => { - const TagClass = Context.Tag(Id)() as any - TagClass.Live = Layer.empty.pipe( - Layer.provideMerge( - Layer.effect(TagClass, Effect.succeed({ - ErrorHandler: props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler - })) - ), +) => ( + (): ServiceResult => { + const TagClass = Context.Tag(Id)() as ServiceResult + (TagClass as Mutable).Live = Layer.empty.pipe( + Layer.provideMerge( + Layer.effect(TagClass, Effect.succeed({ + ErrorHandler: (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag> + })) + ), - Layer.provideMerge((props?.ErrorHandler - ? Layer.empty - : ErrorHandler.DefaultErrorHandlerLive - ), - )) - - return TagClass -} - - -// export interface MakeProps { -// readonly ErrorHandler?: Context.Tag> -// } - -// export type MakeResult = [ -// tag: Tag, -// layer: Layer.Layer< -// | QueryClient -// | (EH extends ErrorHandler.DefaultErrorHandler -// ? ErrorHandler.DefaultErrorHandler -// : never) -// >, -// ] - -// export const make = < -// EH = ErrorHandler.DefaultErrorHandler, -// HandledE = never, -// >( -// props?: MakeProps -// ): MakeResult => [ -// makeTag(), - -// Layer.empty.pipe( -// Layer.provideMerge( -// Layer.effect(makeTag(), Effect.succeed({ -// ErrorHandler: (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag> -// })) -// ), - -// Layer.provideMerge((props?.ErrorHandler -// ? Layer.empty -// : ErrorHandler.DefaultErrorHandlerLive -// ) as Layer.Layer), -// ), -// ] + Layer.provideMerge((props?.ErrorHandler + ? Layer.empty + : ErrorHandler.DefaultErrorHandlerLive + ) as Layer.Layer), + ) + return TagClass + } +)