Merge pull request #285 from gnosis/feature/208-pending-transactions

Feature #208: Show pending state for newly created transactions
This commit is contained in:
Mikhail Mikheev 2019-11-21 13:20:07 +04:00 committed by GitHub
commit 1021790f8d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 28 additions and 9 deletions

View File

@ -1,6 +1,7 @@
// @flow
import * as React from 'react'
import { withStyles } from '@material-ui/core/styles'
import CircularProgress from '@material-ui/core/CircularProgress'
import Block from '~/components/layout/Block'
import Paragraph from '~/components/layout/Paragraph/'
import Img from '~/components/layout/Img'
@ -20,6 +21,7 @@ const statusToIcon = {
cancelled: ErrorIcon,
awaiting_confirmations: AwaitingIcon,
awaiting_execution: AwaitingIcon,
pending: <CircularProgress size={14} />,
}
const statusToLabel = {
@ -27,6 +29,7 @@ const statusToLabel = {
cancelled: 'Cancelled',
awaiting_confirmations: 'Awaiting',
awaiting_execution: 'Awaiting',
pending: 'Pending',
}
const statusIconStyle = {
@ -34,11 +37,21 @@ const statusIconStyle = {
width: '14px',
}
const Status = ({ classes, status }: Props) => (
const Status = ({ classes, status }: Props) => {
const Icon = statusToIcon[status]
return (
<Block className={`${classes.container} ${classes[status]}`}>
<Img src={statusToIcon[status]} alt="OK Icon" style={statusIconStyle} />
<Paragraph noMargin className={classes.statusText}>{statusToLabel[status]}</Paragraph>
{typeof Icon === 'object' ? (
Icon
) : (
<Img src={Icon} alt="OK Icon" style={statusIconStyle} />
)}
<Paragraph noMargin className={classes.statusText}>
{statusToLabel[status]}
</Paragraph>
</Block>
)
}
export default withStyles(styles)(Status)

View File

@ -29,6 +29,10 @@ export const styles = () => ({
backgroundColor: '#dfebff',
color: disabled,
},
pending: {
backgroundColor: '#fff3e2',
color: '#e8673c',
},
statusText: {
marginLeft: 'auto',
textTransform: 'uppercase',

View File

@ -41,6 +41,8 @@ const getTxStatus = (tx: Transaction, safe: Safe): TransactionStatus => {
txStatus = 'cancelled'
} else if (tx.confirmations.size === safe.threshold) {
txStatus = 'awaiting_execution'
} else if (!tx.confirmations.size) {
txStatus = 'pending'
}
return txStatus

View File

@ -85,6 +85,7 @@ const createTransaction = (
from,
isExecution ? TX_TYPE_EXECUTION : TX_TYPE_CONFIRMATION,
)
dispatch(fetchTransactions(safeAddress))
} catch (err) {
console.error(err)
}

View File

@ -121,6 +121,7 @@ const processTransaction = (
from,
shouldExecute ? TX_TYPE_EXECUTION : TX_TYPE_CONFIRMATION,
)
dispatch(fetchTransactions(safeAddress))
} catch (err) {
console.error(err)
}

View File

@ -3,10 +3,9 @@ import { List, Record } from 'immutable'
import type { RecordFactory, RecordOf } from 'immutable'
import { type Confirmation } from '~/routes/safe/store/models/confirmation'
export type TransactionStatus = 'awaiting_confirmations' | 'success' | 'cancelled' | 'awaiting_execution'
export type TransactionStatus = 'awaiting_confirmations' | 'success' | 'cancelled' | 'awaiting_execution' | 'pending'
export type TransactionProps = {
name: string,
nonce: number,
value: string,
confirmations: List<Confirmation>,
@ -29,7 +28,6 @@ export type TransactionProps = {
}
export const makeTransaction: RecordFactory<TransactionProps> = Record({
name: '',
nonce: 0,
value: 0,
confirmations: List([]),