UNPKG

remix-ide

Version:
126 lines (107 loc) 4.3 kB
var yo = require('yo-yo') var remixLib = require('remix-lib') var EventManager = remixLib.EventManager var csjs = require('csjs-inject') var css = require('../styles/run-tab-styles') var modalDialogCustom = require('../../ui/modal-dialog-custom') var modalDialog = require('../../ui/modaldialog') var confirmDialog = require('../../ui/confirmDialog') class RecorderUI { constructor (blockchain, recorder, logCallBack, config) { this.blockchain = blockchain this.recorder = recorder this.logCallBack = logCallBack this.config = config this.event = new EventManager() } render () { var css2 = csjs` .container {} .runTxs {} .recorder {} ` this.runButton = yo`<i class="fas fa-play runtransaction ${css2.runTxs} ${css.icon}" title="Run Transactions" aria-hidden="true"></i>` this.recordButton = yo` <i class="fas fa-save savetransaction ${css2.recorder} ${css.icon}" onclick=${this.triggerRecordButton.bind(this)} title="Save Transactions" aria-hidden="true"> </i>` this.runButton.onclick = this.runScenario.bind(this) } runScenario () { var continueCb = (error, continueTxExecution, cancelCb) => { if (error) { var msg = typeof error !== 'string' ? error.message : error modalDialog('Gas estimation failed', yo`<div>Gas estimation errored with the following message (see below). The transaction execution will likely fail. Do you want to force sending? <br> ${msg} </div>`, { label: 'Send Transaction', fn: () => { continueTxExecution() }}, { label: 'Cancel Transaction', fn: () => { cancelCb() } }) } else { continueTxExecution() } } var promptCb = (okCb, cancelCb) => { modalDialogCustom.promptPassphrase('Passphrase requested', 'Personal mode is enabled. Please provide passphrase of account', '', okCb, cancelCb) } var alertCb = (msg) => { modalDialogCustom.alert(msg) } const confirmationCb = this.getConfirmationCb(modalDialog, confirmDialog) // TODO: there is still a UI dependency to remove here, it's still too coupled at this point to remove easily this.recorder.runScenario(continueCb, promptCb, alertCb, confirmationCb, this.logCallBack, (error, abi, address, contractName) => { if (error) { return modalDialogCustom.alert(error) } this.event.trigger('newScenario', [abi, address, contractName]) }) } getConfirmationCb (modalDialog, confirmDialog) { // this code is the same as in contractDropdown.js. TODO need to be refactored out const confirmationCb = (network, tx, gasEstimation, continueTxExecution, cancelCb) => { if (network.name !== 'Main') { return continueTxExecution(null) } const amount = this.blockchain.fromWei(tx.value, true, 'ether') const content = confirmDialog(tx, amount, gasEstimation, null, this.blockchain.determineGasFees(tx), this.blockchain.determineGasPrice.bind(this.blockchain)) modalDialog('Confirm transaction', content, { label: 'Confirm', fn: () => { this.config.setUnpersistedProperty('doNotShowTransactionConfirmationAgain', content.querySelector('input#confirmsetting').checked) // TODO: check if this is check is still valid given the refactor if (!content.gasPriceStatus) { cancelCb('Given gas price is not correct') } else { var gasPrice = this.blockchain.toWei(content.querySelector('#gasprice').value, 'gwei') continueTxExecution(gasPrice) } }}, { label: 'Cancel', fn: () => { return cancelCb('Transaction canceled by user.') } } ) } return confirmationCb } triggerRecordButton () { this.recorder.saveScenario( (path, cb) => { modalDialogCustom.prompt('Save transactions as scenario', 'Transactions will be saved in a file under ' + path, 'scenario.json', cb) }, (error) => { if (error) return modalDialogCustom.alert(error) } ) } } module.exports = RecorderUI