diff options
Diffstat (limited to 'app/scripts/lib')
-rw-r--r-- | app/scripts/lib/message-manager.js | 150 |
1 files changed, 102 insertions, 48 deletions
diff --git a/app/scripts/lib/message-manager.js b/app/scripts/lib/message-manager.js index b609b820e..bc9a9e6c8 100644 --- a/app/scripts/lib/message-manager.js +++ b/app/scripts/lib/message-manager.js @@ -1,61 +1,115 @@ -module.exports = new MessageManager() +const EventEmitter = require('events') +const ObservableStore = require('obs-store') +const createId = require('./random-id') -function MessageManager (opts) { - this.messages = [] -} -MessageManager.prototype.getMsgList = function () { - return this.messages -} +module.exports = class MessageManager extends EventEmitter{ + constructor (opts) { + super() + this.memStore = new ObservableStore({ messages: [] }) + } -MessageManager.prototype.unconfirmedMsgs = function () { - var messages = this.getMsgList() - return messages.filter(msg => msg.status === 'unconfirmed') - .reduce((result, msg) => { result[msg.id] = msg; return result }, {}) -} + getState() { + return { + unapprovedMsgs: this.unapprovedMsgs(), + messages: this.getMsgList(), + } + } -MessageManager.prototype._saveMsgList = function (msgList) { - this.messages = msgList -} + getMsgList () { + return this.memStore.getState().messages + } -MessageManager.prototype.addMsg = function (msg) { - var messages = this.getMsgList() - messages.push(msg) - this._saveMsgList(messages) -} + get unapprovedMsgCount () { + return Object.keys(this.unapprovedMsgs()).length + } -MessageManager.prototype.getMsg = function (msgId) { - var messages = this.getMsgList() - var matching = messages.filter(msg => msg.id === msgId) - return matching.length > 0 ? matching[0] : null -} + unapprovedMsgs () { + let messages = this.getMsgList() + return messages.filter(msg => msg.status === 'unapproved') + .reduce((result, msg) => { result[msg.id] = msg; return result }, {}) + } -MessageManager.prototype.confirmMsg = function (msgId) { - this._setMsgStatus(msgId, 'confirmed') -} + _saveMsgList (msgList) { + this.emit('updateBadge') + let state = this.memStore.getState() + state.messages = msgList + this.memStore.putState(state) + } -MessageManager.prototype.rejectMsg = function (msgId) { - this._setMsgStatus(msgId, 'rejected') -} + addUnapprovedMessage (msgParams) { + // create txData obj with parameters and meta data + var time = (new Date()).getTime() + var msgId = createId() + var msgData = { + id: msgId, + msgParams: msgParams, + time: time, + status: 'unapproved', + } + this.addMsg(msgData) + console.log('addUnapprovedMessage:', msgData) -MessageManager.prototype._setMsgStatus = function (msgId, status) { - var msg = this.getMsg(msgId) - if (msg) msg.status = status - this.updateMsg(msg) -} + // keep the cb around for after approval (requires user interaction) + // This cb fires completion to the Dapp's write operation. + + // signal update + this.emit('update') + return msgId + } -MessageManager.prototype.updateMsg = function (msg) { - var messages = this.getMsgList() - var found, index - messages.forEach((otherMsg, i) => { - if (otherMsg.id === msg.id) { - found = true - index = i + addMsg (msg) { + let messages = this.getMsgList() + messages.push(msg) + this._saveMsgList(messages) + } + + getMsg (msgId) { + let messages = this.getMsgList() + let matching = messages.filter(msg => msg.id === msgId) + return matching.length > 0 ? matching[0] : null + } + + brodcastMessage (rawSig, msgId, status) { + this.emit(`${msgId}:finished`, {status, rawSig}) + } + + approveMessage (msgParams) { + this.setMessageApproved(msgParams.metamaskId) + return this.prepMsgForSigning(msgParams) + } + + setMessageApproved (msgId) { + this._setMsgStatus(msgId, 'approved') + } + prepMsgForSigning (msgParams) { + delete msgParams.metamaskId + return Promise.resolve(msgParams) + } + + cancelMessage (msgId) { + // reject tx + // clean up + this.brodcastMessage(null, msgId, 'rejected') + this.rejectMsg(msgId) + } + + rejectMsg (msgId) { + this._setMsgStatus(msgId, 'rejected') + } + + _setMsgStatus (msgId, status) { + let msg = this.getMsg(msgId) + if (msg) msg.status = status + this._updateMsg(msg) + } + + _updateMsg (msg) { + let messages = this.getMsgList() + let index = messages.findIndex((message) => message.id === msg.id) + if (index !== -1) { + messages[index] = msg } - }) - if (found) { - messages[index] = msg + this._saveMsgList(messages) } - this._saveMsgList(messages) } - |