pyb-ts
Version:
PYB-CLI - Minimal AI Agent with multi-model support and CLI interface
101 lines (100 loc) • 2.87 kB
JavaScript
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