fomoapp
Version:
Get the latest tech news right into your CLI
163 lines (147 loc) • 3.7 kB
JavaScript
const prompts = require("prompts")
const isValidPath = require("is-valid-path")
const sources = require("../sources")
const MAIN_OPTIONS = [
{
description: "The number of items that will be displayed for each source",
title: "Change the default number of items",
value: "defaultItemsCount"
},
{
title: "Change the default sources",
description: "The sources that would be displayed by default",
value: "defaultSources"
},
{
title: "Configure external rss feeds directory",
description:
"The path to the directory containing the external RSS config files",
value: "setExternalDir"
},
{
title: "Reset configuration",
description: "Reset configuration to the default values",
value: "resetConfig"
},
{
title: "Exit",
value: "exit"
}
]
async function showInteractiveConfig(config) {
let shouldExit = false
do {
const response = await prompts(
{
type: "select",
name: "value",
message: "What would you like to do?",
choices: MAIN_OPTIONS,
initial: 0
},
{ onCancel: () => (shouldExit = true) }
)
switch (response.value) {
case "defaultItemsCount": {
await handleItemsCountConfig(config)
break
}
case "defaultSources": {
await handleDefaultSourcesConfig(config)
break
}
case "setExternalDir": {
await handleSetExternalDir(config)
shouldExit = true
break
}
case "resetConfig": {
await handleResetConfig(config)
shouldExit = true
break
}
case "exit": {
shouldExit = true
break
}
default:
break
}
} while (!shouldExit)
}
async function handleItemsCountConfig(config) {
let isCanceled = false
const response = await prompts(
{
type: "number",
name: "value",
message: "How many items would you like to see for each source?",
initial: config.get("defaultItemsCount"),
min: 1,
max: 50
},
{ onCancel: () => (isCanceled = true) }
)
if (!isCanceled) {
config.set("defaultItemsCount", response.value)
}
}
async function handleDefaultSourcesConfig(config) {
const selectedSources = config.get("defaultSources") || []
const availableSources = sources.map((source) => ({
title: source.name,
value: source.id,
selected: selectedSources.includes(source.id)
}))
let isCanceled = false
const response = await prompts(
{
type: "autocompleteMultiselect",
name: "value",
message: "Default sources",
choices: availableSources,
min: 1
},
{ onCancel: () => (isCanceled = true) }
)
if (!isCanceled) {
config.set("defaultSources", response.value)
}
}
async function handleSetExternalDir(config) {
let isCanceled = false
const response = await prompts(
{
type: "text",
name: "value",
message: "Enter the path to your external RSS sources directory",
min: 1
},
{ onCancel: () => (isCanceled = true) }
)
if (!isCanceled) {
if (isValidPath(response.value)) {
config.set("userDefinedRSSDir", response.value)
} else {
throw new Error("The path provided is invalid")
}
}
}
async function handleResetConfig(config) {
let isCanceled = false
const response = await prompts(
{
type: "confirm",
name: "value",
message: "Are you sure you want to reset the configuration?",
initial: false
},
{ onCancel: () => (isCanceled = true) }
)
if (!isCanceled && response.value === true) {
config.clear()
}
}
module.exports = {
showInteractiveConfig
}