UNPKG

pyb-ts

Version:

PYB-CLI - Minimal AI Agent with multi-model support and CLI interface

101 lines (100 loc) 2.87 kB
import React from "react"; import { Text, useInput } from "ink"; import chalk from "chalk"; import { useTextInput } from "@hooks/useTextInput"; import { getTheme } from "@utils/theme"; function TextInput({ value: originalValue, placeholder = "", focus = true, mask, multiline = false, highlightPastedText = false, showCursor = true, onChange, onSubmit, onExit, onHistoryUp, onHistoryDown, onExitMessage, onMessage, onHistoryReset, columns, onImagePaste, onPaste, isDimmed = false, disableCursorMovementForUpDownKeys = false, onSpecialKey, cursorOffset, onChangeCursorOffset }) { const { onInput, renderedValue } = useTextInput({ value: originalValue, onChange, onSubmit, onExit, onExitMessage, onMessage, onHistoryReset, onHistoryUp, onHistoryDown, focus, mask, multiline, cursorChar: showCursor ? " " : "", highlightPastedText, invert: chalk.inverse, themeText: (text) => chalk.hex(getTheme().text)(text), columns, onImagePaste, disableCursorMovementForUpDownKeys, externalOffset: cursorOffset, onOffsetChange: onChangeCursorOffset }); const [pasteState, setPasteState] = React.useState({ chunks: [], timeoutId: null }); const resetPasteTimeout = (currentTimeoutId) => { if (currentTimeoutId) { clearTimeout(currentTimeoutId); } return setTimeout(() => { setPasteState(({ chunks }) => { const pastedText = chunks.join(""); Promise.resolve().then(() => onPaste(pastedText)); return { chunks: [], timeoutId: null }; }); }, 100); }; const wrappedOnInput = (input, key) => { if (onSpecialKey && onSpecialKey(input, key)) { return; } if (key.backspace || key.delete || input === "\b" || input === "\x7F" || input === "\b") { onInput(input, { ...key, backspace: true }); return; } if (onPaste && (input.length > 800 || pasteState.timeoutId)) { setPasteState(({ chunks, timeoutId }) => { return { chunks: [...chunks, input], timeoutId: resetPasteTimeout(timeoutId) }; }); return; } onInput(input, key); }; useInput(wrappedOnInput, { isActive: focus }); let renderedPlaceholder = placeholder ? chalk.hex(getTheme().secondaryText)(placeholder) : void 0; if (showCursor && focus) { renderedPlaceholder = placeholder.length > 0 ? chalk.inverse(placeholder[0]) + chalk.hex(getTheme().secondaryText)(placeholder.slice(1)) : chalk.inverse(" "); } const showPlaceholder = originalValue.length == 0 && placeholder; return /* @__PURE__ */ React.createElement(Text, { wrap: "truncate-end", dimColor: isDimmed }, showPlaceholder ? renderedPlaceholder : renderedValue); } export { TextInput as default }; //# sourceMappingURL=TextInput.js.map