From 0da409cd12990c018ad1ce8090d0bd6156a3e9aa Mon Sep 17 00:00:00 2001 From: James Prado Date: Tue, 6 Feb 2018 23:39:24 -0500 Subject: [PATCH] Confirm TX Modal Upgrades (#928) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Wipe tx modal clean & Update the subcomponents * Add Amounts & Address styles * Forgot to pass onlyIncludeLoader to GasLimitLoading component * Add currency conversion * Update styles * Change SENDModal_Yes & _No messages * Add visual summary * Update fonts & add Roboto Mono * Add details to tx-modal * Display contract addr when sending tokens * Add inline styles back to identicon (for paper wallet) * Remove inline styles * Update USD conversion conditions * Display token to usd conversion * Update styles * Update modal styles * Animate modals * Add a fade effect when modal overflows * Improve styles for mobile * Remove dead code * Update unlockHeader close button * Update text overflow fade styles * Fix invalid inline css prop * Fix issue with 'isToken' condition * Add table layout & update styles * Remove unsupported styles * Remove formatting diff * update styles * Update tx modal fixes (#999) * chore(package): update @types/lodash to version 4.14.101 (#992) * ENS Resolving (#942) * Refactor BaseNode to be an interface INode * Initial contract commit * Remove redundant fallback ABI function * First working iteration of Contract generator to be used in ENS branch * Hide abi to clean up logging output * Strip 0x prefix from output decode * Handle unnamed output params * Implement ability to supply output mappings to ABI functions * Fix null case in outputMapping * Add flow typing * Add .call method to functions * Partial commit for type refactor * Temp contract type fix -- waiting for NPM modularization * Remove empty files * Cleanup contract * Add call request to node interface * Fix output mapping types * Revert destructuring overboard * Add sendCallRequest to rpcNode class and add typing * Use enum for selecting ABI methods * Add transaction capability to contracts * Cleanup privaite/public members * Remove broadcasting step from a contract transaction * Cleanup uneeded types * Refactor ens-base to typescript and add typings for ENS smart contracts * Migrate ens-name-search to TS * Add IResolveDomainRequest * Fix rest of TSC errors * Add definition file for bn.js * Remove types-bn * Fix some typings * make isBN a static property * progress commit -- swap out bignumber.js for bn.js * Swap out bignumber for bn in vendor * Change modn to number return * Start to strip out units lib for a string manipulation based lib * Convert codebase to only base units * Get rid of useless component * Handle only wei in values * Use unit conversion in sidebar * Automatically strip hex prefix, and handle decimal edge case * Handle base 16 wei in transactions * Make a render callback component for dealing with unit conversion * Switch contracts to use bn.js, and get transaction values from signedTx instead of state * Get send transaction working with bn.js * Remove redundant hex stripping, return base value of tokens * Cleanup unit file * Re-implement toFixed for strings * Use formatNumber in codebase * Cleanup code * Undo package test changes * Update snapshot and remove console logs * Use TokenValue / Wei more consistently where applicable * Add typing to deterministicWallets, fix confirmation modal, make UnitDisplay more flexible * Split different ENS modes into their own components * Fix Abi typedef * Remove redundant moment type package * Add Aux helper component * Split out resolve components * Make 'to' parameter optional * Change import type * Change typing to be base domain request * Split handling of resolving into object handler * Fix countdown component * Adjust element spacing * Implement reveal search functionality * Add unit display for highest bidder * Fill out forbidden/NYA modes * ENS wallet component skeleton * Clean up prop handling in UnitDisplay * Change instanceof to typeof check, change boolean of displayBalance * Add ENS wallet component * Cleanup spacing * Convert ConfModal for bidding in ENS * Make ui component for placing bids * Fix destructure in placeBid * Pass through entire wallet * Remove text center * Display inline notification ENS isValid & add some ENS tests * Add export of Aux * Reformat with prettier * progress... * Add ENSUnlockLayout * Add RevealBid component * organize NameResolve components * Merge ENS with transaction-refactor changes * Fix address resolution * Update styles * convert ens name to lowercase before checking * Add overflow-y:scroll to table * update ens snapshots & tests * cast 'undefined' state argument as any for testing * clean up components * Connect unitconverter to redux state * remove unnecessary type assertion * fix spinner size * remove old bidmodal * validate bidmask before opening modal * progress... * Update styles * Add saga / actions for placing a bid * Update types & clean up dead code * Delete old test * Dispatch PlaceBidRequested acitons * Progress commit -- get ENS bidding ready for tx generation via sagas * Seperate ENS action creators and types * Add reducer & actions for ENS fields * Add preliminary sagas for bid mask and bid value * Fix ts errors * Get bidding fields connected with some validation * Clean up generate bid * Hook up generate bid to redux state * Get bid data generation working * Add support for bidding on already open auctions * Move bid generation states to redux, improve default field values * Remove generate bid component * Throttle bid generation * Progress commit -- Bid Modal * Hook bidmodal component up to bidding component * Update template modal to handle custom confirm behavior * Remove old redux bidding actions, add new one for downloaded bids * Save downloaded bids to local storage * Finish bidding modal * Fix gas estimation bug * Fix typing * Remove bidding related functionality * Get passing unit tests * Make previous test more comprehensive * Fix ts errors * Remove commented code * Fix invalid return * Remove implementation of revealing bid * Update snapshot * Fix tests * Delegate bidding to V3 * Update react-markdown to the latest version 🚀 (#986) * fix(package): update react-markdown to version 3.1.5 * Fix tsc errors, match original behaviour of V2 as closely as possible * Add tooltip to gas slider (#997) * Prevent invalid gas price states (#996) * Slider using value instead of raw to prevent errors. Dont show empty gas price as invalid. Clamp slider values to min / max on mount. * Remove gas price from local storage. * Update @types/react to the latest version 🚀 (#912) * chore(package): update @types/react to version 16.0.35 * Add stricter typing via function overloads * Fix rest of aria translations * Make implementation of confirmation modal template * Address github comments for #928 * Make modal state setting more explicit * Fix infinite loop of state setting on modal * Fix transaction rebroadcasting for modal display --- common/assets/fonts/Roboto-Mono-Light.woff | Bin 0 -> 19884 bytes common/assets/fonts/Roboto-Mono-Light.woff2 | Bin 0 -> 16380 bytes common/assets/fonts/Roboto-Mono-Regular.woff | Bin 0 -> 19576 bytes common/assets/fonts/Roboto-Mono-Regular.woff2 | Bin 0 -> 16028 bytes common/assets/images/close.svg | 5 + common/assets/images/tail-triangle-down.svg | 1 + common/assets/styles/etherwallet-fonts.less | 23 ---- common/assets/styles/etherwallet-master.less | 11 +- .../assets/styles/etherwallet-variables.less | 36 +++--- .../ConfirmationModal/ConfirmationModal.tsx | 12 ++ .../ConfirmationModal/components/Amount.tsx | 48 -------- .../components/Body/Body.scss | 12 ++ .../components/Body/Body.tsx | 59 +++++++++ .../components/Body/components/Addresses.scss | 84 +++++++++++++ .../components/Body/components/Addresses.tsx | 80 ++++++++++++ .../components/Body/components/Amounts.scss | 48 ++++++++ .../components/Body/components/Amounts.tsx | 114 ++++++++++++++++++ .../components/Body/components/Details.scss | 21 ++++ .../components/Body/components/Details.tsx | 44 +++++++ .../{Details => Body/components}/Node.tsx | 0 .../components/Body/index.ts | 1 + .../components/Details/Addresses.tsx | 44 ------- .../AmountAndGasPrice/AmountAndGasPrice.tsx | 18 --- .../AmountAndGasPrice/components/GasPrice.tsx | 18 --- .../components/TransactionFee.tsx | 57 --------- .../AmountAndGasPrice/components/index.ts | 2 - .../Details/AmountAndGasPrice/index.ts | 1 - .../components/Details/Data.tsx | 44 ------- .../components/Details/Details.tsx | 16 --- .../components/Details/Nonce.tsx | 19 --- .../components/Details/index.ts | 1 - .../ConfirmationModal/components/From.tsx | 21 ---- .../components/Summary/Summary.tsx | 10 -- .../Summary/components/SummaryAmount.tsx | 11 -- .../Summary/components/SummaryFrom.tsx | 9 -- .../Summary/components/SummaryTo.tsx | 37 ------ .../components/Summary/components/index.ts | 3 - .../components/Summary/index.ts | 1 - .../ConfirmationModal/components/index.ts | 3 +- common/components/ConfirmationModal/index.ts | 1 + common/components/ConfirmationModal/index.tsx | 14 --- .../ConfirmationModalTemplate.tsx | 71 ++++------- common/components/GasLimitField.tsx | 4 +- common/components/PaperWallet/index.tsx | 2 +- .../SendButtonFactory/OnlineSend.tsx | 26 ++-- .../SendButtonFactory/SendButtonFactory.tsx | 1 + .../renderCbs/SerializedTransaction.ts | 17 ++- common/components/ui/Code.scss | 8 +- common/components/ui/Identicon.tsx | 56 +++++---- common/components/ui/Modal.scss | 113 ++++++++--------- common/components/ui/Modal.tsx | 51 +++++--- common/components/ui/UnitDisplay.tsx | 2 +- common/components/ui/UnlockHeader.scss | 15 ++- common/components/ui/UnlockHeader.tsx | 3 +- common/libs/transaction/utils/ether.ts | 3 +- common/sass/fonts.scss | 90 +++++++++++++- common/sass/fonts/social-media.scss | 50 -------- common/sass/styles/overrides.scss | 1 + common/sass/styles/overrides/buttons.scss | 15 +-- common/sass/styles/overrides/tables.scss | 3 + common/sass/styles/tab.scss | 6 +- common/sass/variables.scss | 43 ++++--- common/sass/variables/tables.scss | 4 +- common/sass/variables/typography.scss | 14 +-- common/selectors/rates.ts | 71 +++++++++++ common/selectors/transaction/meta.ts | 1 - common/selectors/transaction/sign.ts | 32 +++++ common/translations/lang/en.json | 4 +- 68 files changed, 942 insertions(+), 693 deletions(-) create mode 100644 common/assets/fonts/Roboto-Mono-Light.woff create mode 100644 common/assets/fonts/Roboto-Mono-Light.woff2 create mode 100644 common/assets/fonts/Roboto-Mono-Regular.woff create mode 100644 common/assets/fonts/Roboto-Mono-Regular.woff2 create mode 100644 common/assets/images/close.svg create mode 100644 common/assets/images/tail-triangle-down.svg delete mode 100755 common/assets/styles/etherwallet-fonts.less create mode 100644 common/components/ConfirmationModal/ConfirmationModal.tsx delete mode 100644 common/components/ConfirmationModal/components/Amount.tsx create mode 100644 common/components/ConfirmationModal/components/Body/Body.scss create mode 100644 common/components/ConfirmationModal/components/Body/Body.tsx create mode 100644 common/components/ConfirmationModal/components/Body/components/Addresses.scss create mode 100644 common/components/ConfirmationModal/components/Body/components/Addresses.tsx create mode 100644 common/components/ConfirmationModal/components/Body/components/Amounts.scss create mode 100644 common/components/ConfirmationModal/components/Body/components/Amounts.tsx create mode 100644 common/components/ConfirmationModal/components/Body/components/Details.scss create mode 100644 common/components/ConfirmationModal/components/Body/components/Details.tsx rename common/components/ConfirmationModal/components/{Details => Body/components}/Node.tsx (100%) create mode 100644 common/components/ConfirmationModal/components/Body/index.ts delete mode 100644 common/components/ConfirmationModal/components/Details/Addresses.tsx delete mode 100644 common/components/ConfirmationModal/components/Details/AmountAndGasPrice/AmountAndGasPrice.tsx delete mode 100644 common/components/ConfirmationModal/components/Details/AmountAndGasPrice/components/GasPrice.tsx delete mode 100644 common/components/ConfirmationModal/components/Details/AmountAndGasPrice/components/TransactionFee.tsx delete mode 100644 common/components/ConfirmationModal/components/Details/AmountAndGasPrice/components/index.ts delete mode 100644 common/components/ConfirmationModal/components/Details/AmountAndGasPrice/index.ts delete mode 100644 common/components/ConfirmationModal/components/Details/Data.tsx delete mode 100644 common/components/ConfirmationModal/components/Details/Details.tsx delete mode 100644 common/components/ConfirmationModal/components/Details/Nonce.tsx delete mode 100644 common/components/ConfirmationModal/components/Details/index.ts delete mode 100644 common/components/ConfirmationModal/components/From.tsx delete mode 100644 common/components/ConfirmationModal/components/Summary/Summary.tsx delete mode 100644 common/components/ConfirmationModal/components/Summary/components/SummaryAmount.tsx delete mode 100644 common/components/ConfirmationModal/components/Summary/components/SummaryFrom.tsx delete mode 100644 common/components/ConfirmationModal/components/Summary/components/SummaryTo.tsx delete mode 100644 common/components/ConfirmationModal/components/Summary/components/index.ts delete mode 100644 common/components/ConfirmationModal/components/Summary/index.ts create mode 100644 common/components/ConfirmationModal/index.ts delete mode 100644 common/components/ConfirmationModal/index.tsx delete mode 100644 common/sass/fonts/social-media.scss create mode 100644 common/sass/styles/overrides/tables.scss create mode 100644 common/selectors/rates.ts diff --git a/common/assets/fonts/Roboto-Mono-Light.woff b/common/assets/fonts/Roboto-Mono-Light.woff new file mode 100644 index 0000000000000000000000000000000000000000..68d8403e88d59e41d805707b8b5fcf26d9583a86 GIT binary patch literal 19884 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

%DgIE8iUkSu1!peT{& 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 F003|yGw%QZ literal 0 HcmV?d00001 diff --git a/common/assets/fonts/Roboto-Mono-Light.woff2 b/common/assets/fonts/Roboto-Mono-Light.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ab64df38068692559354127f118f756398365478 GIT binary patch literal 16380 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 KuCgQv0001YIy##G literal 0 HcmV?d00001 diff --git a/common/assets/fonts/Roboto-Mono-Regular.woff b/common/assets/fonts/Roboto-Mono-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..0ea5db896b1f6d60284c8dcecaef9f4f872151de GIT binary patch literal 19576 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 L0EMk7h5!HnfQj?9 literal 0 HcmV?d00001 diff --git a/common/assets/fonts/Roboto-Mono-Regular.woff2 b/common/assets/fonts/Roboto-Mono-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..6163de7b0ab1b46dfa01699d5d520fe2bf24980d GIT binary patch literal 16028 zcmV;NK4ZamPew8T0RR9106v@m4*&oF0D1HP06stf0RR9100000000000000000000 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 WRwDDpyt?1>|I0r2p_97nig5sB!Lbzp literal 0 HcmV?d00001 diff --git a/common/assets/images/close.svg b/common/assets/images/close.svg new file mode 100644 index 00000000..2805991d --- /dev/null +++ b/common/assets/images/close.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/common/assets/images/tail-triangle-down.svg b/common/assets/images/tail-triangle-down.svg new file mode 100644 index 00000000..f25df9b3 --- /dev/null +++ b/common/assets/images/tail-triangle-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/common/assets/styles/etherwallet-fonts.less b/common/assets/styles/etherwallet-fonts.less deleted file mode 100755 index 711faa4f..00000000 --- a/common/assets/styles/etherwallet-fonts.less +++ /dev/null @@ -1,23 +0,0 @@ -@font-face { - font-family: 'Lato'; - src: url('../fonts/Lato-Light.woff2') format('woff2'), - url('../fonts/Lato-Light.woff') format('woff'); - font-style: normal; - font-weight: 300; -} - -@font-face { - font-family: 'Lato'; - src: url('../fonts/Lato-Regular.woff2') format('woff2'), - url('../fonts/Lato-Regular.woff') format('woff'); - font-style: normal; - font-weight: 400; -} - -@font-face { - font-family: 'Lato'; - src: url('../fonts/Lato-Bold.woff2') format('woff2'), - url('../fonts/Lato-Bold.woff') format('woff'); - font-style: normal; - font-weight: 700; -} diff --git a/common/assets/styles/etherwallet-master.less b/common/assets/styles/etherwallet-master.less index 9fb6e6f4..b14dc323 100755 --- a/common/assets/styles/etherwallet-master.less +++ b/common/assets/styles/etherwallet-master.less @@ -1,8 +1,7 @@ -@import "etherwallet-variables.less"; -@import "etherwallet-fonts.less"; +@import 'etherwallet-variables.less'; // Core variables and mixins -@import "bootstrap/mixins.less"; +@import 'bootstrap/mixins.less'; // Utility classes -@import "etherwallet-custom.less"; -@import "etherwallet-ext-custom.less"; -@import "etherwallet-utilities.less"; +@import 'etherwallet-custom.less'; +@import 'etherwallet-ext-custom.less'; +@import 'etherwallet-utilities.less'; diff --git a/common/assets/styles/etherwallet-variables.less b/common/assets/styles/etherwallet-variables.less index b84cb556..569ba858 100755 --- a/common/assets/styles/etherwallet-variables.less +++ b/common/assets/styles/etherwallet-variables.less @@ -3,19 +3,19 @@ @ether-blue: #0e97c0; @space-xs: 0.25rem; -@space-sm: 0.50rem; +@space-sm: 0.5rem; @space-md: 0.75rem; -@space: 1.00rem; -@space-lg: 1.50rem; -@space-xl: 2.00rem; +@space: 1rem; +@space-lg: 1.5rem; +@space-xl: 2rem; @gray-base: #000; @gray-darker: lighten(@gray-base, 13.5%); @gray-dark: lighten(@gray-base, 20%); @gray: #737373; -@gray-light: #9A9A9A; -@gray-lighter: #ECECEC; -@gray-lightest: #FAFAFA; +@gray-light: #9a9a9a; +@gray-lighter: #ececec; +@gray-lightest: #fafafa; @brand-primary: @ether-blue; @brand-success: #5dba5a; @@ -34,8 +34,8 @@ // Typography @font-family-sans-serif: 'Lato', sans-serif; -@font-family-serif: Georgia, "Times New Roman", Times, serif; -@font-family-monospace: Menlo, Monaco, Consolas, "Courier New", monospace; +@font-family-serif: Georgia, 'Times New Roman', Times, serif; +@font-family-monospace: 'Roboto Mono', Menlo, Monaco, Consolas, 'Courier New', monospace; @font-family-base: @font-family-sans-serif; @base: 15; @@ -44,14 +44,14 @@ @font-size-pixels-sm: @base+px; // for small screens @font-size-large-bump: 2.25rem; // 33.75 -@font-size-large: 1.90rem; // 28.5 -@font-size-medium-bump: 1.50rem; // 22.5 -@font-size-medium: 1.30rem; // 19.5 +@font-size-large: 1.9rem; // 28.5 +@font-size-medium-bump: 1.5rem; // 22.5 +@font-size-medium: 1.3rem; // 19.5 @font-size-bump-more: 1.15rem; // 17.25 @font-size-bump: 1.07rem; // 16.05 -@font-size-base: 1.00rem; // 15 +@font-size-base: 1rem; // 15 @font-size-small: 0.92rem; // 13.8 -@font-size-xs: 0.80rem; // 12 +@font-size-xs: 0.8rem; // 12 @font-size-h1: @font-size-large-bump; @font-size-h2: @font-size-large; @@ -158,7 +158,7 @@ @cursor-disabled: default; @dropdown-bg: #fff; -@dropdown-border: rgba(0, 0, 0, .15); +@dropdown-border: rgba(0, 0, 0, 0.15); @dropdown-fallback-border: @gray-lighter; @dropdown-divider-bg: #e5e5e5; @@ -240,7 +240,7 @@ @tooltip-max-width: 200px; @tooltip-color: #fff; @tooltip-bg: #000; -@tooltip-opacity: .9; +@tooltip-opacity: 0.9; @tooltip-arrow-width: @space-sm; @tooltip-arrow-color: @tooltip-bg; @@ -261,11 +261,11 @@ @modal-title-line-height: @line-height-base; @modal-content-bg: #fff; -@modal-content-border-color: rgba(0, 0, 0, .2); +@modal-content-border-color: rgba(0, 0, 0, 0.2); @modal-content-fallback-border-color: #999; @modal-backdrop-bg: #000; -@modal-backdrop-opacity: .5; +@modal-backdrop-opacity: 0.5; @modal-header-border-color: #e5e5e5; @modal-footer-border-color: @modal-header-border-color; diff --git a/common/components/ConfirmationModal/ConfirmationModal.tsx b/common/components/ConfirmationModal/ConfirmationModal.tsx new file mode 100644 index 00000000..e151bebf --- /dev/null +++ b/common/components/ConfirmationModal/ConfirmationModal.tsx @@ -0,0 +1,12 @@ +import { Body } from './components'; +import { + ConfirmationModalTemplate, + OwnProps as TemplateProps +} from 'components/ConfirmationModalTemplate'; +import React from 'react'; +import { Omit } from 'react-redux'; +type Props = Omit; + +export const ConfirmationModal: React.SFC = props => ( + } {...props} /> +); diff --git a/common/components/ConfirmationModal/components/Amount.tsx b/common/components/ConfirmationModal/components/Amount.tsx deleted file mode 100644 index a02d6e72..00000000 --- a/common/components/ConfirmationModal/components/Amount.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { getTransactionFields, makeTransaction } from 'libs/transaction'; -import { SerializedTransaction } from 'components/renderCbs'; -import { UnitDisplay } from 'components/ui'; -import { Wei, TokenValue } from 'libs/units'; -import ERC20 from 'libs/erc20'; -import React, { Component } from 'react'; -import { connect } from 'react-redux'; -import { AppState } from 'reducers'; -import { getDecimal, getUnit } from 'selectors/transaction'; -import { getNetworkConfig } from 'selectors/config'; - -interface StateProps { - unit: string; - decimal: number; - network: AppState['config']['network']; -} - -class AmountClass extends Component { - public render() { - return ( - { - const transactionInstance = makeTransaction(serializedTransaction); - const { value, data } = getTransactionFields(transactionInstance); - const { decimal, unit, network } = this.props; - const isToken = unit !== 'ether'; - const handledValue = isToken - ? TokenValue(ERC20.transfer.decodeInput(data)._value) - : Wei(value); - return ( - - ); - }} - /> - ); - } -} - -export const Amount = connect((state: AppState) => ({ - decimal: getDecimal(state), - unit: getUnit(state), - network: getNetworkConfig(state) -}))(AmountClass); diff --git a/common/components/ConfirmationModal/components/Body/Body.scss b/common/components/ConfirmationModal/components/Body/Body.scss new file mode 100644 index 00000000..b9fa1500 --- /dev/null +++ b/common/components/ConfirmationModal/components/Body/Body.scss @@ -0,0 +1,12 @@ +@import 'common/sass/variables'; + +.tx-modal-body { + margin: auto; + max-width: 35rem; + width: 100%; +} + +.tx-modal-testnet-warn { + text-align: center; + margin: 0; +} diff --git a/common/components/ConfirmationModal/components/Body/Body.tsx b/common/components/ConfirmationModal/components/Body/Body.tsx new file mode 100644 index 00000000..ff25034a --- /dev/null +++ b/common/components/ConfirmationModal/components/Body/Body.tsx @@ -0,0 +1,59 @@ +import { Addresses } from './components/Addresses'; +import { Amounts } from './components/Amounts'; +import { Details } from './components/Details'; +import React from 'react'; +import { connect } from 'react-redux'; +import { AppState } from 'reducers'; +import './Body.scss'; +import { getNetworkConfig } from 'selectors/config'; + +interface State { + showDetails: boolean; +} + +interface StateProps { + network: AppState['config']['network']; +} + +class BodyClass extends React.Component { + public state: State = { + showDetails: false + }; + + public toggleDetails = () => { + this.setState({ + showDetails: !this.state.showDetails + }); + }; + + public render() { + const { showDetails } = this.state; + + return ( +

+ ); + } +} + +const mapStateToProps = (state: AppState): StateProps => { + return { + network: getNetworkConfig(state) + }; +}; + +export const Body = connect(mapStateToProps)(BodyClass); diff --git a/common/components/ConfirmationModal/components/Body/components/Addresses.scss b/common/components/ConfirmationModal/components/Body/components/Addresses.scss new file mode 100644 index 00000000..2ac509b1 --- /dev/null +++ b/common/components/ConfirmationModal/components/Body/components/Addresses.scss @@ -0,0 +1,84 @@ +@import 'common/sass/variables'; + +.tx-modal-address { + display: flex; + flex-direction: column; + margin: auto; + padding: 1rem 0; + align-items: center; + .Identicon { + margin-right: 1rem; + } + &-from, + &-tkn-contract, + &-to, + &-send-amount { + display: flex; + align-items: center; + margin: 1rem 0rem; + width: inherit; + &-icon { + margin-right: 1rem; + } + &:first-child { + margin-top: 0; + } + &-content { + width: inherit; + } + &-title { + margin: 0; + margin-right: 16px; + padding-bottom: 0.25rem; + } + &-address { + margin: 0; + font-family: $font-family-monospace; + font-weight: 400; + opacity: 0.54; + word-wrap: break-word; + } + } + + &-tkn-contract { + &-icon { + > img { + transform: scale(0.75); + } + } + &-title { + margin: 0; + padding: 0; + font-weight: 400; + color: rgba(0, 0, 0, 0.54); + } + &-link { + font-family: $font-family-monospace; + font-weight: 400; + } + } + + &-send-amount { + > img { + height: 3rem; + width: 3rem; + transform: scale(0.75); + } + } + + @media screen and (max-width: 525px) { + width: inherit; + .Identicon { + display: none; + } + &-tkn-contract { + &-icon { + display: none; + } + &-link { + width: inherit; + word-wrap: break-word; + } + } + } +} diff --git a/common/components/ConfirmationModal/components/Body/components/Addresses.tsx b/common/components/ConfirmationModal/components/Body/components/Addresses.tsx new file mode 100644 index 00000000..13736c5f --- /dev/null +++ b/common/components/ConfirmationModal/components/Body/components/Addresses.tsx @@ -0,0 +1,80 @@ +import React, { Component } from 'react'; +import ERC20 from 'libs/erc20'; +import { Identicon } from 'components/ui'; +import arrow from 'assets/images/tail-triangle-down.svg'; +import './Addresses.scss'; +import { ETHAddressExplorer } from 'config'; +import { connect } from 'react-redux'; +import { SerializedTransaction } from 'components/renderCbs'; +import { AppState } from 'reducers'; +import { getFrom, getUnit, isEtherTransaction } from 'selectors/transaction'; + +interface StateProps { + from: AppState['transaction']['meta']['from']; + unit: AppState['transaction']['meta']['unit']; + isToken: boolean; +} + +const size = '3rem'; + +class AddressesClass extends Component { + public render() { + const { from, isToken, unit } = this.props; + + return ( + { + const toFormatted = isToken ? ERC20.transfer.decodeInput(data)._to : to; + return ( + + ); + }} + /> + ); + } +} + +const mapStateToProps = (state: AppState): StateProps => ({ + from: getFrom(state), + isToken: !isEtherTransaction(state), + unit: getUnit(state) +}); + +export const Addresses = connect(mapStateToProps)(AddressesClass); diff --git a/common/components/ConfirmationModal/components/Body/components/Amounts.scss b/common/components/ConfirmationModal/components/Body/components/Amounts.scss new file mode 100644 index 00000000..9a0c8c77 --- /dev/null +++ b/common/components/ConfirmationModal/components/Body/components/Amounts.scss @@ -0,0 +1,48 @@ +@import 'common/sass/variables'; + +.tx-modal-amount { + width: inherit; + border-collapse: separate; + padding-top: 1rem; + padding-bottom: 0; + &-send, + &-fee, + &-total { + font-size: 1.15rem; + @media screen and (max-width: 525px) { + font-size: 1rem; + } + > td { + padding: 0.5rem 0; + text-align: right; + opacity: 0.54; + &:not(:first-child) { + padding-left: 0.5rem; + } + &:first-child { + text-align: left; + opacity: 1; + } + &:last-child { + font-size: 85%; + } + } + } + + &-fee { + > td { + padding-bottom: 1rem; + } + } + + &-total { + background-image: linear-gradient(to right, #c2cfd6 33%, #fff0 0%); + background-position: top; + background-size: 5px 1px; + background-repeat: repeat-x; + > td { + padding-top: 1rem; + padding-bottom: 1.5rem; + } + } +} diff --git a/common/components/ConfirmationModal/components/Body/components/Amounts.tsx b/common/components/ConfirmationModal/components/Body/components/Amounts.tsx new file mode 100644 index 00000000..a5f5969d --- /dev/null +++ b/common/components/ConfirmationModal/components/Body/components/Amounts.tsx @@ -0,0 +1,114 @@ +import React, { Component } from 'react'; +import { UnitDisplay } from 'components/ui'; +import './Amounts.scss'; +import { AppState } from 'reducers'; +import { getAllUSDValuesFromSerializedTx, AllUSDValues } from 'selectors/rates'; +import { SerializedTxParams, getParamsFromSerializedTx } from 'selectors/transaction'; +import { connect } from 'react-redux'; +import { getNetworkConfig } from 'selectors/config'; +import { NetworkConfig } from 'config'; + +interface StateProps extends SerializedTxParams, AllUSDValues { + network: NetworkConfig; +} + +class AmountsClass extends Component { + public render() { + const { + unit, + decimal, + feeUSD, + totalUSD, + valueUSD, + isToken, + currentValue, + fee, + total, + network + } = this.props; + const showConversion = valueUSD && totalUSD && feeUSD; + + return ( + + + + + + {showConversion && ( + + )} + + + + + {showConversion && ( + + )} + + {!isToken && ( + + + + {showConversion && ( + + )} + + )} + +
You'll Send + + + $ +
Transaction Fee + + + $ +
Total + + + $ +
+ ); + } +} + +const mapStateToProps = (state: AppState): StateProps => ({ + ...getParamsFromSerializedTx(state), + ...getAllUSDValuesFromSerializedTx(state), + network: getNetworkConfig(state) +}); + +export const Amounts = connect(mapStateToProps)(AmountsClass); diff --git a/common/components/ConfirmationModal/components/Body/components/Details.scss b/common/components/ConfirmationModal/components/Body/components/Details.scss new file mode 100644 index 00000000..2bcb062a --- /dev/null +++ b/common/components/ConfirmationModal/components/Body/components/Details.scss @@ -0,0 +1,21 @@ +@import 'common/sass/variables'; + +.tx-modal-details { + margin-top: 1rem; + &-network-info { + text-align: center; + font-weight: 400; + color: rgba(0, 0, 0, 0.54); + } + &-button { + display: block; + margin: auto; + padding: 8px 32px; + border: none; + border-radius: 2px; + transition: background-color 300ms; + &:hover { + background-color: rgba(153, 153, 153, 0.12); + } + } +} diff --git a/common/components/ConfirmationModal/components/Body/components/Details.tsx b/common/components/ConfirmationModal/components/Body/components/Details.tsx new file mode 100644 index 00000000..2fcfa5fb --- /dev/null +++ b/common/components/ConfirmationModal/components/Body/components/Details.tsx @@ -0,0 +1,44 @@ +import React, { Component } from 'react'; +import Code from 'components/ui/Code'; +import './Details.scss'; +import { SerializedTransaction } from 'components/renderCbs'; +import { AppState } from 'reducers'; +import { getNodeConfig } from 'selectors/config'; +import { NodeConfig } from 'config'; +import { connect } from 'react-redux'; +import { TokenValue } from 'libs/units'; + +interface StateProps { + node: NodeConfig; +} + +class DetailsClass extends Component { + public render() { + const { node: { network, service } } = this.props; + return ( +
+

+ Interacting with the {network} network provided by {service} +

+ + { + const { chainId, data, to, ...convertRestToBase10 } = fields; + const base10Fields = Object.entries(convertRestToBase10).reduce( + (convertedFields, [currName, currValue]) => ({ + ...convertedFields, + [currName]: TokenValue(currValue).toString() + }), + {} as typeof convertRestToBase10 + ); + return {JSON.stringify({ chainId, data, to, ...base10Fields }, null, 2)} ; + }} + /> +
+ ); + } +} + +const mapStateToProps = (state: AppState) => ({ node: getNodeConfig(state) }); + +export const Details = connect(mapStateToProps)(DetailsClass); diff --git a/common/components/ConfirmationModal/components/Details/Node.tsx b/common/components/ConfirmationModal/components/Body/components/Node.tsx similarity index 100% rename from common/components/ConfirmationModal/components/Details/Node.tsx rename to common/components/ConfirmationModal/components/Body/components/Node.tsx diff --git a/common/components/ConfirmationModal/components/Body/index.ts b/common/components/ConfirmationModal/components/Body/index.ts new file mode 100644 index 00000000..0b63ac83 --- /dev/null +++ b/common/components/ConfirmationModal/components/Body/index.ts @@ -0,0 +1 @@ +export * from './Body'; diff --git a/common/components/ConfirmationModal/components/Details/Addresses.tsx b/common/components/ConfirmationModal/components/Details/Addresses.tsx deleted file mode 100644 index 6d5936c8..00000000 --- a/common/components/ConfirmationModal/components/Details/Addresses.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { getTransactionFields, makeTransaction } from 'libs/transaction'; -import { SerializedTransaction } from 'components/renderCbs'; -import ERC20 from 'libs/erc20'; -import { From } from '../From'; -import React, { Component } from 'react'; -import { connect } from 'react-redux'; -import { getUnit } from 'selectors/transaction'; -import { AppState } from 'reducers'; - -interface StateProps { - unit: string; -} - -class AddressesClass extends Component { - public render() { - return ( - { - const transactionInstance = makeTransaction(serializedTransaction); - const { to, data } = getTransactionFields(transactionInstance); - - return ( - -
  • - You are sending from {from}} /> -
  • - -
  • - You are sending to{' '} - - {this.props.unit === 'ether' ? to : ERC20.transfer.decodeInput(data)._to} - -
  • -
    - ); - }} - /> - ); - } -} - -export const Addresses = connect((state: AppState) => ({ unit: getUnit(state) }))(AddressesClass); - -//got duplication here diff --git a/common/components/ConfirmationModal/components/Details/AmountAndGasPrice/AmountAndGasPrice.tsx b/common/components/ConfirmationModal/components/Details/AmountAndGasPrice/AmountAndGasPrice.tsx deleted file mode 100644 index a8562022..00000000 --- a/common/components/ConfirmationModal/components/Details/AmountAndGasPrice/AmountAndGasPrice.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { TransactionFee } from './components'; -import { Amount } from '../../Amount'; -import React from 'react'; - -export const AmountAndGasPrice: React.SFC<{}> = () => ( -
  • -

    - You are sending{' '} - - - {' '} - with a transaction fee of{' '} - - - -

    -
  • -); diff --git a/common/components/ConfirmationModal/components/Details/AmountAndGasPrice/components/GasPrice.tsx b/common/components/ConfirmationModal/components/Details/AmountAndGasPrice/components/GasPrice.tsx deleted file mode 100644 index 9339090c..00000000 --- a/common/components/ConfirmationModal/components/Details/AmountAndGasPrice/components/GasPrice.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import React from 'react'; -import { getTransactionFields, makeTransaction } from 'libs/transaction'; -import { SerializedTransaction } from 'components/renderCbs'; -import { UnitDisplay } from 'components/ui'; -import { Wei } from 'libs/units'; - -export const GasPrice: React.SFC<{}> = () => ( - { - const transactionInstance = makeTransaction(serializedTransaction); - const { gasPrice } = getTransactionFields(transactionInstance); - - return ( - - ); - }} - /> -); diff --git a/common/components/ConfirmationModal/components/Details/AmountAndGasPrice/components/TransactionFee.tsx b/common/components/ConfirmationModal/components/Details/AmountAndGasPrice/components/TransactionFee.tsx deleted file mode 100644 index 224328cd..00000000 --- a/common/components/ConfirmationModal/components/Details/AmountAndGasPrice/components/TransactionFee.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import React from 'react'; -import { getTransactionFee, makeTransaction } from 'libs/transaction'; -import { SerializedTransaction } from 'components/renderCbs'; -import { UnitDisplay } from 'components/ui'; -import { AppState } from 'reducers'; -import { connect } from 'react-redux'; -import { getNetworkConfig } from 'selectors/config'; -import BN from 'bn.js'; - -interface Props { - rates: AppState['rates']['rates']; - network: AppState['config']['network']; - isOffline: AppState['config']['offline']; -} - -class TransactionFeeClass extends React.Component { - public render() { - const { rates, network, isOffline } = this.props; - return ( - { - const transactionInstance = makeTransaction(serializedTransaction); - const fee = getTransactionFee(transactionInstance); - const usdFee = network.isTestnet ? new BN(0) : fee.muln(rates[network.unit].USD); - - return ( - - {' '} - {!isOffline && - rates[network.unit] && ( - - ($ - ) - - )} - - ); - }} - /> - ); - } -} - -function mapStateToProps(state: AppState) { - return { - rates: state.rates.rates, - network: getNetworkConfig(state), - isOffline: state.config.offline - }; -} -export const TransactionFee = connect(mapStateToProps)(TransactionFeeClass); diff --git a/common/components/ConfirmationModal/components/Details/AmountAndGasPrice/components/index.ts b/common/components/ConfirmationModal/components/Details/AmountAndGasPrice/components/index.ts deleted file mode 100644 index af522f79..00000000 --- a/common/components/ConfirmationModal/components/Details/AmountAndGasPrice/components/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './GasPrice'; -export * from './TransactionFee'; diff --git a/common/components/ConfirmationModal/components/Details/AmountAndGasPrice/index.ts b/common/components/ConfirmationModal/components/Details/AmountAndGasPrice/index.ts deleted file mode 100644 index 1b93e969..00000000 --- a/common/components/ConfirmationModal/components/Details/AmountAndGasPrice/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './AmountAndGasPrice'; diff --git a/common/components/ConfirmationModal/components/Details/Data.tsx b/common/components/ConfirmationModal/components/Details/Data.tsx deleted file mode 100644 index 4350308d..00000000 --- a/common/components/ConfirmationModal/components/Details/Data.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { getTransactionFields, makeTransaction } from 'libs/transaction'; -import { SerializedTransaction } from 'components/renderCbs'; -import React, { Component } from 'react'; -import { connect } from 'react-redux'; -import { AppState } from 'reducers'; -import { isEtherTransaction } from 'selectors/transaction'; - -interface StateProps { - showData: boolean; -} -class ShowDataWhenNoTokenClass extends Component { - public render() { - return this.props.showData ? : null; - } -} - -const ShowDataWhenNoToken = connect((state: AppState) => ({ showData: isEtherTransaction(state) }))( - ShowDataWhenNoTokenClass -); - -const Data: React.SFC<{}> = () => ( - { - const transactionInstance = makeTransaction(serializedTransaction); - const { data } = getTransactionFields(transactionInstance); - const dataBox = ( - - You are sending the following data:{' '} -