/* jslint node: true */ 'use strict'; // ENiGMA½ const FullScreenEditorModule = require('./fse.js').FullScreenEditorModule; const Message = require('./message.js'); // deps const _ = require('lodash'); exports.moduleInfo = { name: 'Message Area View', desc: 'Module for viewing an area message', author: 'NuSkooler', }; exports.getModule = class AreaViewFSEModule extends FullScreenEditorModule { constructor(options) { super(options); this.editorType = 'area'; this.editorMode = 'view'; if (_.isObject(options.extraArgs)) { this.messageList = options.extraArgs.messageList; this.messageIndex = options.extraArgs.messageIndex; this.lastMessageNextExit = options.extraArgs.lastMessageNextExit; } this.messageList = this.messageList || []; this.messageIndex = this.messageIndex || 0; this.messageTotal = this.messageList.length; if (this.messageList.length > 0) { this.messageAreaTag = this.messageList[this.messageIndex].areaTag; } const self = this; // assign *additional* menuMethods Object.assign(this.menuMethods, { nextMessage: (formData, extraArgs, cb) => { if (self.messageIndex + 1 < self.messageList.length) { self.messageIndex++; this.messageAreaTag = this.messageList[this.messageIndex].areaTag; this.tempMessageConfAndAreaSwitch(this.messageAreaTag, false); // false=don't record prev; we want what we entered the module with return self.loadMessageByUuid( self.messageList[self.messageIndex].messageUuid, cb ); } // auto-exit if no more to go? if (self.lastMessageNextExit) { self.lastMessageReached = true; return self.prevMenu(cb); } return cb(null); }, prevMessage: (formData, extraArgs, cb) => { if (self.messageIndex > 0) { self.messageIndex--; this.messageAreaTag = this.messageList[this.messageIndex].areaTag; this.tempMessageConfAndAreaSwitch(this.messageAreaTag, false); // false=don't record prev; we want what we entered the module with return self.loadMessageByUuid( self.messageList[self.messageIndex].messageUuid, cb ); } return cb(null); }, movementKeyPressed: (formData, extraArgs, cb) => { const bodyView = self.viewControllers.body.getView(1); // :TODO: use const here vs magic # // :TODO: Create methods for up/down vs using keyPressXXXXX switch (formData.key.name) { case 'down arrow': bodyView.scrollDocumentUp(); break; case 'up arrow': bodyView.scrollDocumentDown(); break; case 'page up': bodyView.keyPressPageUp(); break; case 'page down': bodyView.keyPressPageDown(); break; } // :TODO: need to stop down/page down if doing so would push the last // visible page off the screen at all .... this should be handled by MLTEV though... return cb(null); }, replyMessage: (formData, extraArgs, cb) => { if (_.isString(extraArgs.menu)) { const modOpts = { extraArgs: { messageAreaTag: self.messageAreaTag, replyToMessage: self.message, }, }; return self.gotoMenu(extraArgs.menu, modOpts, cb); } self.client.log(extraArgs, 'Missing extraArgs.menu'); return cb(null); }, }); } loadMessageByUuid(uuid, cb) { const msg = new Message(); msg.load({ uuid: uuid, user: this.client.user }, () => { this.setMessage(msg); if (cb) { return cb(null); } }); } finishedLoading() { this.loadMessageByUuid(this.messageList[this.messageIndex].messageUuid); } getSaveState() { return { messageList: this.messageList, messageIndex: this.messageIndex, messageTotal: this.messageList.length, }; } restoreSavedState(savedState) { this.messageList = savedState.messageList; this.messageIndex = savedState.messageIndex; this.messageTotal = savedState.messageTotal; } getMenuResult() { return { messageIndex: this.messageIndex, lastMessageReached: this.lastMessageReached, }; } };