aboutsummaryrefslogblamecommitdiffstats
path: root/app/scripts/lib/notifications.js
blob: d1dd144bee0ff95e7da5fd3e26016a7ae3164458 (plain) (tree)
1
2
3
4
5
6
7
8
9
                               

                                                          
                                               
                                                                                                

                             
                  
                                                                   


                                               
 
                
 
                            

                                                                                        
 
                              
                                                                                           









                                                       
                                                                       

                                               
 

                  
                                                 

                                                                                        








                                                                                        

 
                                      

                                                                                        
                 




                                                           

              






















                                                                          
    
 
 
                                       

                                                                                        
                 


                                                                      




                                   
                             




                                    
        
                      
       




                              
 










































































                                                                                    
const createId = require('hat')
const svg = require('virtual-dom/virtual-hyperscript/svg')
const stringifyVdom = require('virtual-dom-stringify')
const uiUtils = require('../../../ui/app/util')
const renderPendingTx = require('../../../ui/app/components/pending-tx').prototype.renderGeneric
var notificationHandlers = {}

module.exports = {
  createUnlockRequestNotification: createUnlockRequestNotification,
  createTxNotification: createTxNotification,
  createMsgNotification: createMsgNotification,
}

setupListeners()

function setupListeners () {
  // guard for chrome bug https://github.com/MetaMask/metamask-plugin/issues/236
  if (!chrome.notifications) return console.error('Chrome notifications API missing...')

  // notification button press
  chrome.notifications.onButtonClicked.addListener(function (notificationId, buttonIndex) {
    var handlers = notificationHandlers[notificationId]
    if (buttonIndex === 0) {
      handlers.confirm()
    } else {
      handlers.cancel()
    }
    chrome.notifications.clear(notificationId)
  })

  // notification teardown
  chrome.notifications.onClosed.addListener(function (notificationId) {
    delete notificationHandlers[notificationId]
  })
}

// creation helper
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,
  })
}

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 = [
    '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')

  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,
    }

  })
}

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 = [
    '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',
    }, {
      title: 'cancel',
    }],
  })
  notificationHandlers[id] = {
    confirm: opts.confirm,
    cancel: opts.cancel,
  }
}

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}}')
      ])
    ])

  )
}