From c943d81702aa2f5dda2bf75c8eabc0a026192f62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 15 Mar 2025 22:27:15 +0100 Subject: [PATCH] QueryClient.make --- packages/example/src/QueryErrorHandler.tsx | 13 ++---- packages/example/src/main.tsx | 7 ++- packages/example/src/query.ts | 10 +++++ packages/example/src/reffuse.ts | 11 ++--- packages/extension-query/src/QueryClient.ts | 48 ++++++++++++--------- 5 files changed, 50 insertions(+), 39 deletions(-) create mode 100644 packages/example/src/query.ts diff --git a/packages/example/src/QueryErrorHandler.tsx b/packages/example/src/QueryErrorHandler.tsx index 88dc98f..2e9dcaa 100644 --- a/packages/example/src/QueryErrorHandler.tsx +++ b/packages/example/src/QueryErrorHandler.tsx @@ -1,24 +1,17 @@ -import { HttpClientError } from "@effect/platform" import { AlertDialog, Button, Flex, Text } from "@radix-ui/themes" import { ErrorHandler } from "@reffuse/extension-query" import { Cause, Chunk, Context, Effect, Match, Option, Stream } from "effect" import { useState } from "react" +import { AppQueryErrorHandler } from "./query" import { R } from "./reffuse" -export class QueryErrorHandler extends ErrorHandler.Tag("QueryErrorHandler")() {} - -export const QueryErrorHandlerLive = ErrorHandler.layer(QueryErrorHandler) - - export function VQueryErrorHandler() { const [failure, setFailure] = useState(Option.none> + ErrorHandler.Error> >>()) - R.useFork(() => QueryErrorHandler.pipe(Effect.flatMap(handler => + R.useFork(() => AppQueryErrorHandler.pipe(Effect.flatMap(handler => Stream.runForEach(handler.errors, v => Effect.sync(() => setFailure(Option.some(v)) )) diff --git a/packages/example/src/main.tsx b/packages/example/src/main.tsx index a544300..2800e09 100644 --- a/packages/example/src/main.tsx +++ b/packages/example/src/main.tsx @@ -1,12 +1,11 @@ import { FetchHttpClient } from "@effect/platform" import { Clipboard, Geolocation, Permissions } from "@effect/platform-browser" -import { QueryClient } from "@reffuse/extension-query" import { createRouter, RouterProvider } from "@tanstack/react-router" import { Layer } from "effect" import { StrictMode } from "react" import { createRoot } from "react-dom/client" import { ReffuseRuntime } from "reffuse" -import { QueryErrorHandler, QueryErrorHandlerLive } from "./QueryErrorHandler" +import { AppQueryClientLive, AppQueryErrorHandlerLive } from "./query" import { GlobalContext } from "./reffuse" import { routeTree } from "./routeTree.gen" @@ -16,8 +15,8 @@ const layer = Layer.empty.pipe( Layer.provideMerge(Geolocation.layer), Layer.provideMerge(Permissions.layer), Layer.provideMerge(FetchHttpClient.layer), - Layer.provideMerge(QueryClient.layer({ ErrorHandler: QueryErrorHandler })), - Layer.provideMerge(QueryErrorHandlerLive), + Layer.provideMerge(AppQueryClientLive), + Layer.provideMerge(AppQueryErrorHandlerLive), ) const router = createRouter({ routeTree }) diff --git a/packages/example/src/query.ts b/packages/example/src/query.ts new file mode 100644 index 0000000..c51a83c --- /dev/null +++ b/packages/example/src/query.ts @@ -0,0 +1,10 @@ +import { HttpClientError } from "@effect/platform" +import { ErrorHandler, QueryClient } from "@reffuse/extension-query" + + +export class AppQueryErrorHandler extends ErrorHandler.Tag("AppQueryErrorHandler")() {} +export const AppQueryErrorHandlerLive = ErrorHandler.layer(AppQueryErrorHandler) + +export const [AppQueryClient, AppQueryClientLive] = QueryClient.make({ ErrorHandler: AppQueryErrorHandler }) diff --git a/packages/example/src/reffuse.ts b/packages/example/src/reffuse.ts index 21e178c..41facb2 100644 --- a/packages/example/src/reffuse.ts +++ b/packages/example/src/reffuse.ts @@ -1,9 +1,10 @@ -import { HttpClient, HttpClientError } from "@effect/platform" +import { HttpClient } from "@effect/platform" import { Clipboard, Geolocation, Permissions } from "@effect/platform-browser" import { LazyRefExtension } from "@reffuse/extension-lazyref" -import { QueryClient, QueryExtension } from "@reffuse/extension-query" +import { QueryExtension } from "@reffuse/extension-query" +import { Context } from "effect" import { Reffuse, ReffuseContext } from "reffuse" -import { QueryErrorHandler } from "./QueryErrorHandler" +import { AppQueryClient, AppQueryErrorHandler } from "./query" export const GlobalContext = ReffuseContext.make< @@ -11,8 +12,8 @@ export const GlobalContext = ReffuseContext.make< | Geolocation.Geolocation | Permissions.Permissions | HttpClient.HttpClient - | QueryClient.QueryClient - | QueryErrorHandler + | Context.Tag.Service + | AppQueryErrorHandler >() export class GlobalReffuse extends Reffuse.Reffuse.pipe( diff --git a/packages/extension-query/src/QueryClient.ts b/packages/extension-query/src/QueryClient.ts index c2f90d0..7ca9d24 100644 --- a/packages/extension-query/src/QueryClient.ts +++ b/packages/extension-query/src/QueryClient.ts @@ -6,34 +6,42 @@ export interface QueryClient { readonly ErrorHandler: Context.Tag> } - export type Tag = Context.Tag, QueryClient> export const makeTag = (): Tag => Context.GenericTag("@reffuse/extension-query/QueryClient") -export interface LayerProps { +export interface MakeProps { readonly ErrorHandler?: Context.Tag> } -export const layer = < +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?: LayerProps -): Layer.Layer< - | QueryClient - | (EH extends ErrorHandler.DefaultErrorHandler - ? ErrorHandler.DefaultErrorHandler - : never) -> => Layer.empty.pipe( - Layer.provideMerge( - Layer.effect(makeTag(), Effect.succeed({ - ErrorHandler: (props?.ErrorHandler ?? ErrorHandler.DefaultErrorHandler) as Context.Tag> - })) - ), + props?: MakeProps +): MakeResult => [ + makeTag(), - Layer.provideMerge((props?.ErrorHandler - ? Layer.empty - : ErrorHandler.DefaultErrorHandlerLive - ) as Layer.Layer), -) + 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), + ), +]