1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-23 09:52:26 +01:00

Add close window support to signature requests. Move logic to actions

This commit is contained in:
Alexander Tseung 2018-07-23 20:25:04 -07:00
parent 2359062b62
commit 152246f3b0
5 changed files with 108 additions and 31 deletions

View File

@ -10,6 +10,8 @@ const {
const ethUtil = require('ethereumjs-util') const ethUtil = require('ethereumjs-util')
const { fetchLocale } = require('../i18n-helper') const { fetchLocale } = require('../i18n-helper')
const log = require('loglevel') const log = require('loglevel')
const { ENVIRONMENT_TYPE_NOTIFICATION } = require('../../app/scripts/lib/enums')
const { hasUnconfirmedTransactions } = require('./helpers/confirm-transaction/util')
var actions = { var actions = {
_setBackgroundConnection: _setBackgroundConnection, _setBackgroundConnection: _setBackgroundConnection,
@ -743,7 +745,7 @@ function setCurrentCurrency (currencyCode) {
function signMsg (msgData) { function signMsg (msgData) {
log.debug('action - signMsg') log.debug('action - signMsg')
return (dispatch) => { return (dispatch, getState) => {
dispatch(actions.showLoadingIndication()) dispatch(actions.showLoadingIndication())
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
@ -760,6 +762,12 @@ function signMsg (msgData) {
} }
dispatch(actions.completedTx(msgData.metamaskId)) dispatch(actions.completedTx(msgData.metamaskId))
if (global.METAMASK_UI_TYPE === ENVIRONMENT_TYPE_NOTIFICATION &&
!hasUnconfirmedTransactions(getState())) {
return global.platform.closeCurrentWindow()
}
return resolve(msgData) return resolve(msgData)
}) })
}) })
@ -768,7 +776,7 @@ function signMsg (msgData) {
function signPersonalMsg (msgData) { function signPersonalMsg (msgData) {
log.debug('action - signPersonalMsg') log.debug('action - signPersonalMsg')
return dispatch => { return (dispatch, getState) => {
dispatch(actions.showLoadingIndication()) dispatch(actions.showLoadingIndication())
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
@ -785,6 +793,12 @@ function signPersonalMsg (msgData) {
} }
dispatch(actions.completedTx(msgData.metamaskId)) dispatch(actions.completedTx(msgData.metamaskId))
if (global.METAMASK_UI_TYPE === ENVIRONMENT_TYPE_NOTIFICATION &&
!hasUnconfirmedTransactions(getState())) {
return global.platform.closeCurrentWindow()
}
return resolve(msgData) return resolve(msgData)
}) })
}) })
@ -793,7 +807,7 @@ function signPersonalMsg (msgData) {
function signTypedMsg (msgData) { function signTypedMsg (msgData) {
log.debug('action - signTypedMsg') log.debug('action - signTypedMsg')
return (dispatch) => { return (dispatch, getState) => {
dispatch(actions.showLoadingIndication()) dispatch(actions.showLoadingIndication())
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
@ -810,6 +824,12 @@ function signTypedMsg (msgData) {
} }
dispatch(actions.completedTx(msgData.metamaskId)) dispatch(actions.completedTx(msgData.metamaskId))
if (global.METAMASK_UI_TYPE === ENVIRONMENT_TYPE_NOTIFICATION &&
!hasUnconfirmedTransactions(getState())) {
return global.platform.closeCurrentWindow()
}
return resolve(msgData) return resolve(msgData)
}) })
}) })
@ -1003,7 +1023,7 @@ function clearSend () {
function sendTx (txData) { function sendTx (txData) {
log.info(`actions - sendTx: ${JSON.stringify(txData.txParams)}`) log.info(`actions - sendTx: ${JSON.stringify(txData.txParams)}`)
return (dispatch) => { return (dispatch, getState) => {
log.debug(`actions calling background.approveTransaction`) log.debug(`actions calling background.approveTransaction`)
background.approveTransaction(txData.id, (err) => { background.approveTransaction(txData.id, (err) => {
if (err) { if (err) {
@ -1011,6 +1031,11 @@ function sendTx (txData) {
return log.error(err.message) return log.error(err.message)
} }
dispatch(actions.completedTx(txData.id)) dispatch(actions.completedTx(txData.id))
if (global.METAMASK_UI_TYPE === ENVIRONMENT_TYPE_NOTIFICATION &&
!hasUnconfirmedTransactions(getState())) {
return global.platform.closeCurrentWindow()
}
}) })
} }
} }
@ -1059,7 +1084,7 @@ function updateTransaction (txData) {
function updateAndApproveTx (txData) { function updateAndApproveTx (txData) {
log.info('actions: updateAndApproveTx: ' + JSON.stringify(txData)) log.info('actions: updateAndApproveTx: ' + JSON.stringify(txData))
return dispatch => { return (dispatch, getState) => {
log.debug(`actions calling background.updateAndApproveTx`) log.debug(`actions calling background.updateAndApproveTx`)
dispatch(actions.showLoadingIndication()) dispatch(actions.showLoadingIndication())
@ -1084,6 +1109,12 @@ function updateAndApproveTx (txData) {
dispatch(actions.clearSend()) dispatch(actions.clearSend())
dispatch(actions.completedTx(txData.id)) dispatch(actions.completedTx(txData.id))
dispatch(actions.hideLoadingIndication()) dispatch(actions.hideLoadingIndication())
if (global.METAMASK_UI_TYPE === ENVIRONMENT_TYPE_NOTIFICATION &&
!hasUnconfirmedTransactions(getState())) {
return global.platform.closeCurrentWindow()
}
return txData return txData
}) })
} }
@ -1112,7 +1143,7 @@ function txError (err) {
} }
function cancelMsg (msgData) { function cancelMsg (msgData) {
return dispatch => { return (dispatch, getState) => {
dispatch(actions.showLoadingIndication()) dispatch(actions.showLoadingIndication())
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
@ -1126,6 +1157,12 @@ function cancelMsg (msgData) {
} }
dispatch(actions.completedTx(msgData.id)) dispatch(actions.completedTx(msgData.id))
if (global.METAMASK_UI_TYPE === ENVIRONMENT_TYPE_NOTIFICATION &&
!hasUnconfirmedTransactions(getState())) {
return global.platform.closeCurrentWindow()
}
return resolve(msgData) return resolve(msgData)
}) })
}) })
@ -1133,7 +1170,7 @@ function cancelMsg (msgData) {
} }
function cancelPersonalMsg (msgData) { function cancelPersonalMsg (msgData) {
return dispatch => { return (dispatch, getState) => {
dispatch(actions.showLoadingIndication()) dispatch(actions.showLoadingIndication())
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
@ -1147,6 +1184,12 @@ function cancelPersonalMsg (msgData) {
} }
dispatch(actions.completedTx(id)) dispatch(actions.completedTx(id))
if (global.METAMASK_UI_TYPE === ENVIRONMENT_TYPE_NOTIFICATION &&
!hasUnconfirmedTransactions(getState())) {
return global.platform.closeCurrentWindow()
}
return resolve(msgData) return resolve(msgData)
}) })
}) })
@ -1154,7 +1197,7 @@ function cancelPersonalMsg (msgData) {
} }
function cancelTypedMsg (msgData) { function cancelTypedMsg (msgData) {
return dispatch => { return (dispatch, getState) => {
dispatch(actions.showLoadingIndication()) dispatch(actions.showLoadingIndication())
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
@ -1168,6 +1211,12 @@ function cancelTypedMsg (msgData) {
} }
dispatch(actions.completedTx(id)) dispatch(actions.completedTx(id))
if (global.METAMASK_UI_TYPE === ENVIRONMENT_TYPE_NOTIFICATION &&
!hasUnconfirmedTransactions(getState())) {
return global.platform.closeCurrentWindow()
}
return resolve(msgData) return resolve(msgData)
}) })
}) })
@ -1175,7 +1224,7 @@ function cancelTypedMsg (msgData) {
} }
function cancelTx (txData) { function cancelTx (txData) {
return dispatch => { return (dispatch, getState) => {
log.debug(`background.cancelTransaction`) log.debug(`background.cancelTransaction`)
dispatch(actions.showLoadingIndication()) dispatch(actions.showLoadingIndication())
@ -1194,6 +1243,12 @@ function cancelTx (txData) {
dispatch(actions.clearSend()) dispatch(actions.clearSend())
dispatch(actions.completedTx(txData.id)) dispatch(actions.completedTx(txData.id))
dispatch(actions.hideLoadingIndication()) dispatch(actions.hideLoadingIndication())
if (global.METAMASK_UI_TYPE === ENVIRONMENT_TYPE_NOTIFICATION &&
!hasUnconfirmedTransactions(getState())) {
return global.platform.closeCurrentWindow()
}
return txData return txData
}) })
} }

View File

@ -8,9 +8,6 @@ import {
INSUFFICIENT_FUNDS_ERROR_KEY, INSUFFICIENT_FUNDS_ERROR_KEY,
TRANSACTION_ERROR_KEY, TRANSACTION_ERROR_KEY,
} from '../../../constants/error-keys' } from '../../../constants/error-keys'
import {
ENVIRONMENT_TYPE_NOTIFICATION,
} from '../../../../../app/scripts/lib/enums'
export default class ConfirmTransactionBase extends Component { export default class ConfirmTransactionBase extends Component {
static contextTypes = { static contextTypes = {
@ -253,12 +250,8 @@ export default class ConfirmTransactionBase extends Component {
} else { } else {
cancelTransaction(txData) cancelTransaction(txData)
.then(() => { .then(() => {
if (global.METAMASK_UI_TYPE === ENVIRONMENT_TYPE_NOTIFICATION) {
return global.platform.closeCurrentWindow()
} else {
clearConfirmTransaction() clearConfirmTransaction()
history.push(DEFAULT_ROUTE) history.push(DEFAULT_ROUTE)
}
}) })
} }
} }
@ -271,12 +264,8 @@ export default class ConfirmTransactionBase extends Component {
} else { } else {
sendTransaction(txData) sendTransaction(txData)
.then(() => { .then(() => {
if (global.METAMASK_UI_TYPE === ENVIRONMENT_TYPE_NOTIFICATION) {
return global.platform.closeCurrentWindow()
} else {
clearConfirmTransaction() clearConfirmTransaction()
history.push(DEFAULT_ROUTE) history.push(DEFAULT_ROUTE)
}
}) })
} }
} }

View File

@ -27,19 +27,17 @@ const {
NOTICE_ROUTE, NOTICE_ROUTE,
} = require('../../routes') } = require('../../routes')
const { unconfirmedTransactionsCountSelector } = require('../../selectors/confirm-transaction')
class Home extends Component { class Home extends Component {
componentDidMount () { componentDidMount () {
const { const {
history, history,
unapprovedTxs = {}, unconfirmedTransactionsCount = 0,
unapprovedMsgCount = 0,
unapprovedPersonalMsgCount = 0,
unapprovedTypedMessagesCount = 0,
} = this.props } = this.props
// unapprovedTxs and unapproved messages // unapprovedTxs and unapproved messages
if (Object.keys(unapprovedTxs).length || if (unconfirmedTransactionsCount > 0) {
unapprovedTypedMessagesCount + unapprovedMsgCount + unapprovedPersonalMsgCount > 0) {
history.push(CONFIRM_TRANSACTION_ROUTE) history.push(CONFIRM_TRANSACTION_ROUTE)
} }
} }
@ -167,6 +165,7 @@ Home.propTypes = {
isPopup: PropTypes.bool, isPopup: PropTypes.bool,
isMouseUser: PropTypes.bool, isMouseUser: PropTypes.bool,
t: PropTypes.func, t: PropTypes.func,
unconfirmedTransactionsCount: PropTypes.number,
} }
function mapStateToProps (state) { function mapStateToProps (state) {
@ -230,6 +229,7 @@ function mapStateToProps (state) {
// state needed to get account dropdown temporarily rendering from app bar // state needed to get account dropdown temporarily rendering from app bar
selected, selected,
unconfirmedTransactionsCount: unconfirmedTransactionsCountSelector(state),
} }
} }

View File

@ -16,6 +16,8 @@ import {
conversionGreaterThan, conversionGreaterThan,
} from '../../conversion-util' } from '../../conversion-util'
import { unconfirmedTransactionsCountSelector } from '../../selectors/confirm-transaction'
export function getTokenData (data = {}) { export function getTokenData (data = {}) {
return abiDecoder.decodeMethod(data) return abiDecoder.decodeMethod(data)
} }
@ -131,3 +133,7 @@ export function convertTokenToFiat ({
conversionRate: totalExchangeRate, conversionRate: totalExchangeRate,
}) })
} }
export function hasUnconfirmedTransactions (state) {
return unconfirmedTransactionsCountSelector(state) > 0
}

View File

@ -62,6 +62,34 @@ export const unconfirmedTransactionsHashSelector = createSelector(
} }
) )
const unapprovedMsgCountSelector = state => state.metamask.unapprovedMsgCount
const unapprovedPersonalMsgCountSelector = state => state.metamask.unapprovedPersonalMsgCount
const unapprovedTypedMessagesCountSelector = state => state.metamask.unapprovedTypedMessagesCount
export const unconfirmedTransactionsCountSelector = createSelector(
unapprovedTxsSelector,
unapprovedMsgCountSelector,
unapprovedPersonalMsgCountSelector,
unapprovedTypedMessagesCountSelector,
networkSelector,
(
unapprovedTxs = {},
unapprovedMsgCount = 0,
unapprovedPersonalMsgCount = 0,
unapprovedTypedMessagesCount = 0,
network
) => {
const filteredUnapprovedTxIds = Object.keys(unapprovedTxs).filter(txId => {
const { metamaskNetworkId } = unapprovedTxs[txId]
return metamaskNetworkId === network
})
return filteredUnapprovedTxIds.length + unapprovedTypedMessagesCount + unapprovedMsgCount +
unapprovedPersonalMsgCount
}
)
export const currentCurrencySelector = state => state.metamask.currentCurrency export const currentCurrencySelector = state => state.metamask.currentCurrency
export const conversionRateSelector = state => state.metamask.conversionRate export const conversionRateSelector = state => state.metamask.conversionRate
@ -156,7 +184,6 @@ export const sendTokenTokenAmountAndToAddressSelector = createSelector(
} }
) )
export const contractExchangeRateSelector = createSelector( export const contractExchangeRateSelector = createSelector(
contractExchangeRatesSelector, contractExchangeRatesSelector,
tokenAddressSelector, tokenAddressSelector,