/** * ErrorDialog component for TUI. * Displays an error with [R] Retry / [S] Skip / [A] Abort options. */ import { Box, Text, useInput } from "ink" import React, { useState } from "react" import type { ErrorOption } from "../../shared/errors/IpuaroError.js" export interface ErrorInfo { type: string message: string recoverable: boolean } export interface ErrorDialogProps { error: ErrorInfo onChoice: (choice: ErrorOption) => void } function ChoiceButton({ hotkey, label, isSelected, disabled, }: { hotkey: string label: string isSelected: boolean disabled?: boolean }): React.JSX.Element { if (disabled) { return ( [{hotkey}] {label} ) } return ( [{hotkey}] {label} ) } export function ErrorDialog({ error, onChoice }: ErrorDialogProps): React.JSX.Element { const [selected, setSelected] = useState(null) useInput((input, key) => { const lowerInput = input.toLowerCase() if (lowerInput === "r" && error.recoverable) { setSelected("retry") onChoice("retry") } else if (lowerInput === "s" && error.recoverable) { setSelected("skip") onChoice("skip") } else if (lowerInput === "a") { setSelected("abort") onChoice("abort") } else if (key.escape) { setSelected("abort") onChoice("abort") } }) return ( x {error.type}: {error.message} {!error.recoverable && ( This error is not recoverable. Press [A] to abort. )} ) }