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, }), ), })} ) }