aboutsummaryrefslogtreecommitdiffstats
path: root/ui/lib/icon-factory.js
diff options
context:
space:
mode:
authorDan Finlay <dan@danfinlay.com>2017-07-21 03:38:38 +0800
committerDan Finlay <dan@danfinlay.com>2017-07-21 03:38:38 +0800
commit86d367957fe8ac04462f716fe0ba2bfa4e5ff3f6 (patch)
treeb4a6805e5e2a4de48c880d80f4b87d1f3b560a18 /ui/lib/icon-factory.js
parent199587383b022a17d56adcb56d6a99ceba71fec7 (diff)
downloadtangerine-wallet-browser-86d367957fe8ac04462f716fe0ba2bfa4e5ff3f6.tar.gz
tangerine-wallet-browser-86d367957fe8ac04462f716fe0ba2bfa4e5ff3f6.tar.zst
tangerine-wallet-browser-86d367957fe8ac04462f716fe0ba2bfa4e5ff3f6.zip
Move responsive ui into its own folder for easier merges
Diffstat (limited to 'ui/lib/icon-factory.js')
-rw-r--r--ui/lib/icon-factory.js65
1 files changed, 65 insertions, 0 deletions
diff --git a/ui/lib/icon-factory.js b/ui/lib/icon-factory.js
new file mode 100644
index 000000000..27a74de66
--- /dev/null
+++ b/ui/lib/icon-factory.js
@@ -0,0 +1,65 @@
+var iconFactory
+const isValidAddress = require('ethereumjs-util').isValidAddress
+const toChecksumAddress = require('ethereumjs-util').toChecksumAddress
+const contractMap = require('eth-contract-metadata')
+
+module.exports = function (jazzicon) {
+ if (!iconFactory) {
+ iconFactory = new IconFactory(jazzicon)
+ }
+ return iconFactory
+}
+
+function IconFactory (jazzicon) {
+ this.jazzicon = jazzicon
+ this.cache = {}
+}
+
+IconFactory.prototype.iconForAddress = function (address, diameter) {
+ const addr = toChecksumAddress(address)
+ if (iconExistsFor(addr)) {
+ return imageElFor(addr)
+ }
+
+ return this.generateIdenticonSvg(address, diameter)
+}
+
+// returns svg dom element
+IconFactory.prototype.generateIdenticonSvg = function (address, diameter) {
+ var cacheId = `${address}:${diameter}`
+ // check cache, lazily generate and populate cache
+ var identicon = this.cache[cacheId] || (this.cache[cacheId] = this.generateNewIdenticon(address, diameter))
+ // create a clean copy so you can modify it
+ var cleanCopy = identicon.cloneNode(true)
+ return cleanCopy
+}
+
+// creates a new identicon
+IconFactory.prototype.generateNewIdenticon = function (address, diameter) {
+ var numericRepresentation = jsNumberForAddress(address)
+ var identicon = this.jazzicon(diameter, numericRepresentation)
+ return identicon
+}
+
+// util
+
+function iconExistsFor (address) {
+ return contractMap[address] && isValidAddress(address) && contractMap[address].logo
+}
+
+function imageElFor (address) {
+ const contract = contractMap[address]
+ const fileName = contract.logo
+ const path = `images/contract/${fileName}`
+ const img = document.createElement('img')
+ img.src = path
+ img.style.width = '75%'
+ return img
+}
+
+function jsNumberForAddress (address) {
+ var addr = address.slice(2, 10)
+ var seed = parseInt(addr, 16)
+ return seed
+}
+