From cc73d869fed79c63261821fb7ad8f1e5180ffca2 Mon Sep 17 00:00:00 2001
From: Alexander Tseung <alextsg@gmail.com>
Date: Wed, 30 May 2018 16:17:40 -0700
Subject: Add new alert modals

---
 ui/app/actions.js                                  | 26 +++++---
 .../confirm-reset-account.component.js             | 54 ++++++++++++++++
 .../confirm-reset-account.container.js             | 13 ++++
 .../modals/confirm-reset-account/index.js          |  2 +
 ui/app/components/modals/index.scss                | 53 +++++++++++++++-
 ui/app/components/modals/modal.js                  | 72 ++++++++++++----------
 .../notification-modals/confirm-reset-account.js   | 46 --------------
 ui/app/components/modals/notification/index.js     |  2 +
 .../modals/notification/notification.component.js  | 30 +++++++++
 .../modals/notification/notification.container.js  | 38 ++++++++++++
 .../modals/transaction-confirmed/index.js          |  2 +-
 .../modals/transaction-confirmed/index.scss        | 21 -------
 .../transaction-confirmed.component.js             | 48 ++++-----------
 .../transaction-confirmed.container.js             | 20 ------
 ui/app/components/modals/welcome-beta/index.js     |  2 +
 .../modals/welcome-beta/welcome-beta.component.js  | 23 +++++++
 16 files changed, 287 insertions(+), 165 deletions(-)
 create mode 100644 ui/app/components/modals/confirm-reset-account/confirm-reset-account.component.js
 create mode 100644 ui/app/components/modals/confirm-reset-account/confirm-reset-account.container.js
 create mode 100644 ui/app/components/modals/confirm-reset-account/index.js
 delete mode 100644 ui/app/components/modals/notification-modals/confirm-reset-account.js
 create mode 100644 ui/app/components/modals/notification/index.js
 create mode 100644 ui/app/components/modals/notification/notification.component.js
 create mode 100644 ui/app/components/modals/notification/notification.container.js
 delete mode 100644 ui/app/components/modals/transaction-confirmed/index.scss
 delete mode 100644 ui/app/components/modals/transaction-confirmed/transaction-confirmed.container.js
 create mode 100644 ui/app/components/modals/welcome-beta/index.js
 create mode 100644 ui/app/components/modals/welcome-beta/welcome-beta.component.js

(limited to 'ui')

diff --git a/ui/app/actions.js b/ui/app/actions.js
index 649f740e9..a9372d6f3 100644
--- a/ui/app/actions.js
+++ b/ui/app/actions.js
@@ -503,17 +503,23 @@ function requestRevealSeedWords (password) {
 }
 
 function resetAccount () {
-    return (dispatch) => {
-        background.resetAccount((err, account) => {
-            dispatch(actions.hideLoadingIndication())
-            if (err) {
-                dispatch(actions.displayWarning(err.message))
-            }
+  return dispatch => {
+    dispatch(actions.showLoadingIndication())
 
-            log.info('Transaction history reset for ' + account)
-            dispatch(actions.showAccountsPage())
-        })
-    }
+    return new Promise((resolve, reject) => {
+      background.resetAccount((err, account) => {
+        dispatch(actions.hideLoadingIndication())
+        if (err) {
+          dispatch(actions.displayWarning(err.message))
+          return reject(err)
+        }
+
+        log.info('Transaction history reset for ' + account)
+        dispatch(actions.showAccountsPage())
+        resolve(account)
+      })
+    })
+  }
 }
 
 function addNewKeyring (type, opts) {
diff --git a/ui/app/components/modals/confirm-reset-account/confirm-reset-account.component.js b/ui/app/components/modals/confirm-reset-account/confirm-reset-account.component.js
new file mode 100644
index 000000000..14a4da62a
--- /dev/null
+++ b/ui/app/components/modals/confirm-reset-account/confirm-reset-account.component.js
@@ -0,0 +1,54 @@
+import React, { Component } from 'react'
+import PropTypes from 'prop-types'
+import Button from '../../button'
+
+class ConfirmResetAccount extends Component {
+  static propTypes = {
+    hideModal: PropTypes.func.isRequired,
+    resetAccount: PropTypes.func.isRequired,
+  }
+
+  static contextTypes = {
+    t: PropTypes.func,
+  }
+
+  handleReset () {
+    this.props.resetAccount()
+      .then(() => this.props.hideModal())
+  }
+
+  render () {
+    const { t } = this.context
+
+    return (
+      <div className="modal-container">
+        <div className="modal-container__content">
+          <div className="modal-container__title">
+            { `${t('resetAccount')}?` }
+          </div>
+          <div className="modal-container__description">
+            { t('resetAccountDescription') }
+          </div>
+        </div>
+        <div className="modal-container__footer">
+          <Button
+            type="default"
+            className="modal-container__footer-button"
+            onClick={() => this.props.hideModal()}
+          >
+            { t('nevermind') }
+          </Button>
+          <Button
+            type="secondary"
+            className="modal-container__footer-button"
+            onClick={() => this.handleReset()}
+          >
+            { t('reset') }
+          </Button>
+        </div>
+      </div>
+    )
+  }
+}
+
+export default ConfirmResetAccount
diff --git a/ui/app/components/modals/confirm-reset-account/confirm-reset-account.container.js b/ui/app/components/modals/confirm-reset-account/confirm-reset-account.container.js
new file mode 100644
index 000000000..9630a5593
--- /dev/null
+++ b/ui/app/components/modals/confirm-reset-account/confirm-reset-account.container.js
@@ -0,0 +1,13 @@
+import { connect } from 'react-redux'
+import ConfirmResetAccount from './confirm-reset-account.component'
+
+const { hideModal, resetAccount } = require('../../../actions')
+
+const mapDispatchToProps = dispatch => {
+  return {
+    hideModal: () => dispatch(hideModal()),
+    resetAccount: () => dispatch(resetAccount()),
+  }
+}
+
+export default connect(null, mapDispatchToProps)(ConfirmResetAccount)
diff --git a/ui/app/components/modals/confirm-reset-account/index.js b/ui/app/components/modals/confirm-reset-account/index.js
new file mode 100644
index 000000000..c812ffc55
--- /dev/null
+++ b/ui/app/components/modals/confirm-reset-account/index.js
@@ -0,0 +1,2 @@
+import ConfirmResetAccount from './confirm-reset-account.container'
+module.exports = ConfirmResetAccount
diff --git a/ui/app/components/modals/index.scss b/ui/app/components/modals/index.scss
index ec6207f7e..ad6fe16d3 100644
--- a/ui/app/components/modals/index.scss
+++ b/ui/app/components/modals/index.scss
@@ -1 +1,52 @@
-@import './transaction-confirmed/index';
+.modal-container {
+  width: 100%;
+  height: 100%;
+  background-color: #fff;
+  display: flex;
+  flex-flow: column;
+  border-radius: 8px;
+
+  &__title {
+    font-size: 1.5rem;
+    font-weight: 500;
+    padding: 16px 0;
+    text-align: center;
+  }
+
+  &__description {
+    text-align: center;
+    font-size: .875rem;
+  }
+
+  &__content {
+    overflow-y: auto;
+    flex: 1;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    padding: 32px;
+
+    @media screen and (max-width: 575px) {
+      justify-content: center;
+      padding: 28px 20px;
+    }
+  }
+
+  &__footer {
+    display: flex;
+    flex-flow: row;
+    justify-content: center;
+    border-top: 1px solid #d2d8dd;
+    padding: 16px;
+    flex: 0 0 auto;
+
+    &-button {
+      min-width: 0;
+      margin-right: 16px;
+
+      &:last-of-type {
+        margin-right: 0;
+      }
+    }
+  }
+}
diff --git a/ui/app/components/modals/modal.js b/ui/app/components/modals/modal.js
index 841189277..85e85597a 100644
--- a/ui/app/components/modals/modal.js
+++ b/ui/app/components/modals/modal.js
@@ -19,8 +19,30 @@ const ShapeshiftDepositTxModal = require('./shapeshift-deposit-tx-modal.js')
 const HideTokenConfirmationModal = require('./hide-token-confirmation-modal')
 const CustomizeGasModal = require('../customize-gas-modal')
 const NotifcationModal = require('./notification-modal')
-const ConfirmResetAccount = require('./notification-modals/confirm-reset-account')
+const ConfirmResetAccount = require('./confirm-reset-account')
 const TransactionConfirmed = require('./transaction-confirmed')
+const WelcomeBeta = require('./welcome-beta')
+const Notification = require('./notification')
+
+const modalContainerBaseStyle = {
+  transform: 'translate3d(-50%, 0, 0px)',
+  border: '1px solid #CCCFD1',
+  borderRadius: '8px',
+  backgroundColor: '#FFFFFF',
+  boxShadow: '0 2px 22px 0 rgba(0,0,0,0.2)',
+}
+
+const modalContainerLaptopStyle = {
+  ...modalContainerBaseStyle,
+  width: '344px',
+  top: '15%',
+}
+
+const modalContainerMobileStyle = {
+  ...modalContainerBaseStyle,
+  width: '309px',
+  top: '12.5%',
+}
 
 const accountModalStyle = {
   mobileModalStyle: {
@@ -174,18 +196,18 @@ const MODALS = {
 
   BETA_UI_NOTIFICATION_MODAL: {
     contents: [
-      h(NotifcationModal, {
-        header: 'uiWelcome',
-        message: 'uiWelcomeMessage',
-      }),
+      h(Notification, [
+        h(WelcomeBeta),
+      ]),
     ],
     mobileModalStyle: {
-      width: '95%',
-      top: getEnvironmentType(window.location.href) === ENVIRONMENT_TYPE_POPUP ? '52vh' : '36.5vh',
+      ...modalContainerMobileStyle,
     },
     laptopModalStyle: {
-      width: '449px',
-      top: 'calc(33% + 45px)',
+      ...modalContainerLaptopStyle,
+    },
+    contentStyle: {
+      borderRadius: '8px',
     },
   },
 
@@ -209,12 +231,13 @@ const MODALS = {
   CONFIRM_RESET_ACCOUNT: {
     contents: h(ConfirmResetAccount),
     mobileModalStyle: {
-      width: '95%',
-      top: getEnvironmentType(window.location.href) === ENVIRONMENT_TYPE_POPUP ? '52vh' : '36.5vh',
+      ...modalContainerMobileStyle,
     },
     laptopModalStyle: {
-      width: '473px',
-      top: 'calc(33% + 45px)',
+      ...modalContainerLaptopStyle,
+    },
+    contentStyle: {
+      borderRadius: '8px',
     },
   },
 
@@ -269,31 +292,18 @@ const MODALS = {
   TRANSACTION_CONFIRMED: {
     disableBackdropClick: true,
     contents: [
-      h(TransactionConfirmed, {}, []),
+      h(Notification, [
+        h(TransactionConfirmed),
+      ]),
     ],
     mobileModalStyle: {
-      width: '100%',
-      height: '100%',
-      transform: 'none',
-      left: '0',
-      right: '0',
-      margin: '0 auto',
-      boxShadow: '0 0 7px 0 rgba(0,0,0,0.08)',
-      top: '0',
-      display: 'flex',
+      ...modalContainerMobileStyle,
     },
     laptopModalStyle: {
-      width: '344px',
-      transform: 'translate3d(-50%, 0, 0px)',
-      top: '15%',
-      border: '1px solid #CCCFD1',
-      borderRadius: '8px',
-      backgroundColor: '#FFFFFF',
-      boxShadow: '0 2px 22px 0 rgba(0,0,0,0.2)',
+      ...modalContainerLaptopStyle,
     },
     contentStyle: {
       borderRadius: '8px',
-      height: '100%',
     },
   },
 
diff --git a/ui/app/components/modals/notification-modals/confirm-reset-account.js b/ui/app/components/modals/notification-modals/confirm-reset-account.js
deleted file mode 100644
index 89fa9bef1..000000000
--- a/ui/app/components/modals/notification-modals/confirm-reset-account.js
+++ /dev/null
@@ -1,46 +0,0 @@
-const { Component } = require('react')
-const PropTypes = require('prop-types')
-const h = require('react-hyperscript')
-const connect = require('react-redux').connect
-const actions = require('../../../actions')
-const NotifcationModal = require('../notification-modal')
-
-class ConfirmResetAccount extends Component {
-  render () {
-    const { resetAccount } = this.props
-
-    return h(NotifcationModal, {
-      header: 'Are you sure you want to reset account?',
-      message: h('div', [
-
-        h('span', `Resetting is for developer use only. This button wipes the current account's transaction history,
-          which is used to calculate the current account nonce. `),
-
-        h('a.notification-modal__link', {
-          href: 'http://metamask.helpscoutdocs.com/article/36-resetting-an-account',
-          target: '_blank',
-          onClick (event) { global.platform.openWindow({ url: event.target.href }) },
-        }, 'Read more.'),
-
-      ]),
-      showCancelButton: true,
-      showConfirmButton: true,
-      onConfirm: resetAccount,
-      
-    })
-  }
-}
-
-ConfirmResetAccount.propTypes = {
-  resetAccount: PropTypes.func,
-}
-
-const mapDispatchToProps = dispatch => {
-  return {
-    resetAccount: () => {
-      dispatch(actions.resetAccount())
-    },
-  }
-}
-
-module.exports = connect(null, mapDispatchToProps)(ConfirmResetAccount)
diff --git a/ui/app/components/modals/notification/index.js b/ui/app/components/modals/notification/index.js
new file mode 100644
index 000000000..d60a3129b
--- /dev/null
+++ b/ui/app/components/modals/notification/index.js
@@ -0,0 +1,2 @@
+import Notification from './notification.container'
+module.exports = Notification
diff --git a/ui/app/components/modals/notification/notification.component.js b/ui/app/components/modals/notification/notification.component.js
new file mode 100644
index 000000000..1af2f3ca8
--- /dev/null
+++ b/ui/app/components/modals/notification/notification.component.js
@@ -0,0 +1,30 @@
+import React from 'react'
+import PropTypes from 'prop-types'
+import Button from '../../button'
+
+const Notification = (props, context) => {
+  return (
+    <div className="modal-container">
+      { props.children }
+      <div className="modal-container__footer">
+        <Button
+          type="primary"
+          onClick={() => props.onHide()}
+        >
+          { context.t('ok') }
+        </Button>
+      </div>
+    </div>
+  )
+}
+
+Notification.propTypes = {
+  onHide: PropTypes.func.isRequired,
+  children: PropTypes.element,
+}
+
+Notification.contextTypes = {
+  t: PropTypes.func,
+}
+
+export default Notification
diff --git a/ui/app/components/modals/notification/notification.container.js b/ui/app/components/modals/notification/notification.container.js
new file mode 100644
index 000000000..5b98714da
--- /dev/null
+++ b/ui/app/components/modals/notification/notification.container.js
@@ -0,0 +1,38 @@
+import { connect } from 'react-redux'
+import Notification from './notification.component'
+
+const { hideModal } = require('../../../actions')
+
+const mapStateToProps = state => {
+  const { appState: { modal: { modalState: { props } } } } = state
+  const { onHide } = props
+  return {
+    onHide,
+  }
+}
+
+const mapDispatchToProps = dispatch => {
+  return {
+    hideModal: () => dispatch(hideModal()),
+  }
+}
+
+const mergeProps = (stateProps, dispatchProps, ownProps) => {
+  const { onHide, ...otherStateProps } = stateProps
+  const { hideModal, ...otherDispatchProps } = dispatchProps
+
+  return {
+    ...otherStateProps,
+    ...otherDispatchProps,
+    ...ownProps,
+    onHide: () => {
+      hideModal()
+
+      if (onHide && typeof onHide === 'function') {
+        onHide()
+      }
+    },
+  }
+}
+
+export default connect(mapStateToProps, mapDispatchToProps, mergeProps)(Notification)
diff --git a/ui/app/components/modals/transaction-confirmed/index.js b/ui/app/components/modals/transaction-confirmed/index.js
index c8db91388..cee8da7f8 100644
--- a/ui/app/components/modals/transaction-confirmed/index.js
+++ b/ui/app/components/modals/transaction-confirmed/index.js
@@ -1,2 +1,2 @@
-import TransactionConfirmed from './transaction-confirmed.container'
+import TransactionConfirmed from './transaction-confirmed.component'
 module.exports = TransactionConfirmed
diff --git a/ui/app/components/modals/transaction-confirmed/index.scss b/ui/app/components/modals/transaction-confirmed/index.scss
deleted file mode 100644
index f8cd1f212..000000000
--- a/ui/app/components/modals/transaction-confirmed/index.scss
+++ /dev/null
@@ -1,21 +0,0 @@
-.transaction-confirmed {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  padding: 32px;
-
-  &__title {
-    font-size: 2rem;
-    padding: 16px 0;
-  }
-
-  &__description {
-    text-align: center;
-    font-size: .875rem;
-    line-height: 1.5rem;
-  }
-
-  @media screen and (max-width: 575px) {
-    justify-content: center;
-  }
-}
diff --git a/ui/app/components/modals/transaction-confirmed/transaction-confirmed.component.js b/ui/app/components/modals/transaction-confirmed/transaction-confirmed.component.js
index 8d3b288ae..c1c8a2976 100644
--- a/ui/app/components/modals/transaction-confirmed/transaction-confirmed.component.js
+++ b/ui/app/components/modals/transaction-confirmed/transaction-confirmed.component.js
@@ -1,42 +1,20 @@
-import React, { Component } from 'react'
+import React from 'react'
 import PropTypes from 'prop-types'
-import Button from '../../button'
 
-class TransactionConfirmed extends Component {
-  render () {
-    const { t } = this.context
+const TransactionConfirmed = (props, context) => {
+  const { t } = context
 
-    return (
-      <div className="page-container page-container--full-width page-container--full-height">
-        <div className="page-container__content transaction-confirmed">
-          <img src="images/check-icon.svg" />
-          <div className="transaction-confirmed__title">
-            { `${t('confirmed')}!` }
-          </div>
-          <div className="transaction-confirmed__description">
-            { t('initialTransactionConfirmed') }
-          </div>
-        </div>
-        <div className="page-container__footer">
-          <Button
-            type="primary"
-            className="page-container__footer-button"
-            onClick={() => {
-              this.props.hideModal()
-              this.props.onHide()
-            }}
-          >
-            { t('ok') }
-          </Button>
-        </div>
+  return (
+    <div className="modal-container__content">
+      <img src="images/check-icon.svg" />
+      <div className="modal-container__title">
+        { `${t('confirmed')}!` }
       </div>
-    )
-  }
-}
-
-TransactionConfirmed.propTypes = {
-  hideModal: PropTypes.func.isRequired,
-  onHide: PropTypes.func.isRequired,
+      <div className="modal-container__description">
+        { t('initialTransactionConfirmed') }
+      </div>
+    </div>
+  )
 }
 
 TransactionConfirmed.contextTypes = {
diff --git a/ui/app/components/modals/transaction-confirmed/transaction-confirmed.container.js b/ui/app/components/modals/transaction-confirmed/transaction-confirmed.container.js
deleted file mode 100644
index 63872f7f2..000000000
--- a/ui/app/components/modals/transaction-confirmed/transaction-confirmed.container.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import { connect } from 'react-redux'
-import TransactionConfirmed from './transaction-confirmed.component'
-
-const { hideModal } = require('../../../actions')
-
-const mapStateToProps = state => {
-  const { appState: { modal: { modalState: { props } } } } = state
-  const { onHide } = props
-  return {
-    onHide,
-  }
-}
-
-const mapDispatchToProps = dispatch => {
-  return {
-    hideModal: () => dispatch(hideModal()),
-  }
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(TransactionConfirmed)
diff --git a/ui/app/components/modals/welcome-beta/index.js b/ui/app/components/modals/welcome-beta/index.js
new file mode 100644
index 000000000..515c9cdaf
--- /dev/null
+++ b/ui/app/components/modals/welcome-beta/index.js
@@ -0,0 +1,2 @@
+import WelcomeBeta from './welcome-beta.component'
+module.exports = WelcomeBeta
diff --git a/ui/app/components/modals/welcome-beta/welcome-beta.component.js b/ui/app/components/modals/welcome-beta/welcome-beta.component.js
new file mode 100644
index 000000000..61571723a
--- /dev/null
+++ b/ui/app/components/modals/welcome-beta/welcome-beta.component.js
@@ -0,0 +1,23 @@
+import React from 'react'
+import PropTypes from 'prop-types'
+
+const TransactionConfirmed = (props, context) => {
+  const { t } = context
+
+  return (
+    <div className="modal-container__content">
+      <div className="modal-container__title">
+        { `${t('uiWelcome')}` }
+      </div>
+      <div className="modal-container__description">
+        { t('uiWelcomeMessage') }
+      </div>
+    </div>
+  )
+}
+
+TransactionConfirmed.contextTypes = {
+  t: PropTypes.func,
+}
+
+export default TransactionConfirmed
-- 
cgit