123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- const readline = require("readline");
- const menu = (choices, label) => {
- let selectedIndex = 0;
- const clearMenu = () => {
- readline.moveCursor(process.stdout, 0, -choices.length);
- readline.clearScreenDown(process.stdout);
- };
- const renderMenu = () => {
- choices.forEach((choice, index) => {
- if (index === selectedIndex) {
- console.log(`> ${choice}`);
- } else {
- console.log(` ${choice}`);
- }
- });
- };
- // Refactored to use a direction parameter for cleaner code
- function updateSelectedIndex(direction) {
- if (direction === "up") {
- selectedIndex = (selectedIndex - 1 + choices.length) % choices.length;
- } else if (direction === "down") {
- selectedIndex = (selectedIndex + 1) % choices.length;
- }
- clearMenu();
- renderMenu();
- }
- const handleKeyPress = (resolve) => (str, key) => {
- if (key.name === "up" || key.name === "down") {
- updateSelectedIndex(key.name);
- } else if (key.name === "return") {
- rl.close();
- resolve(choices[selectedIndex]);
- }
- };
- const rl = readline.createInterface({
- input: process.stdin,
- output: process.stdout,
- terminal: true,
- });
- return new Promise((resolve, reject) => {
- console.log(label);
- readline.emitKeypressEvents(process.stdin);
- if (process.stdin.isTTY) process.stdin.setRawMode(true);
- renderMenu();
- rl.input.on("keypress", handleKeyPress(resolve));
- });
- };
- exports.menu = menu;
|