@teqed/interact-ibmi
Version:
Menus for interacting with IBMi AS400 using node-odbc.
60 lines (59 loc) • 2.15 kB
JavaScript
/* eslint-disable unicorn/no-useless-undefined */
import { createPrompt, useState, useKeypress,
// usePrefix,
isEnterKey, isBackspaceKey, } from '@inquirer/core';
import chalk from 'chalk';
export default createPrompt((config, done) => {
const [status, setStatus] = useState(`pending`);
const [defaultValue, setDefaultValue] = useState(config.default);
const [errorMessage, setError] = useState(undefined);
const [value, setValue] = useState(``);
// const isLoading = status === `loading`;
// const prefix = usePrefix(isLoading);
useKeypress(async (key, rl) => {
// Ignore keypress while our prompt is doing other processing.
if (status !== `pending`) {
return;
}
if (isEnterKey(key)) {
const answer = (value || defaultValue) ?? ``;
setStatus(`loading`);
const isValid = await config.validate(answer);
if (isValid === true) {
setValue(answer);
setStatus(`done`);
done(answer);
}
else {
setValue(``);
setError(isValid || `You must provide a valid value`);
setStatus(`pending`);
}
}
else if (isBackspaceKey(key) && !value) {
setDefaultValue(undefined);
}
else {
setValue(rl.line);
setError(undefined);
}
});
const message = chalk.bold(config.message);
let formattedValue = value;
if (typeof config.transformer === `function`) {
formattedValue = config.transformer(value, { isFinal: status === `done` });
}
if (status === `done`) {
formattedValue = chalk.cyan(formattedValue);
}
let defaultString = ``;
if (defaultValue && status !== `done` && !value) {
defaultString = chalk.dim(` (${defaultValue})`);
}
let error = ``;
if (errorMessage) {
error = chalk.red(`> ${errorMessage}`);
}
// return [`${prefix} ${message}${defaultString} ${formattedValue}`, error];
return [`${message}${defaultString} ${formattedValue}`, error];
});