From 9dd26bbac90d6c6428aba21d1ea7c641e59b07fa Mon Sep 17 00:00:00 2001 From: fernandomg Date: Wed, 10 Feb 2021 16:18:35 -0300 Subject: [PATCH 01/23] triggering hooks From 4b089f349053bd7ed9b964494318c81cb42b2952 Mon Sep 17 00:00:00 2001 From: nicolas Date: Wed, 10 Feb 2021 16:39:18 -0300 Subject: [PATCH 02/23] Add relative time in queue lists (#1878) * Add relative time in queue lists * Add all date-fns functions to src/utils/date Co-authored-by: Daniel Sanchez --- .../GatewayTransactions/HistoryTxList.tsx | 4 ++-- .../Transactions/GatewayTransactions/TxCollapsed.tsx | 9 ++++++--- .../GatewayTransactions/TxInfoCreation.tsx | 3 ++- .../Transactions/GatewayTransactions/TxSummary.tsx | 3 ++- .../Transactions/GatewayTransactions/styled.tsx | 2 +- .../Transactions/GatewayTransactions/utils.ts | 5 ----- src/utils/date.ts | 12 +++++++++++- 7 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/routes/safe/components/Transactions/GatewayTransactions/HistoryTxList.tsx b/src/routes/safe/components/Transactions/GatewayTransactions/HistoryTxList.tsx index 6151f96c..4b2ee88c 100644 --- a/src/routes/safe/components/Transactions/GatewayTransactions/HistoryTxList.tsx +++ b/src/routes/safe/components/Transactions/GatewayTransactions/HistoryTxList.tsx @@ -1,5 +1,4 @@ import { Loader } from '@gnosis.pm/safe-react-components' -import { format } from 'date-fns' import React, { ReactElement } from 'react' import { InfiniteScroll, SCROLLABLE_TARGET_ID } from 'src/components/InfiniteScroll' @@ -13,6 +12,7 @@ import { } from './styled' import { TxHistoryRow } from './TxHistoryRow' import { TxLocationContext } from './TxLocationProvider' +import { formatWithSchema } from 'src/utils/date' export const HistoryTxList = (): ReactElement => { const { count, hasMore, next, transactions } = usePagedHistoryTransactions() @@ -31,7 +31,7 @@ export const HistoryTxList = (): ReactElement => { {transactions?.map(([timestamp, txs]) => ( - {format(Number(timestamp), 'MMM d, yyyy')} + {formatWithSchema(Number(timestamp), 'MMM d, yyyy')} {txs.map((transaction) => ( diff --git a/src/routes/safe/components/Transactions/GatewayTransactions/TxCollapsed.tsx b/src/routes/safe/components/Transactions/GatewayTransactions/TxCollapsed.tsx index c9ce1b0c..6f8ea2ca 100644 --- a/src/routes/safe/components/Transactions/GatewayTransactions/TxCollapsed.tsx +++ b/src/routes/safe/components/Transactions/GatewayTransactions/TxCollapsed.tsx @@ -3,7 +3,7 @@ import { ThemeColors } from '@gnosis.pm/safe-react-components/dist/theme' import { Tooltip } from '@material-ui/core' import CircularProgress from '@material-ui/core/CircularProgress' import { createStyles, makeStyles } from '@material-ui/core/styles' -import React, { ReactElement, useRef } from 'react' +import React, { ReactElement, useContext, useRef } from 'react' import CustomIconText from 'src/components/CustomIconText' import { @@ -13,7 +13,7 @@ import { Transaction, } from 'src/logic/safe/store/models/types/gateway.d' import { TxCollapsedActions } from 'src/routes/safe/components/Transactions/GatewayTransactions/TxCollapsedActions' -import { formatDateTime, formatTime } from 'src/routes/safe/components/Transactions/GatewayTransactions/utils' +import { formatDateTime, formatTime, formatTimeInWords } from 'src/utils/date' import { KNOWN_MODULES } from 'src/utils/constants' import styled from 'styled-components' import { AssetInfo, isTokenTransferAsset } from './hooks/useAssetInfo' @@ -22,6 +22,7 @@ import { TransactionStatusProps } from './hooks/useTransactionStatus' import { TxTypeProps } from './hooks/useTransactionType' import { StyledGroupedTransactions, StyledTransaction } from './styled' import { TokenTransferAmount } from './TokenTransferAmount' +import { TxLocationContext } from './TxLocationProvider' import { CalculatedVotes } from './TxQueueCollapsed' const TxInfo = ({ info }: { info: AssetInfo }) => { @@ -126,6 +127,8 @@ export const TxCollapsed = ({ actions, status, }: TxCollapsedProps): ReactElement => { + const { txLocation } = useContext(TxLocationContext) + const willBeReplaced = transaction?.txStatus === 'WILL_BE_REPLACED' ? ' will-be-replaced' : '' const txCollapsedNonce = ( @@ -149,7 +152,7 @@ export const TxCollapsed = ({
- {formatTime(time)} + {txLocation === 'history' ? formatTime(time) : formatTimeInWords(time)}
diff --git a/src/routes/safe/components/Transactions/GatewayTransactions/TxInfoCreation.tsx b/src/routes/safe/components/Transactions/GatewayTransactions/TxInfoCreation.tsx index 68f4b0fd..85c066a9 100644 --- a/src/routes/safe/components/Transactions/GatewayTransactions/TxInfoCreation.tsx +++ b/src/routes/safe/components/Transactions/GatewayTransactions/TxInfoCreation.tsx @@ -2,8 +2,9 @@ import { Text } from '@gnosis.pm/safe-react-components' import React, { ReactElement } from 'react' import { getExplorerInfo } from 'src/config' +import { formatDateTime } from 'src/utils/date' import { Creation, Transaction } from 'src/logic/safe/store/models/types/gateway.d' -import { formatDateTime, NOT_AVAILABLE } from './utils' +import { NOT_AVAILABLE } from './utils' import { InlineEthHashInfo, TxDetailsContainer } from './styled' export const TxInfoCreation = ({ transaction }: { transaction: Transaction }): ReactElement | null => { diff --git a/src/routes/safe/components/Transactions/GatewayTransactions/TxSummary.tsx b/src/routes/safe/components/Transactions/GatewayTransactions/TxSummary.tsx index b0d81c82..84fb6cc7 100644 --- a/src/routes/safe/components/Transactions/GatewayTransactions/TxSummary.tsx +++ b/src/routes/safe/components/Transactions/GatewayTransactions/TxSummary.tsx @@ -2,9 +2,10 @@ import { Text } from '@gnosis.pm/safe-react-components' import React, { ReactElement } from 'react' import { getExplorerInfo } from 'src/config' +import { formatDateTime } from 'src/utils/date' import { ExpandedTxDetails, isMultiSigExecutionDetails, Operation } from 'src/logic/safe/store/models/types/gateway.d' import { InlineEthHashInfo } from './styled' -import { formatDateTime, NOT_AVAILABLE } from './utils' +import { NOT_AVAILABLE } from './utils' export const TxSummary = ({ txDetails }: { txDetails: ExpandedTxDetails }): ReactElement => { const { txHash, detailedExecutionInfo, executedAt, txData } = txDetails diff --git a/src/routes/safe/components/Transactions/GatewayTransactions/styled.tsx b/src/routes/safe/components/Transactions/GatewayTransactions/styled.tsx index 15767db3..a6ca9337 100644 --- a/src/routes/safe/components/Transactions/GatewayTransactions/styled.tsx +++ b/src/routes/safe/components/Transactions/GatewayTransactions/styled.tsx @@ -142,7 +142,7 @@ const gridColumns = { nonce: '0.75fr', type: '3fr', info: '3fr', - time: '1.5fr', + time: '2fr', votes: '1.5fr', actions: '1fr', status: '3fr', diff --git a/src/routes/safe/components/Transactions/GatewayTransactions/utils.ts b/src/routes/safe/components/Transactions/GatewayTransactions/utils.ts index ac3f4b2c..7bd9a5d9 100644 --- a/src/routes/safe/components/Transactions/GatewayTransactions/utils.ts +++ b/src/routes/safe/components/Transactions/GatewayTransactions/utils.ts @@ -1,5 +1,4 @@ import { BigNumber } from 'bignumber.js' -import format from 'date-fns/format' import { getNetworkInfo } from 'src/config' import { @@ -25,10 +24,6 @@ export const TX_TABLE_RAW_TX_ID = 'tx' export const TX_TABLE_RAW_CANCEL_TX_ID = 'cancelTx' export const TX_TABLE_EXPAND_ICON = 'expand' -export const formatTime = (timestamp: number): string => format(timestamp, 'h:mm a') - -export const formatDateTime = (timestamp: number): string => format(timestamp, 'MMM d, yyyy - h:mm:ss a') - export const NOT_AVAILABLE = 'n/a' interface AmountData { diff --git a/src/utils/date.ts b/src/utils/date.ts index 4e531138..087b8752 100644 --- a/src/utils/date.ts +++ b/src/utils/date.ts @@ -1,4 +1,6 @@ -import { formatRelative } from 'date-fns' +import format from 'date-fns/format' +import formatRelative from 'date-fns/formatRelative' +import formatDistanceToNow from 'date-fns/formatDistanceToNow' export const relativeTime = (baseTimeMin: string, resetTimeMin: string): string => { if (resetTimeMin === '0') { @@ -17,3 +19,11 @@ export const getUTCStartOfDate = (timestamp: number): number => { return Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 0, 0, 0, 0) } + +export const formatWithSchema = (timestamp: number, schema: string): string => format(timestamp, schema) + +export const formatTime = (timestamp: number): string => formatWithSchema(timestamp, 'h:mm a') + +export const formatDateTime = (timestamp: number): string => formatWithSchema(timestamp, 'MMM d, yyyy - h:mm:ss a') + +export const formatTimeInWords = (timestamp: number): string => formatDistanceToNow(timestamp, { addSuffix: true }) From 47762701e1603a230383005ba0cd46a0895d24d2 Mon Sep 17 00:00:00 2001 From: Fernando Date: Wed, 10 Feb 2021 16:47:02 -0300 Subject: [PATCH 03/23] Fix dark block for tx details with empty 2nd row (#1880) --- .../safe/components/Transactions/GatewayTransactions/styled.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/safe/components/Transactions/GatewayTransactions/styled.tsx b/src/routes/safe/components/Transactions/GatewayTransactions/styled.tsx index a6ca9337..ba824e75 100644 --- a/src/routes/safe/components/Transactions/GatewayTransactions/styled.tsx +++ b/src/routes/safe/components/Transactions/GatewayTransactions/styled.tsx @@ -305,7 +305,7 @@ export const TxDetailsContainer = styled(WillBeReplaced)` display: grid; grid-template-columns: 1fr 1fr; grid-auto-rows: minmax(min-content, max-content); - grid-template-rows: [tx-summary] minmax(min-content, max-content) [tx-details] minmax(100px, 1fr); + grid-template-rows: [tx-summary] minmax(min-content, max-content) [tx-details] minmax(min-content, 1fr); row-gap: 2px; width: 100%; From 43287dd01835992a21d4f9deb0c2962d7e9e9926 Mon Sep 17 00:00:00 2001 From: Fernando Date: Thu, 11 Feb 2021 05:13:57 -0300 Subject: [PATCH 04/23] [Transaction List v2] - "Send to" action missing (#1879) * show missing `Send to`s sentences * remove "Send To", from 'spending limit' transactions details --- .../GatewayTransactions/MethodDetails.tsx | 26 ++-------- .../GatewayTransactions/TxData.tsx | 52 +++++++++++++++++-- 2 files changed, 51 insertions(+), 27 deletions(-) diff --git a/src/routes/safe/components/Transactions/GatewayTransactions/MethodDetails.tsx b/src/routes/safe/components/Transactions/GatewayTransactions/MethodDetails.tsx index 1552857c..d849aa8a 100644 --- a/src/routes/safe/components/Transactions/GatewayTransactions/MethodDetails.tsx +++ b/src/routes/safe/components/Transactions/GatewayTransactions/MethodDetails.tsx @@ -4,18 +4,8 @@ import styled from 'styled-components' import { DataDecoded } from 'src/logic/safe/store/models/types/gateway.d' import { isArrayParameter } from 'src/routes/safe/components/Balances/SendModal/screens/ContractInteraction/utils' -import { - DeleteSpendingLimitDetails, - isDeleteAllowance, - isSetAllowance, - ModifySpendingLimitDetails, -} from 'src/routes/safe/components/Transactions/GatewayTransactions/SpendingLimitDetails' import Value from 'src/routes/safe/components/Transactions/TxsTable/ExpandedTx/TxDescription/Value' -const TxDetailsMethodName = styled(Text)` - text-indent: 4px; -` - const TxDetailsMethodParam = styled.div<{ isArrayParameter: boolean }>` padding-left: 24px; display: ${({ isArrayParameter }) => (isArrayParameter ? 'block' : 'flex')}; @@ -27,7 +17,7 @@ const TxDetailsMethodParam = styled.div<{ isArrayParameter: boolean }>` ` const TxInfo = styled.div` - padding: 8px 8px 8px 16px; + padding: 8px 0; ` const StyledMethodName = styled(Text)` @@ -35,21 +25,11 @@ const StyledMethodName = styled(Text)` ` export const MethodDetails = ({ data }: { data: DataDecoded }): React.ReactElement => { - // FixMe: this way won't scale well - if (isSetAllowance(data.method)) { - return - } - - // FixMe: this way won't scale well - if (isDeleteAllowance(data.method)) { - return - } - return ( - + {data.method} - + {data.parameters?.map((param, index) => ( diff --git a/src/routes/safe/components/Transactions/GatewayTransactions/TxData.tsx b/src/routes/safe/components/Transactions/GatewayTransactions/TxData.tsx index bf777dcf..060cb6a9 100644 --- a/src/routes/safe/components/Transactions/GatewayTransactions/TxData.tsx +++ b/src/routes/safe/components/Transactions/GatewayTransactions/TxData.tsx @@ -1,11 +1,37 @@ -import React, { ReactElement } from 'react' +import React, { ReactElement, ReactNode } from 'react' -import { ExpandedTxDetails } from 'src/logic/safe/store/models/types/gateway.d' +import { getNetworkInfo } from 'src/config' +import { ExpandedTxDetails, TransactionData } from 'src/logic/safe/store/models/types/gateway.d' +import { fromTokenUnit } from 'src/logic/tokens/utils/humanReadableValue' +import { + DeleteSpendingLimitDetails, + isDeleteAllowance, + isSetAllowance, + ModifySpendingLimitDetails, +} from './SpendingLimitDetails' +import { TxInfoDetails } from './TxInfoDetails' import { sameString } from 'src/utils/strings' import { HexEncodedData } from './HexEncodedData' import { MethodDetails } from './MethodDetails' import { MultiSendDetails } from './MultiSendDetails' +const { nativeCoin } = getNetworkInfo() + +type DetailsWithTxInfoProps = { + children: ReactNode + txData: TransactionData +} + +const DetailsWithTxInfo = ({ children, txData }: DetailsWithTxInfoProps): ReactElement => ( + <> + + {children} + +) + type TxDataProps = { txData: ExpandedTxDetails['txData'] } @@ -24,7 +50,11 @@ export const TxData = ({ txData }: TxDataProps): ReactElement | null => { } // we render the hex encoded data - return + return ( + + + + ) } // known data and particularly `multiSend` data type @@ -32,6 +62,20 @@ export const TxData = ({ txData }: TxDataProps): ReactElement | null => { return } + // FixMe: this way won't scale well + if (isSetAllowance(txData.dataDecoded.method)) { + return + } + + // FixMe: this way won't scale well + if (isDeleteAllowance(txData.dataDecoded.method)) { + return + } + // we render the decoded data - return + return ( + + + + ) } From e9bc89488f64386840e52dd56206710af7a15270 Mon Sep 17 00:00:00 2001 From: Fernando Date: Thu, 11 Feb 2021 05:17:56 -0300 Subject: [PATCH 05/23] Group transactions by locale TZ (#1883) --- src/logic/safe/store/reducer/gatewayTransactions.ts | 4 ++-- src/utils/date.ts | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/logic/safe/store/reducer/gatewayTransactions.ts b/src/logic/safe/store/reducer/gatewayTransactions.ts index 8037fa90..df347f4c 100644 --- a/src/logic/safe/store/reducer/gatewayTransactions.ts +++ b/src/logic/safe/store/reducer/gatewayTransactions.ts @@ -22,7 +22,7 @@ import { import { UPDATE_TRANSACTION_DETAILS } from 'src/logic/safe/store/actions/fetchTransactionDetails' import { AppReduxState } from 'src/store' -import { getUTCStartOfDate } from 'src/utils/date' +import { getLocalStartOfDate } from 'src/utils/date' import { sameString } from 'src/utils/strings' import { sortObject } from 'src/utils/objects' @@ -78,7 +78,7 @@ export const gatewayTransactions = handleActions { return Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 0, 0, 0, 0) } +export const getLocalStartOfDate = (timestamp: number): number => { + const date = new Date(timestamp) + + return date.setHours(0, 0, 0, 0) +} + export const formatWithSchema = (timestamp: number, schema: string): string => format(timestamp, schema) export const formatTime = (timestamp: number): string => formatWithSchema(timestamp, 'h:mm a') From fa2262f8b0ec3efb5631bcd0e392aba3c979325f Mon Sep 17 00:00:00 2001 From: Fernando Date: Thu, 11 Feb 2021 05:21:37 -0300 Subject: [PATCH 06/23] [Transaction List v2] Action buttons tooltip (#1884) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix tooltip for action buttons * add margin botton to the tooltip Co-authored-by: Agustín Longoni --- .../TxCollapsedActions.tsx | 52 ++++++++++++------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/src/routes/safe/components/Transactions/GatewayTransactions/TxCollapsedActions.tsx b/src/routes/safe/components/Transactions/GatewayTransactions/TxCollapsedActions.tsx index 270878bf..19805222 100644 --- a/src/routes/safe/components/Transactions/GatewayTransactions/TxCollapsedActions.tsx +++ b/src/routes/safe/components/Transactions/GatewayTransactions/TxCollapsedActions.tsx @@ -1,11 +1,26 @@ -import { Icon } from '@gnosis.pm/safe-react-components' +import { Icon, theme } from '@gnosis.pm/safe-react-components' +import { Tooltip as TooltipMui } from '@material-ui/core' import { default as MuiIconButton } from '@material-ui/core/IconButton' +import { withStyles } from '@material-ui/core/styles' import React, { ReactElement } from 'react' import styled from 'styled-components' import { Transaction } from 'src/logic/safe/store/models/types/gateway.d' import { useActionButtonsHandlers } from './hooks/useActionButtonsHandlers' +const Tooltip = withStyles(() => ({ + popper: { + zIndex: 2001, + }, + tooltip: { + marginBottom: '4px', + backgroundColor: theme.colors.overlay.color, + border: `1px solid ${theme.colors.icon}`, + boxShadow: `1px 2px 4px ${theme.colors.shadow.color}14`, + color: theme.colors.text, + }, +}))(TooltipMui) + const IconButton = styled(MuiIconButton)` padding: 8px !important; @@ -32,26 +47,25 @@ export const TxCollapsedActions = ({ transaction }: TxCollapsedActionsProps): Re return ( <> { - - - + + + + + } {canCancel && ( - - - + + + + + )} ) From 1994f6282705aaf0e5b5ba36baa5ee45f8377e3b Mon Sep 17 00:00:00 2001 From: Fernando Date: Thu, 11 Feb 2021 05:22:27 -0300 Subject: [PATCH 07/23] Avoid displaying `UNKNOWN` in owner's list (#1881) --- .../components/Transactions/GatewayTransactions/OwnerRow.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/safe/components/Transactions/GatewayTransactions/OwnerRow.tsx b/src/routes/safe/components/Transactions/GatewayTransactions/OwnerRow.tsx index 471a81c3..ebfca691 100644 --- a/src/routes/safe/components/Transactions/GatewayTransactions/OwnerRow.tsx +++ b/src/routes/safe/components/Transactions/GatewayTransactions/OwnerRow.tsx @@ -11,7 +11,7 @@ export const OwnerRow = ({ ownerAddress }: { ownerAddress: string }): ReactEleme return ( Date: Thu, 11 Feb 2021 05:31:08 -0300 Subject: [PATCH 08/23] Remove curried function from within `useCallback` hook (#1882) --- .../GatewayTransactions/hooks/useActionButtonsHandlers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/safe/components/Transactions/GatewayTransactions/hooks/useActionButtonsHandlers.ts b/src/routes/safe/components/Transactions/GatewayTransactions/hooks/useActionButtonsHandlers.ts index db5399cf..3921d215 100644 --- a/src/routes/safe/components/Transactions/GatewayTransactions/hooks/useActionButtonsHandlers.ts +++ b/src/routes/safe/components/Transactions/GatewayTransactions/hooks/useActionButtonsHandlers.ts @@ -62,7 +62,7 @@ export const useActionButtonsHandlers = (transaction: Transaction): ActionButton const isPending = useMemo(() => !!transaction.txStatus.match(/^PENDING.*/), [transaction.txStatus]) - const signaturePending = useCallback(addressInList(transaction.executionInfo?.missingSigners), []) + const signaturePending = addressInList(transaction.executionInfo?.missingSigners) const disabledActions = useMemo( () => From 64defa776acfe0424c7560819ed04c12fca57743 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agust=C3=ADn=20Longoni?= Date: Thu, 11 Feb 2021 15:07:49 -0300 Subject: [PATCH 09/23] fix tree align and paddings --- .../Transactions/GatewayTransactions/styled.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/routes/safe/components/Transactions/GatewayTransactions/styled.tsx b/src/routes/safe/components/Transactions/GatewayTransactions/styled.tsx index ba824e75..755d7dd7 100644 --- a/src/routes/safe/components/Transactions/GatewayTransactions/styled.tsx +++ b/src/routes/safe/components/Transactions/GatewayTransactions/styled.tsx @@ -139,7 +139,7 @@ export const GroupedTransactionsCard = styled(StyledTransactions)` } ` const gridColumns = { - nonce: '0.75fr', + nonce: '0.5fr', type: '3fr', info: '3fr', time: '2fr', @@ -208,7 +208,7 @@ export const GroupedTransactions = styled(StyledTransaction)` // builds the tree-view layout .tree-lines { height: 100%; - margin-left: 50%; + margin-left: 30px; position: relative; width: 30%; @@ -286,8 +286,8 @@ export const DisclaimerContainer = styled(StyledTransaction)` background-color: ${({ theme }) => theme.colors.inputField} !important; border-radius: 4px; margin: 12px 8px 0 12px; - padding: 8px; - width: calc(100% - 40px); + padding: 8px 12px; + width: calc(100% - 48px); .nonce { grid-column-start: 1; From 7a550e3ed3e13e3e3c8fb883c6e08c9438b3dd00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agust=C3=ADn=20Longoni?= Date: Thu, 11 Feb 2021 15:08:32 -0300 Subject: [PATCH 10/23] fix Advanced option style on reject modal --- .../GatewayTransactions/modals/RejectTxModal.tsx | 10 ++++++---- .../Transactions/GatewayTransactions/modals/style.ts | 6 +++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/routes/safe/components/Transactions/GatewayTransactions/modals/RejectTxModal.tsx b/src/routes/safe/components/Transactions/GatewayTransactions/modals/RejectTxModal.tsx index 571c0678..97637461 100644 --- a/src/routes/safe/components/Transactions/GatewayTransactions/modals/RejectTxModal.tsx +++ b/src/routes/safe/components/Transactions/GatewayTransactions/modals/RejectTxModal.tsx @@ -117,12 +117,14 @@ export const RejectTxModal = ({ isOpen, onClose, gwTransaction }: Props): React. - + + + {txEstimationExecutionStatus === EstimationStatus.LOADING ? null : ( + - - + + )}