From 0437fa5dccbd6e49acc2db6559e2fa0a2bcfd8a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 15 Mar 2025 02:30:37 +0100 Subject: [PATCH] QueryErrorHandler work --- packages/example/src/QueryErrorHandler.tsx | 26 +++++++++++++++++++ packages/example/src/main.tsx | 4 ++- .../example/src/query/services/Uuid4Query.ts | 3 +-- packages/example/src/reffuse.ts | 9 ++++--- 4 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 packages/example/src/QueryErrorHandler.tsx diff --git a/packages/example/src/QueryErrorHandler.tsx b/packages/example/src/QueryErrorHandler.tsx new file mode 100644 index 0000000..003324e --- /dev/null +++ b/packages/example/src/QueryErrorHandler.tsx @@ -0,0 +1,26 @@ +import { HttpClientError } from "@effect/platform" +import { ErrorHandler } from "@reffuse/extension-query" +import { Cause, Chunk, Effect, flow, Match, Stream } from "effect" +import { R } from "./reffuse" + + +export class QueryErrorHandler extends ErrorHandler.Tag("QueryErrorHandler")() {} + +export const QueryErrorHandlerLive = ErrorHandler.layer(QueryErrorHandler) + + +export function VQueryErrorHandler() { + R.useFork(() => QueryErrorHandler.pipe(Effect.flatMap(handler => + Stream.runForEach(handler.errors, flow( + Cause.failures, + Chunk.map(flow(Match.value, + Match.tag("RequestError", () => Effect.sync(() => {})), + Match.tag("ResponseError", () => Effect.sync(() => {})), + Match.exhaustive, + )), + Effect.all, + )) + )), []) +} diff --git a/packages/example/src/main.tsx b/packages/example/src/main.tsx index 89b9eb4..a544300 100644 --- a/packages/example/src/main.tsx +++ b/packages/example/src/main.tsx @@ -6,6 +6,7 @@ import { Layer } from "effect" import { StrictMode } from "react" import { createRoot } from "react-dom/client" import { ReffuseRuntime } from "reffuse" +import { QueryErrorHandler, QueryErrorHandlerLive } from "./QueryErrorHandler" import { GlobalContext } from "./reffuse" import { routeTree } from "./routeTree.gen" @@ -15,7 +16,8 @@ const layer = Layer.empty.pipe( Layer.provideMerge(Geolocation.layer), Layer.provideMerge(Permissions.layer), Layer.provideMerge(FetchHttpClient.layer), - Layer.provideMerge(QueryClient.layer()), + Layer.provideMerge(QueryClient.layer({ ErrorHandler: QueryErrorHandler })), + Layer.provideMerge(QueryErrorHandlerLive), ) const router = createRouter({ routeTree }) diff --git a/packages/example/src/query/services/Uuid4Query.ts b/packages/example/src/query/services/Uuid4Query.ts index a7336bd..30b1545 100644 --- a/packages/example/src/query/services/Uuid4Query.ts +++ b/packages/example/src/query/services/Uuid4Query.ts @@ -1,4 +1,3 @@ -import { HttpClientError } from "@effect/platform" import { QueryService } from "@reffuse/extension-query" import { ParseResult, Schema } from "effect" @@ -8,5 +7,5 @@ export const Result = Schema.Array(Schema.String) export class Uuid4Query extends QueryService.Tag("Uuid4Query")() {} diff --git a/packages/example/src/reffuse.ts b/packages/example/src/reffuse.ts index e0b405e..21e178c 100644 --- a/packages/example/src/reffuse.ts +++ b/packages/example/src/reffuse.ts @@ -1,8 +1,9 @@ -import { HttpClient } from "@effect/platform" +import { HttpClient, HttpClientError } from "@effect/platform" import { Clipboard, Geolocation, Permissions } from "@effect/platform-browser" import { LazyRefExtension } from "@reffuse/extension-lazyref" -import { ErrorHandler, QueryClient, QueryExtension } from "@reffuse/extension-query" +import { QueryClient, QueryExtension } from "@reffuse/extension-query" import { Reffuse, ReffuseContext } from "reffuse" +import { QueryErrorHandler } from "./QueryErrorHandler" export const GlobalContext = ReffuseContext.make< @@ -10,8 +11,8 @@ export const GlobalContext = ReffuseContext.make< | Geolocation.Geolocation | Permissions.Permissions | HttpClient.HttpClient - | QueryClient.QueryClient - | ErrorHandler.DefaultErrorHandler + | QueryClient.QueryClient + | QueryErrorHandler >() export class GlobalReffuse extends Reffuse.Reffuse.pipe(