Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Estimated time to pending tx #6924

Merged
merged 21 commits into from
Nov 1, 2019
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
b2bb3c2
Add estimated time to pending transactions
Jul 27, 2019
ae63cd4
add sytles for pending transactions component
Jul 27, 2019
5b1ff8d
add media queries styling for pending transactions component
Jul 27, 2019
c6569b9
fix lint errors, remove extra spaces
Jul 27, 2019
09ec0ae
refactor code to call `fetchBasicGasAndTimeEstimates` method once
Jul 30, 2019
368f5a4
refactor code to call `getgetRenderableTimeEstimate` method once
Jul 30, 2019
87f11f6
fix, correct export to use `transaction-time-remaining-component`
Aug 6, 2019
b7e148f
fix indentation issues after running `yarn lint`
Krist14n Aug 7, 2019
a62d7ed
newBigSigDig in gas-price-chart.utils supports strings
danjm Oct 11, 2019
3bf32ff
Code cleanup
danjm Oct 22, 2019
4715bcb
Ensure fetchBasicGasAndTimeEstimates is only called from tx-list if t…
danjm Oct 22, 2019
7bd5704
Move gas time estimate utilities into utility file
danjm Oct 22, 2019
b8b9f56
Move getTxParams to transaction selector file
danjm Oct 22, 2019
87d522e
Add feature flag for display of remaining transaction time in tx hist…
danjm Oct 22, 2019
47e5b08
Fix circular dependency by removing unused import of transactionSelec…
danjm Oct 23, 2019
cfab3e7
Use correct feature flag property name transactionTime
danjm Oct 23, 2019
d95bab0
Ensure that tx list component correctly responds to turning tx time f…
danjm Oct 23, 2019
6ab6bd3
Prevent precision errors in newBigSigDig
danjm Oct 23, 2019
b578d80
Code clean up for pending transaction times
danjm Oct 28, 2019
fcd619e
Update transaction-time-remaining feature to count down seconds, coun…
danjm Oct 31, 2019
625412c
Code clean up for transaction-time-remaining feature
danjm Oct 31, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ export default class TransactionListItem extends PureComponent {
data: PropTypes.string,
getContractMethodData: PropTypes.func,
isDeposit: PropTypes.bool,
currentTimeEstimate: PropTypes.string,
transactionTimeFeatureActive: PropTypes.bool,
firstPendingTransactionId: PropTypes.number,
}

static defaultProps = {
Expand Down Expand Up @@ -186,6 +186,7 @@ export default class TransactionListItem extends PureComponent {
transactionGroup,
rpcPrefs,
isEarliestNonce,
firstPendingTransactionId,
transactionTimeFeatureActive,
} = this.props
const { txParams = {} } = transaction
Expand Down Expand Up @@ -226,11 +227,10 @@ export default class TransactionListItem extends PureComponent {
: primaryTransaction.err && primaryTransaction.err.message
)}
/>
{ transactionTimeFeatureActive
{ transactionTimeFeatureActive && (transaction.id === firstPendingTransactionId)
? <TransactionTimeRemaining
className="transaction-list-item__estimated-time"
statusKey={getStatusKey(primaryTransaction) }
currentTimeEstimate={this.props.currentTimeEstimate}
transaction={ primaryTransaction }
/>
: null
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ export default class TransactionList extends PureComponent {
assetImages: PropTypes.object,
fetchBasicGasAndTimeEstimates: PropTypes.func,
fetchGasEstimates: PropTypes.func,
currentTimeEstimate: PropTypes.string,
transactionTimeFeatureActive: PropTypes.bool,
firstPendingTransactionId: PropTypes.number,
}

componentDidMount () {
Expand Down Expand Up @@ -118,7 +118,7 @@ export default class TransactionList extends PureComponent {
}

renderTransaction (transactionGroup, index, isPendingTx = false) {
const { selectedToken, assetImages } = this.props
const { selectedToken, assetImages, firstPendingTransactionId } = this.props
const { transactions = [] } = transactionGroup

return transactions[0].key === TRANSACTION_TYPE_SHAPESHIFT
Expand All @@ -136,7 +136,7 @@ export default class TransactionList extends PureComponent {
isEarliestNonce={isPendingTx && index === 0}
token={selectedToken}
assetImages={assetImages}
currentTimeEstimate={this.props.currentTimeEstimate}
firstPendingTransactionId={firstPendingTransactionId}
/>
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,41 +5,23 @@ import TransactionList from './transaction-list.component'
import {
nonceSortedCompletedTransactionsSelector,
nonceSortedPendingTransactionsSelector,
getTxParams,
} from '../../../selectors/transactions'
import { getSelectedAddress, getAssetImages, getFeatureFlags } from '../../../selectors/selectors'
import { selectedTokenSelector } from '../../../selectors/tokens'
import { updateNetworkNonce } from '../../../store/actions'
import { fetchBasicGasAndTimeEstimates, fetchGasEstimates } from '../../../ducks/gas/gas.duck'
import {
getCustomGasPrice,
getEstimatedGasPrices,
getEstimatedGasTimes,
} from '../../../selectors/custom-gas'
import { getRenderableTimeEstimate } from '../../../helpers/utils/gas-time-estimates.util'
import { hexWEIToDecGWEI } from '../../../helpers/utils/conversions.util'

const mapStateToProps = (state, ownProps) => {
const { selectedAddressTxList } = state.metamask
const { modalState: { props: modalProps } = {} } = state.appState.modal || {}
const { transaction = {} } = ownProps
const { txData = {} } = modalProps || {}
const selectedTransaction = selectedAddressTxList.find(({ id }) => id === (transaction.id || txData.id))
const { gasPrice: currentGasPrice } = getTxParams(state, selectedTransaction)
const customModalGasPriceInHex = getCustomGasPrice(state) || currentGasPrice
const customGasPrice = calcCustomGasPrice(customModalGasPriceInHex)
const gasPrices = getEstimatedGasPrices(state)
const estimatedTimes = getEstimatedGasTimes(state)
const transactionTimeFeatureActive = getFeatureFlags(state).transactionTime

const mapStateToProps = (state) => {
const pendingTransactions = nonceSortedPendingTransactionsSelector(state)
const firstPendingTransactionId = pendingTransactions[0] && pendingTransactions[0].primaryTransaction.id
return {
completedTransactions: nonceSortedCompletedTransactionsSelector(state),
pendingTransactions: nonceSortedPendingTransactionsSelector(state),
pendingTransactions,
firstPendingTransactionId,
selectedToken: selectedTokenSelector(state),
selectedAddress: getSelectedAddress(state),
assetImages: getAssetImages(state),
currentTimeEstimate: getRenderableTimeEstimate(customGasPrice, gasPrices, estimatedTimes),
transactionTimeFeatureActive,
transactionTimeFeatureActive: getFeatureFlags(state).transactionTime,
}
}

Expand Down Expand Up @@ -67,7 +49,3 @@ export default compose(
withRouter,
connect(mapStateToProps, mapDispatchToProps, mergeProps)
)(TransactionList)

function calcCustomGasPrice (customGasPriceInHex) {
return Number(hexWEIToDecGWEI(customGasPriceInHex))
}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export { default } from './transaction-time-remaining.component'
export { default } from './transaction-time-remaining.container'
Original file line number Diff line number Diff line change
@@ -1,26 +1,50 @@
import React, { PureComponent } from 'react'
import PropTypes from 'prop-types'
import {
SUBMITTED_STATUS,
} from '../../../helpers/constants/transactions'

const statusToTextHash = {
[SUBMITTED_STATUS]: 'pending',
}
import { calcTransactionTimeRemaining } from './transaction-time-remaining.util'

export default class TransactionTimeRemaining extends PureComponent {
static propTypes = {
statusKey: PropTypes.string,
className: PropTypes.string,
currentTimeEstimate: PropTypes.string,
initialTimeEstimate: PropTypes.number,
submittedTime: PropTypes.number,
}

constructor (props) {
super(props)
const { initialTimeEstimate, submittedTime } = props
this.state = {
timeRemaining: calcTransactionTimeRemaining(initialTimeEstimate, submittedTime),
}
this.interval = setInterval(
() => this.setState({ timeRemaining: calcTransactionTimeRemaining(initialTimeEstimate, submittedTime) }),
1000
)
}

componentDidUpdate (prevProps) {
const { initialTimeEstimate, submittedTime } = this.props
if (initialTimeEstimate !== prevProps.initialTimeEstimate) {
clearInterval(this.interval)
const calcedTimeRemaining = calcTransactionTimeRemaining(initialTimeEstimate, submittedTime)
this.setState({ timeRemaining: calcedTimeRemaining })
this.interval = setInterval(
() => this.setState({ timeRemaining: calcTransactionTimeRemaining(initialTimeEstimate, submittedTime) }),
1000
)
}
}

componentWillUnmount () {
clearInterval(this.interval)
}

render () {
const { className, statusKey } = this.props
const { className } = this.props
const { timeRemaining } = this.state

return (
<div className={className}>
{statusToTextHash[statusKey] === 'pending' ? this.props.currentTimeEstimate : null}
{ timeRemaining }
</div>

)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { connect } from 'react-redux'
import { withRouter } from 'react-router-dom'
import { compose } from 'recompose'
import TransactionTimeRemaining from './transaction-time-remaining.component'
import {
getTxParams,
} from '../../../selectors/transactions'
import {
getEstimatedGasPrices,
getEstimatedGasTimes,
} from '../../../selectors/custom-gas'
import { getRawTimeEstimateData } from '../../../helpers/utils/gas-time-estimates.util'
import { hexWEIToDecGWEI } from '../../../helpers/utils/conversions.util'

const mapStateToProps = (state, ownProps) => {
const { transaction } = ownProps
const { gasPrice: currentGasPrice } = getTxParams(state, transaction)
const customGasPrice = calcCustomGasPrice(currentGasPrice)
const gasPrices = getEstimatedGasPrices(state)
const estimatedTimes = getEstimatedGasTimes(state)
console.log('customGasPrice, gasPrices, estimatedTimes', customGasPrice, gasPrices, estimatedTimes)
Gudahtt marked this conversation as resolved.
Show resolved Hide resolved
const {
newTimeEstimate: initialTimeEstimate,
} = getRawTimeEstimateData(customGasPrice, gasPrices, estimatedTimes)

const submittedTime = transaction.submittedTime

return {
initialTimeEstimate,
submittedTime,
}
}

export default compose(
withRouter,
connect(mapStateToProps)
)(TransactionTimeRemaining)

function calcCustomGasPrice (customGasPriceInHex) {
return Number(hexWEIToDecGWEI(customGasPriceInHex))
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { formatTimeEstimate } from '../../../helpers/utils/gas-time-estimates.util'

export function calcTransactionTimeRemaining (initialTimeEstimate, submittedTime) {
const currentTime = (new Date()).getTime()
const timeElapsedSinceSubmission = (currentTime - submittedTime) / 1000
const timeRemainingOnEstimate = initialTimeEstimate - timeElapsedSinceSubmission
console.log('timeRemainingOnEstimate', timeRemainingOnEstimate)
Gudahtt marked this conversation as resolved.
Show resolved Hide resolved
const renderingTimeRemainingEstimate = timeRemainingOnEstimate < 30
? '< 30 s'
: formatTimeEstimate(timeRemainingOnEstimate)

return renderingTimeRemainingEstimate
}
16 changes: 15 additions & 1 deletion ui/app/helpers/utils/gas-time-estimates.util.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ export function formatTimeEstimate (totalSeconds, greaterThanMax, lessThanMin) {
return formattedCombined
}

export function getRenderableTimeEstimate (currentGasPrice, gasPrices, estimatedTimes) {
export function getRawTimeEstimateData (currentGasPrice, gasPrices, estimatedTimes) {
const minGasPrice = gasPrices[0]
const maxGasPrice = gasPrices[gasPrices.length - 1]
let priceForEstimation = currentGasPrice
Expand All @@ -81,5 +81,19 @@ export function getRenderableTimeEstimate (currentGasPrice, gasPrices, estimated
xForExtrapolation: priceForEstimation,
})

return {
newTimeEstimate,
minGasPrice,
maxGasPrice,
}
}

export function getRenderableTimeEstimate (currentGasPrice, gasPrices, estimatedTimes) {
const {
newTimeEstimate,
minGasPrice,
maxGasPrice,
} = getRawTimeEstimateData(currentGasPrice, gasPrices, estimatedTimes)

return formatTimeEstimate(newTimeEstimate, currentGasPrice > maxGasPrice, currentGasPrice < minGasPrice)
}