import type { CompletionContext, CompletionResult } from "../deps.ts"; import { useRef, useState } from "../deps.ts"; import { MiniEditor } from "./mini_editor.tsx"; export function Prompt({ message, defaultValue, vimMode, darkMode, completer, callback, }: { message: string; defaultValue?: string; vimMode: boolean; darkMode: boolean; completer: (context: CompletionContext) => Promise<CompletionResult | null>; callback: (value?: string) => void; }) { const [text, setText] = useState(defaultValue || ""); const returnEl = ( <div className="sb-modal-wrapper"> <div className="sb-modal-box"> <div className="sb-prompt"> <label>{message}</label> <MiniEditor text={defaultValue || ""} vimMode={vimMode} vimStartInInsertMode={true} focus={true} darkMode={darkMode} completer={completer} onEnter={(text) => { callback(text); return true; }} onEscape={() => { callback(); }} onChange={(text) => { setText(text); }} /> <button onClick={() => { callback(text); }} > Ok </button> <button onClick={() => { callback(); }} > Cancel </button> </div> </div> </div> ); return returnEl; } export function Confirm({ message, callback, }: { message: string; callback: (value: boolean) => void; }) { const okButtonRef = useRef<HTMLButtonElement>(null); setTimeout(() => { okButtonRef.current?.focus(); }); const returnEl = ( <div className="sb-modal-wrapper"> <div className="sb-modal-box"> <div className="sb-prompt" onKeyDown={(e) => { e.stopPropagation(); e.preventDefault(); switch (e.key) { case "Enter": callback(true); break; case "Escape": callback(false); break; } }} > <label>{message}</label> <div> <button ref={okButtonRef} onClick={(e) => { e.stopPropagation(); e.preventDefault(); callback(true); }} > Ok </button> <button onClick={(e) => { e.stopPropagation(); e.preventDefault(); callback(false); }} > Cancel </button> </div> </div> </div> </div> ); return returnEl; }