diff options
Merge branch 'AddPersistentTransactionLog'
Diffstat (limited to 'app/scripts')
-rw-r--r-- | app/scripts/background.js | 3 | ||||
-rw-r--r-- | app/scripts/lib/config-manager.js | 50 | ||||
-rw-r--r-- | app/scripts/lib/idStore.js | 14 |
3 files changed, 60 insertions, 7 deletions
diff --git a/app/scripts/background.js b/app/scripts/background.js index db4927083..1519f63db 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -191,7 +191,8 @@ idStore.on('update', updateBadge) function updateBadge(state){ var label = '' - var count = Object.keys(state.unconfTxs).length + var unconfTxs = configManager.unconfirmedTxs() + var count = Object.keys(unconfTxs).length if (count) { label = String(count) } diff --git a/app/scripts/lib/config-manager.js b/app/scripts/lib/config-manager.js index f024729cc..356d53c22 100644 --- a/app/scripts/lib/config-manager.js +++ b/app/scripts/lib/config-manager.js @@ -134,6 +134,56 @@ ConfigManager.prototype.setData = function(data) { this.migrator.saveData(data) } +ConfigManager.prototype.getTxList = function() { + var data = this.migrator.getData() + if ('transactions' in data) { + return data.transactions + } else { + return [] + } +} + +ConfigManager.prototype._saveTxList = function(txList) { + var data = this.migrator.getData() + data.transactions = txList + this.setData(data) +} + +ConfigManager.prototype.addTx = function(tx) { + var transactions = this.getTxList() + transactions.push(tx) + this._saveTxList(transactions) +} + +ConfigManager.prototype.getTx = function(txId) { + var transactions = this.getTxList() + var matching = transactions.filter(tx => tx.id === txId) + return matching.length > 0 ? matching[0] : null +} + +ConfigManager.prototype.confirmTx = function(txId) { + this._setTxStatus(txId, 'confirmed') +} + +ConfigManager.prototype.rejectTx = function(txId) { + this._setTxStatus(txId, 'rejected') +} + +ConfigManager.prototype._setTxStatus = function(txId, status) { + var transactions = this.getTxList() + transactions.forEach((tx) => { + if (tx.id === txId) { + tx.status = status + } + }) + this._saveTxList(transactions) +} +ConfigManager.prototype.unconfirmedTxs = function() { + var transactions = this.getTxList() + return transactions.filter(tx => tx.status === 'unconfirmed') + .reduce((result, tx) => { result[tx.id] = tx; return result }, {}) +} + // observable ConfigManager.prototype.subscribe = function(fn){ diff --git a/app/scripts/lib/idStore.js b/app/scripts/lib/idStore.js index f44300273..b451fd6d4 100644 --- a/app/scripts/lib/idStore.js +++ b/app/scripts/lib/idStore.js @@ -31,7 +31,6 @@ function IdentityStore(ethStore) { this._currentState = { selectedAddress: null, identities: {}, - unconfTxs: {}, } // not part of serilized metamask state - only kept in memory this._unconfTxCbs = {} @@ -83,6 +82,8 @@ IdentityStore.prototype.getState = function(){ isInitialized: !!configManager.getWallet() && !seedWords, isUnlocked: this._isUnlocked(), seedWords: seedWords, + unconfTxs: configManager.unconfirmedTxs(), + transactions: configManager.getTxList(), })) } @@ -140,10 +141,11 @@ IdentityStore.prototype.addUnconfirmedTransaction = function(txParams, cb){ time: time, status: 'unconfirmed', } - this._currentState.unconfTxs[txId] = txData + configManager.addTx(txData) console.log('addUnconfirmedTransaction:', txData) // keep the cb around for after approval (requires user interaction) + // This cb fires completion to the Dapp's write operation. this._unconfTxCbs[txId] = cb // signal update @@ -154,7 +156,7 @@ IdentityStore.prototype.addUnconfirmedTransaction = function(txParams, cb){ // comes from metamask ui IdentityStore.prototype.approveTransaction = function(txId, cb){ - var txData = this._currentState.unconfTxs[txId] + var txData = configManager.getTx(txId) var txParams = txData.txParams var approvalCb = this._unconfTxCbs[txId] || noop @@ -162,20 +164,20 @@ IdentityStore.prototype.approveTransaction = function(txId, cb){ cb() approvalCb(null, true) // clean up - delete this._currentState.unconfTxs[txId] + configManager.confirmTx(txId) delete this._unconfTxCbs[txId] this._didUpdate() } // comes from metamask ui IdentityStore.prototype.cancelTransaction = function(txId){ - var txData = this._currentState.unconfTxs[txId] + var txData = configManager.getTx(txId) var approvalCb = this._unconfTxCbs[txId] || noop // reject tx approvalCb(null, false) // clean up - delete this._currentState.unconfTxs[txId] + configManager.rejectTx(txId) delete this._unconfTxCbs[txId] this._didUpdate() } |