import { useMemo } from "react";
import { IconExclamationCircle } from "@tabler/icons-react";
import { TRPCClientError } from "@trpc/client";
import type { DefaultErrorData } from "@trpc/server/unstable-core-do-not-import";
import type { WidgetKind } from "@homarr/definitions";
import type { WidgetDefinition } from "..";
import { widgetImports } from "..";
import { ErrorBoundaryError } from "./base";
import { BaseWidgetError } from "./base-component";
interface WidgetErrorProps {
kind: WidgetKind;
error: unknown;
resetErrorBoundary: () => void;
}
export const WidgetError = ({ error, resetErrorBoundary, kind }: WidgetErrorProps) => {
const currentDefinition = useMemo(() => widgetImports[kind].definition, [kind]);
if (error instanceof ErrorBoundaryError) {
return ;
}
const commonFallbackError = (
string }).toString()}
onRetry={resetErrorBoundary}
/>
);
if (error instanceof TRPCClientError && "code" in error.data) {
const errorData = error.data as DefaultErrorData;
if (!("errors" in currentDefinition)) return commonFallbackError;
const errors: Exclude = currentDefinition.errors;
const errorDefinition = errors[errorData.code];
if (!errorDefinition) return commonFallbackError;
return (
);
}
return commonFallbackError;
};