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: () => <>, }) }