import { useState } from "react"; import { Box, Text, useInput } from "ink"; export interface ConfirmDialogProps { title: string; message: string; items: string[]; showVisibilityToggle?: boolean; defaultVisibility?: "private" | "public"; onConfirm: (options: { visibility?: "private" | "public" }) => void; onCancel: () => void; } export function ConfirmDialog({ title, message, items, showVisibilityToggle = false, defaultVisibility = "private", onConfirm, onCancel, }: ConfirmDialogProps) { const [visibility, setVisibility] = useState<"private" | "public">( defaultVisibility ); useInput((input, key) => { if (input === "y" || input === "Y") { onConfirm({ visibility: showVisibilityToggle ? visibility : undefined }); } else if (input === "n" || input === "N" || key.escape) { onCancel(); } else if (showVisibilityToggle && (input === "v" || input === "V")) { setVisibility((prev) => (prev === "private" ? "public" : "private")); } }); const maxItems = 5; const displayItems = items.slice(0, maxItems); const remainingCount = items.length - maxItems; return ( {title} {message} {displayItems.map((item) => ( {" • "} {item} ))} {remainingCount > 0 && ( {" "}...and {remainingCount} more )} {showVisibilityToggle && ( Visibility: {visibility === "private" ? "[●] Private" : "[ ] Private"} {visibility === "public" ? "[●] Public" : "[ ] Public"} (v to toggle) )} Press y to confirm, n to cancel ); }