From f594f4779382210e1b3b0574d42b66ff7408ab6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 13 Apr 2025 17:39:54 +0200 Subject: [PATCH] VQueryErrorHandler --- packages/example/src/QueryErrorHandler.tsx | 57 --------------------- packages/example/src/VQueryErrorHandler.tsx | 57 +++++++++++++++++++++ packages/example/src/routes/__root.tsx | 2 +- 3 files changed, 58 insertions(+), 58 deletions(-) delete mode 100644 packages/example/src/QueryErrorHandler.tsx create mode 100644 packages/example/src/VQueryErrorHandler.tsx diff --git a/packages/example/src/QueryErrorHandler.tsx b/packages/example/src/QueryErrorHandler.tsx deleted file mode 100644 index 5a072ee..0000000 --- a/packages/example/src/QueryErrorHandler.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { AlertDialog, Button, Flex, Text } from "@radix-ui/themes" -import { QueryErrorHandler } from "@reffuse/extension-query" -import { Cause, Console, Context, Effect, Either, flow, Match, Option, Stream } from "effect" -import { useState } from "react" -import { AppQueryErrorHandler } from "./query" -import { R } from "./reffuse" - - -export function VQueryErrorHandler() { - const [failure, setFailure] = useState(Option.none> - >>()) - - R.useFork(() => AppQueryErrorHandler.pipe(Effect.flatMap(handler => - Stream.runForEach(handler.errors, v => Console.error(v).pipe( - Effect.andThen(Effect.sync(() => { setFailure(Option.some(v)) })) - )) - )), []) - - return Option.match(failure, { - onSome: v => ( - - - Error - - {Either.match(Cause.failureOrCause(v), { - onLeft: flow( - Match.value, - Match.tag("RequestError", () => HTTP request error), - Match.tag("ResponseError", () => HTTP response error), - Match.exhaustive, - ), - - onRight: flow( - Cause.dieOption, - Option.match({ - onSome: () => Unrecoverable defect, - onNone: () => Unknown error, - }), - ), - })} - - - - - - - - - - ), - - onNone: () => <>, - }) -} diff --git a/packages/example/src/VQueryErrorHandler.tsx b/packages/example/src/VQueryErrorHandler.tsx new file mode 100644 index 0000000..0b9fa57 --- /dev/null +++ b/packages/example/src/VQueryErrorHandler.tsx @@ -0,0 +1,57 @@ +import { AlertDialog, Button, Flex, Text } from "@radix-ui/themes" +import { Cause, Console, Effect, Either, flow, Match, Option, Stream } from "effect" +import { useState } from "react" +import { AppQueryErrorHandler } from "./query" +import { R } from "./reffuse" + + +export function VQueryErrorHandler() { + const [open, setOpen] = useState(false) + + const error = R.useSubscribeStream( + R.useMemo(() => AppQueryErrorHandler.pipe( + Effect.map(handler => handler.errors.pipe( + Stream.changes, + Stream.tap(Console.error), + Stream.tap(() => Effect.sync(() => setOpen(true))), + )) + ), []) + ) + + if (Option.isNone(error)) + return <> + + return ( + + + Error + + {Either.match(Cause.failureOrCause(error.value), { + onLeft: flow( + Match.value, + Match.tag("RequestError", () => HTTP request error), + Match.tag("ResponseError", () => HTTP response error), + Match.exhaustive, + ), + + onRight: flow( + Cause.dieOption, + Option.match({ + onSome: () => Unrecoverable defect, + onNone: () => Unknown error, + }), + ), + })} + + + + + + + + + + ) +} diff --git a/packages/example/src/routes/__root.tsx b/packages/example/src/routes/__root.tsx index d5180aa..12abc9b 100644 --- a/packages/example/src/routes/__root.tsx +++ b/packages/example/src/routes/__root.tsx @@ -1,4 +1,4 @@ -import { VQueryErrorHandler } from "@/QueryErrorHandler" +import { VQueryErrorHandler } from "@/VQueryErrorHandler" import { Container, Flex, Theme } from "@radix-ui/themes" import { createRootRoute, Link, Outlet } from "@tanstack/react-router" import { TanStackRouterDevtools } from "@tanstack/react-router-devtools"