nifty-wallet/app/scripts/lib/notifications.js

190 lines
5.2 KiB
JavaScript
Raw Normal View History

const createId = require('hat')
2016-06-22 19:28:11 -07:00
const svg = require('virtual-dom/virtual-hyperscript/svg')
const stringifyVdom = require('virtual-dom-stringify')
const uiUtils = require('../../../ui/app/util')
2016-06-22 19:28:11 -07:00
const renderPendingTx = require('../../../ui/app/components/pending-tx').prototype.renderGeneric
var notificationHandlers = {}
module.exports = {
createUnlockRequestNotification: createUnlockRequestNotification,
createTxNotification: createTxNotification,
createMsgNotification: createMsgNotification,
}
2016-06-02 17:29:49 -07:00
setupListeners()
2016-06-21 13:18:32 -07:00
function setupListeners () {
2016-06-02 17:29:49 -07:00
// guard for chrome bug https://github.com/MetaMask/metamask-plugin/issues/236
if (!chrome.notifications) return console.error('Chrome notifications API missing...')
2016-06-02 17:29:49 -07:00
// notification button press
2016-06-21 13:18:32 -07:00
chrome.notifications.onButtonClicked.addListener(function (notificationId, buttonIndex) {
2016-06-02 17:29:49 -07:00
var handlers = notificationHandlers[notificationId]
if (buttonIndex === 0) {
handlers.confirm()
} else {
handlers.cancel()
}
chrome.notifications.clear(notificationId)
})
// notification teardown
2016-06-21 13:18:32 -07:00
chrome.notifications.onClosed.addListener(function (notificationId) {
2016-06-02 17:29:49 -07:00
delete notificationHandlers[notificationId]
})
}
// creation helper
2016-06-21 13:18:32 -07:00
function createUnlockRequestNotification (opts) {
// guard for chrome bug https://github.com/MetaMask/metamask-plugin/issues/236
if (!chrome.notifications) return console.error('Chrome notifications API missing...')
var message = 'An Ethereum app has requested a signature. Please unlock your account.'
var id = createId()
chrome.notifications.create(id, {
type: 'basic',
iconUrl: '/images/icon-128.png',
title: opts.title,
message: message,
})
}
2016-06-21 13:18:32 -07:00
function createTxNotification (opts) {
// guard for chrome bug https://github.com/MetaMask/metamask-plugin/issues/236
if (!chrome.notifications) return console.error('Chrome notifications API missing...')
var message = [
2016-06-21 13:18:32 -07:00
'Submitted by ' + opts.txParams.origin,
'to: ' + uiUtils.addressSummary(opts.txParams.to),
'from: ' + uiUtils.addressSummary(opts.txParams.from),
'value: ' + uiUtils.formatBalance(opts.txParams.value),
'data: ' + uiUtils.dataSize(opts.txParams.data),
].join('\n')
2016-06-22 19:28:11 -07:00
transactionNotificationSVG(opts, function(err, source){
var imageUrl = 'data:image/svg+xml;utf8,' + encodeURIComponent(source)
var id = createId()
chrome.notifications.create(id, {
type: 'image',
// requireInteraction: true,
iconUrl: '/images/icon-128.png',
imageUrl: imageUrl,
title: opts.title,
message: message,
buttons: [{
title: 'confirm',
}, {
title: 'cancel',
}],
})
notificationHandlers[id] = {
confirm: opts.confirm,
cancel: opts.cancel,
}
})
}
2016-06-21 13:18:32 -07:00
function createMsgNotification (opts) {
// guard for chrome bug https://github.com/MetaMask/metamask-plugin/issues/236
if (!chrome.notifications) return console.error('Chrome notifications API missing...')
var message = [
2016-06-21 13:18:32 -07:00
'Submitted by ' + opts.msgParams.origin,
'to be signed by: ' + uiUtils.addressSummary(opts.msgParams.from),
'message:\n' + opts.msgParams.data,
].join('\n')
var id = createId()
chrome.notifications.create(id, {
type: 'basic',
requireInteraction: true,
iconUrl: '/images/icon-128.png',
title: opts.title,
message: message,
buttons: [{
title: 'confirm',
2016-06-21 13:18:32 -07:00
}, {
title: 'cancel',
2016-06-21 13:18:32 -07:00
}],
})
notificationHandlers[id] = {
confirm: opts.confirm,
cancel: opts.cancel,
}
2016-06-21 13:18:32 -07:00
}
2016-06-22 19:28:11 -07:00
function transactionNotificationSVG(opts, cb){
var state = {
txData: {
txParams: {
from: '0xabcd',
},
},
identities: {
},
accounts: {
},
}
const unmountComponentAtNode = require('react-dom').unmountComponentAtNode
const findDOMNode = require('react-dom').findDOMNode
const render = require('react-dom').render
const h = require('react-hyperscript')
const MetaMaskUiCss = require('../../../ui/css')
var css = MetaMaskUiCss()
var container = document.createElement('div')
var confirmView = h('div', [
h('style', css),
renderPendingTx(h, state),
])
render(confirmView, container, function ready(){
var rootElement = findDOMNode(this)
var source = rootElement.outerHTML
unmountComponentAtNode(container)
var vnode = svgWrapper()
var tagSource = stringifyVdom(vnode)
// workaround for https://github.com/alexmingoia/virtual-dom-stringify/issues/26
tagSource = tagSource.split('foreignobject').join('foreignObject')
// insert content into svg wrapper
tagSource = tagSource.split('{{content}}').join(source)
cb(null, tagSource)
})
}
function svgWrapper(){
var h = svg
return (
h('svg', {
'xmlns': 'http://www.w3.org/2000/svg',
// 'width': '300',
// 'height': '200',
'width': '450',
'height': '300',
}, [
h('rect', {
'x': '0',
'y': '0',
'width': '100%',
'height': '100%',
'fill': 'white',
}),
h('foreignObject', {
'x': '0',
'y': '0',
'width': '100%',
'height': '100%',
}, [
h('body', {
xmlns: 'http://www.w3.org/1999/xhtml',
},'{{content}}')
])
])
)
}