--- /dev/null
+'use strict';
+
+const BooleanPrompt = require('../types/boolean');
+
+class TogglePrompt extends BooleanPrompt {
+ async initialize() {
+ await super.initialize();
+ this.value = this.initial = !!this.options.initial;
+ this.disabled = this.options.disabled || 'no';
+ this.enabled = this.options.enabled || 'yes';
+ await this.render();
+ }
+
+ reset() {
+ this.value = this.initial;
+ this.render();
+ }
+
+ delete() {
+ this.alert();
+ }
+
+ toggle() {
+ this.value = !this.value;
+ this.render();
+ }
+
+ enable() {
+ if (this.value === true) return this.alert();
+ this.value = true;
+ this.render();
+ }
+ disable() {
+ if (this.value === false) return this.alert();
+ this.value = false;
+ this.render();
+ }
+
+ up() {
+ this.toggle();
+ }
+ down() {
+ this.toggle();
+ }
+ right() {
+ this.toggle();
+ }
+ left() {
+ this.toggle();
+ }
+ next() {
+ this.toggle();
+ }
+ prev() {
+ this.toggle();
+ }
+
+ dispatch(ch = '', key) {
+ switch (ch.toLowerCase()) {
+ case ' ':
+ return this.toggle();
+ case '1':
+ case 'y':
+ case 't':
+ return this.enable();
+ case '0':
+ case 'n':
+ case 'f':
+ return this.disable();
+ default: {
+ return this.alert();
+ }
+ }
+ }
+
+ format() {
+ let active = str => this.styles.primary.underline(str);
+ let value = [
+ this.value ? this.disabled : active(this.disabled),
+ this.value ? active(this.enabled) : this.enabled
+ ];
+ return value.join(this.styles.muted(' / '));
+ }
+
+ async render() {
+ let { size } = this.state;
+
+ let header = await this.header();
+ let prefix = await this.prefix();
+ let separator = await this.separator();
+ let message = await this.message();
+
+ let output = await this.format();
+ let help = (await this.error()) || (await this.hint());
+ let footer = await this.footer();
+
+ let prompt = [prefix, message, separator, output].join(' ');
+ this.state.prompt = prompt;
+
+ if (help && !prompt.includes(help)) prompt += ' ' + help;
+
+ this.clear(size);
+ this.write([header, prompt, footer].filter(Boolean).join('\n'));
+ this.write(this.margin[2]);
+ this.restore();
+ }
+}
+
+module.exports = TogglePrompt;