import { forwardRef } from "react"; import { ExclamationTriangleIcon, InformationCircleIcon, } from "@heroicons/react/24/solid"; import { getErrorDetails } from "../utils/errorCodeHelpers"; interface ErrorPopoverProps { machineError?: number; isPairingError: boolean; errorMessage?: string | null; pyodideError?: string | null; } export const ErrorPopover = forwardRef( ({ machineError, isPairingError, errorMessage, pyodideError }, ref) => { const errorDetails = getErrorDetails(machineError); const isPairingErr = isPairingError; const errorMsg = pyodideError || errorMessage || ""; const isInfo = isPairingErr || errorDetails?.isInformational; const bgColor = isInfo ? "bg-info-50 dark:bg-info-900/95 border-info-600 dark:border-info-500" : "bg-danger-50 dark:bg-danger-900/95 border-danger-600 dark:border-danger-500"; const iconColor = isInfo ? "text-info-600 dark:text-info-400" : "text-danger-600 dark:text-danger-400"; const textColor = isInfo ? "text-info-900 dark:text-info-200" : "text-danger-900 dark:text-danger-200"; const descColor = isInfo ? "text-info-800 dark:text-info-300" : "text-danger-800 dark:text-danger-300"; const listColor = isInfo ? "text-info-700 dark:text-info-300" : "text-danger-700 dark:text-danger-300"; const Icon = isInfo ? InformationCircleIcon : ExclamationTriangleIcon; const title = errorDetails?.title || (isPairingErr ? "Pairing Required" : "Error"); return (

{title}

{errorDetails?.description || errorMsg}

{errorDetails?.solutions && errorDetails.solutions.length > 0 && ( <>

{isInfo ? "Steps:" : "How to Fix:"}

    {errorDetails.solutions.map((solution, index) => (
  1. {solution}
  2. ))}
)} {machineError !== undefined && !errorDetails?.isInformational && (

Error Code: 0x {machineError.toString(16).toUpperCase().padStart(2, "0")}

)}
); }, ); ErrorPopover.displayName = "ErrorPopover";