rflect
Version:
A CLI tool for guided reflections and journaling
117 lines (107 loc) • 3.69 kB
JavaScript
const inquirer = require('inquirer');
const styles = require('../utils/styles');
const { checkConfig } = require('../utils/config');
const { getRandomPrompt, incrementPromptUsageCount } = require('../utils/prompts');
const { intervalToDuration } = require('date-fns');
const { formatDuration } = require('../utils/format');
const { moods } = require('../data/mood');
const { saveEntry } = require('../utils/entries');
async function writeCommand() {
try {
const { isFirstTime, config } = await checkConfig();
if (isFirstTime) {
console.log(styles.warning(`\nWelcome to rflect! Let's get you set up first.`));
console.log(
styles.info('Run ') +
styles.value('rflect init') +
styles.info(' to start your reflection journey.')
);
return;
}
let body;
const prompt = await getRandomPrompt();
await incrementPromptUsageCount(prompt.id);
const { mood } = await inquirer.prompt([
{
type: 'list',
name: 'mood',
message: styles.prompt('How are you feeling today?'),
choices: moods,
},
]);
const startTime = new Date();
if (config.user.useEditor) {
({ body } = await inquirer.prompt([
{
type: 'editor',
name: 'body',
message: styles.prompt(prompt.question + '\n'),
waitUserInput: true,
default: '\n\n[Write your reflection here...]',
// Editor content is validated after closing the editor
validate: (input) => {
const wordCount = input.trim().split(/\s+/).length;
if (wordCount < 10) {
return styles.warning(
'Your reflection seems a bit short. Please write at least 10 words to capture your thoughts.'
);
}
return true;
},
},
]));
} else {
({ body } = await inquirer.prompt([
{
type: 'input',
name: 'body',
message: styles.prompt(prompt.question + '\n'),
validate: (input) => {
const wordCount = input.trim().split(/\s+/).length;
if (wordCount < 10) {
return styles.warning(
'Your reflection seems a bit short. Please write at least 10 words to capture your thoughts.'
);
}
return true;
},
},
]));
}
const { tags } = await inquirer.prompt([
{
type: 'input',
name: 'tags',
message: styles.prompt('Add tags (comma-separated) [optional]:'),
filter: (input) =>
input
.split(',')
.map((tag) => tag.trim())
.filter((tag) => tag.length > 0),
},
]);
const endTime = new Date();
const duration = intervalToDuration({ start: startTime, end: endTime });
const durationString = formatDuration(duration);
// update the config when entry is also saved...
const { entry, messages } = await saveEntry({
prompt,
body,
tags,
mood,
startTime,
endTime,
durationString,
config,
});
console.log(styles.success('✨ Your reflection has been saved!'));
console.log(styles.help('Word Count: ') + styles.number(entry.content.wordCount));
console.log(styles.help('Time Spent Writing: ') + styles.number(durationString));
console.log();
messages.forEach((message) => console.log(message));
} catch (error) {
console.error(styles.error('Error during writing: ') + styles.value(error.message));
console.log(styles.help('Please try again or report this issue.'));
}
}
module.exports = writeCommand;