/* global */ 'use strict' var $ = require('jquery') var yo = require('yo-yo') var helper = require('./lib/helper') var copyToClipboard = require('./app/ui/copy-to-clipboard') var css = require('./universal-dapp-styles') var MultiParamManager = require('./multiParamManager') function UniversalDAppUI (udapp, opts = {}) { this.udapp = udapp } UniversalDAppUI.prototype.renderInstance = function (contract, address, contractName) { var noInstances = document.querySelector('[class^="noInstancesText"]') if (noInstances) { noInstances.parentNode.removeChild(noInstances) } var abi = this.udapp.getABI(contract) return this.renderInstanceFromABI(abi, address, contractName) } // TODO this function was named before "appendChild". // this will render an instance: contract name, contract address, and all the public functions // basically this has to be called for the "atAddress" (line 393) and when a contract creation succeed // this returns a DOM element UniversalDAppUI.prototype.renderInstanceFromABI = function (contractABI, address, contractName) { var self = this address = (address.slice(0, 2) === '0x' ? '' : '0x') + address.toString('hex') var instance = yo`
` var context = self.udapp.context() var shortAddress = helper.shortenAddress(address) var title = yo`
${contractName} at ${shortAddress} (${context})
${copyToClipboard(() => address)}
` if (self.udapp.removable_instances) { var close = yo`
` title.appendChild(close) } function remove () { instance.remove() // @TODO perhaps add a callack here to warn the caller that the instance has been removed } function toggleClass () { $(instance).toggleClass(`${css.hidesub}`) } instance.appendChild(title) // Add the fallback function var fallback = self.udapp.getFallbackInterface(contractABI) if (fallback) { instance.appendChild(this.getCallButton({ funABI: fallback, address: address, contractAbi: contractABI, contractName: contractName })) } $.each(contractABI, (i, funABI) => { if (funABI.type !== 'function') { return } // @todo getData cannot be used with overloaded functions instance.appendChild(this.getCallButton({ funABI: funABI, address: address, contractAbi: contractABI, contractName: contractName })) }) return instance } // TODO this is used by renderInstance when a new instance is displayed. // this returns a DOM element. UniversalDAppUI.prototype.getCallButton = function (args) { var self = this // args.funABI, args.address [fun only] // args.contractName [constr only] var lookupOnly = args.funABI.constant var outputOverride = yo`
` // show return value function clickButton (valArr, inputsValues) { self.udapp.call(true, args, inputsValues, lookupOnly, (decoded) => { outputOverride.innerHTML = '' outputOverride.appendChild(decoded) }) } var multiParamManager = new MultiParamManager(lookupOnly, args.funABI, (valArray, inputsValues, domEl) => { clickButton(valArray, inputsValues, domEl) }, self.udapp.getInputs(args.funABI)) var contractActionsContainer = yo`
${multiParamManager.render()}
` contractActionsContainer.appendChild(outputOverride) return contractActionsContainer } module.exports = UniversalDAppUI