From 171418a27a2f3d668842d1d79684ace7d9501571 Mon Sep 17 00:00:00 2001 From: NejcZdovc Date: Wed, 21 Mar 2018 16:33:26 -0700 Subject: [PATCH] Adds broken seed overlay Resolves #13424 Auditors: Test Plan: --- app/browser/api/ledger.js | 17 +- app/browser/reducers/ledgerReducer.js | 2 +- app/common/constants/ledgerStatuses.js | 10 + .../locales/en-US/preferences.properties | 5 + app/locale.js | 5 +- .../preferences/payment/enabledContent.js | 187 ++++++++++++------ package.json | 2 +- .../app/browser/reducers/ledgerReducerTest.js | 3 - 8 files changed, 167 insertions(+), 64 deletions(-) create mode 100644 app/common/constants/ledgerStatuses.js diff --git a/app/browser/api/ledger.js b/app/browser/api/ledger.js index 7057b8196dd..528bdef8a94 100644 --- a/app/browser/api/ledger.js +++ b/app/browser/api/ledger.js @@ -31,6 +31,7 @@ const updateState = require('../../common/state/updateState') // Constants const settings = require('../../../js/constants/settings') const messages = require('../../../js/constants/messages') +const ledgerStatuses = require('../../common/constants/ledgerStatuses') // Utils const config = require('../../../js/constants/buildConfig') @@ -179,11 +180,25 @@ const paymentPresent = (state, tabId, present) => { } appActions.onPromotionGet() + + state = checkSeed(state) getPublisherTimestamp(true) } else if (balanceTimeoutId) { clearTimeout(balanceTimeoutId) balanceTimeoutId = false } + + return state +} + +const checkSeed = (state) => { + const seed = ledgerState.getInfoProp(state, 'passphrase') + + if (!client.isValidPassPhrase(seed)) { + state = ledgerState.setAboutProp(state, 'status', ledgerStatuses.CORRUPTED) + } + + return state } const getPublisherTimestamp = (updateList) => { @@ -1629,7 +1644,7 @@ const getStateInfo = (state, parsedData) => { const oldReconcileStamp = ledgerState.getInfoProp(state, 'reconcileStamp') if (oldReconcileStamp && newInfo.reconcileStamp > oldReconcileStamp) { - state = ledgerState.setAboutProp(state, 'status', 'contributionInProgress') + state = ledgerState.setAboutProp(state, 'status', ledgerStatuses.IN_PROGRESS) } let passphrase = ledgerClient.prototype.getWalletPassphrase(parsedData) diff --git a/app/browser/reducers/ledgerReducer.js b/app/browser/reducers/ledgerReducer.js index 9ff932db3b2..ca8d60e70e1 100644 --- a/app/browser/reducers/ledgerReducer.js +++ b/app/browser/reducers/ledgerReducer.js @@ -250,7 +250,7 @@ const ledgerReducer = (state, action, immutableAction) => { } case appConstants.APP_LEDGER_PAYMENTS_PRESENT: { - ledgerApi.paymentPresent(state, action.get('tabId'), action.get('present')) + state = ledgerApi.paymentPresent(state, action.get('tabId'), action.get('present')) break } case appConstants.APP_ON_ADD_FUNDS_CLOSED: diff --git a/app/common/constants/ledgerStatuses.js b/app/common/constants/ledgerStatuses.js new file mode 100644 index 00000000000..4c3c6500506 --- /dev/null +++ b/app/common/constants/ledgerStatuses.js @@ -0,0 +1,10 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +const statuses = { + CORRUPTED: 'corruptedSeed', + IN_PROGRESS: 'contributionInProgress' +} + +module.exports = statuses diff --git a/app/extensions/brave/locales/en-US/preferences.properties b/app/extensions/brave/locales/en-US/preferences.properties index 3400bd1cdcd..e471306739d 100644 --- a/app/extensions/brave/locales/en-US/preferences.properties +++ b/app/extensions/brave/locales/en-US/preferences.properties @@ -90,6 +90,11 @@ contributionTime=Contribution Time copied=Copied! copy=Copy copyToClipboard.title=Copy to clipboard +corruptedOverlayTitle=Hello! +corruptedOverlayMessage=Unfortunately your active wallet has been corrupted. +corruptedOverlayText=You must recover your backup wallet with your recovery keys before any transactions can be processed. We apologize for the inconvenience. +corruptedOverlayFAQ=View the Brave Payments FAQ… +corruptedOverlayButton=Recover your Brave Wallet createdWalletStatus=Your wallet is ready! createWallet=create wallet createWalletStatus=Click the Create Wallet button to get started. diff --git a/app/locale.js b/app/locale.js index b4fd3f151b3..47b2636fcf7 100644 --- a/app/locale.js +++ b/app/locale.js @@ -281,7 +281,10 @@ var rendererIdentifiers = function () { 'promotionGeneralErrorText', 'promotionClaimedErrorMessage', 'promotionClaimedErrorText', - 'promotionClaimedErrorTitle' + 'promotionClaimedErrorTitle', + 'corruptedOverlayTitle', + 'corruptedOverlayMessage', + 'corruptedOverlayText' ].concat(countryCodes).concat(availableLanguages) } diff --git a/app/renderer/components/preferences/payment/enabledContent.js b/app/renderer/components/preferences/payment/enabledContent.js index 0a878627cd0..0f615c8ddbd 100644 --- a/app/renderer/components/preferences/payment/enabledContent.js +++ b/app/renderer/components/preferences/payment/enabledContent.js @@ -7,41 +7,48 @@ const {StyleSheet, css} = require('aphrodite/no-important') const addMonths = require('date-fns/add_months') const Immutable = require('immutable') -// util -const {batToCurrencyString, formatCurrentBalance, formattedDateFromTimestamp, walletStatus} = require('../../../../common/lib/ledgerUtil') -const {l10nErrorText} = require('../../../../common/lib/httpUtil') -const ledgerUtil = require('../../../../common/lib/ledgerUtil') -const {changeSetting} = require('../../../lib/settingsUtil') -const settings = require('../../../../../js/constants/settings') -const locale = require('../../../../../js/l10n') - -// State -const ledgerState = require('../../../../common/state/ledgerState') - -// components +// Components const ImmutableComponent = require('../../immutableComponent') const BrowserButton = require('../../common/browserButton') const {FormTextbox} = require('../../common/textbox') const {FormDropdown} = require('../../common/dropdown') const LedgerTable = require('./ledgerTable') -// style -const globalStyles = require('../../styles/global') -const {paymentStylesVariables} = require('../../styles/payment') -const closeButton = require('../../../../../img/toolbar/stoploading_btn.svg') -const cx = require('../../../../../js/lib/classSet') +// State +const ledgerState = require('../../../../common/state/ledgerState') // Actions const appActions = require('../../../../../js/actions/appActions') +// Constants +const ledgerStatuses = require('../../../../common/constants/ledgerStatuses') +const settings = require('../../../../../js/constants/settings') + +// Utils +const { + batToCurrencyString, + formatCurrentBalance, + formattedDateFromTimestamp, + walletStatus +} = require('../../../../common/lib/ledgerUtil') +const {l10nErrorText} = require('../../../../common/lib/httpUtil') +const ledgerUtil = require('../../../../common/lib/ledgerUtil') +const {changeSetting} = require('../../../lib/settingsUtil') +const locale = require('../../../../../js/l10n') + +// Styles +const globalStyles = require('../../styles/global') +const cx = require('../../../../../js/lib/classSet') +const {paymentStylesVariables} = require('../../styles/payment') +const closeButton = require('../../../../../img/toolbar/stoploading_btn.svg') + // TODO: report when funds are too low -// TODO: support non-USD currency class EnabledContent extends ImmutableComponent { constructor (props) { super(props) this.claimButton = this.claimButton.bind(this) this.onClaimClick = this.onClaimClick.bind(this) - this.closeClick = this.closeClick.bind(this) + this.closePromotionClick = this.closePromotionClick.bind(this) } walletButton () { @@ -139,7 +146,7 @@ class EnabledContent extends ImmutableComponent { let prevReconcileDateValue let text - if (ledgerData.get('status') === 'contributionInProgress') { + if (ledgerData.get('status') === ledgerStatuses.IN_PROGRESS) { text = 'paymentInProgress' } else if (!walletCreated || !walletHasReconcile || !walletHasTransactions) { text = 'noPaymentHistory' @@ -201,7 +208,7 @@ class EnabledContent extends ImmutableComponent { } - closeClick () { + closePromotionClick () { const promo = this.props.ledgerData.get('promotion') || Immutable.Map() const status = promo.get('promotionStatus') if (status && !promo.has('claimedTimestamp')) { @@ -215,55 +222,98 @@ class EnabledContent extends ImmutableComponent { } } + closeStatusClick () { + + } + statusMessage () { const promo = this.props.ledgerData.get('promotion') || Immutable.Map() + const status = this.props.ledgerData.get('status') || '' const successText = promo.getIn(['panel', 'successText']) - let status = promo.get('promotionStatus') + const promotionStatus = promo.get('promotionStatus') + let isPromotion = true - if ((!successText || !promo.has('claimedTimestamp')) && !status) { - return + if ((!successText || !promo.has('claimedTimestamp')) && !promotionStatus) { + isPromotion = false + if (status.length === 0) { + return + } } - let title = successText.get('title') - let message = successText.get('message') - let text = promo.getIn(['panel', 'disclaimer']) + let title, message, text, rightButton, leftButton - if (status) { + if (isPromotion) { + title = successText.get('title') + message = successText.get('message') + text = promo.getIn(['panel', 'disclaimer']) + rightButton = + + if (promotionStatus) { + switch (promotionStatus) { + case 'generalError': + { + title = locale.translation('promotionGeneralErrorTitle') + message = locale.translation('promotionGeneralErrorMessage') + text = locale.translation('promotionGeneralErrorText') + break + } + case 'expiredError': + { + title = locale.translation('promotionClaimedErrorTitle') + message = locale.translation('promotionClaimedErrorMessage') + text = locale.translation('promotionClaimedErrorText') + break + } + } + } + } else { switch (status) { - case 'generalError': + case ledgerStatuses.CORRUPTED: { - title = locale.translation('promotionGeneralErrorTitle') - message = locale.translation('promotionGeneralErrorMessage') - text = locale.translation('promotionGeneralErrorText') + title = locale.translation('corruptedOverlayTitle') + message = locale.translation('corruptedOverlayMessage') + text = locale.translation('corruptedOverlayText') + leftButton = + rightButton = break } - case 'expiredError': + default: { - title = locale.translation('promotionClaimedErrorTitle') - message = locale.translation('promotionClaimedErrorMessage') - text = locale.translation('promotionClaimedErrorText') - break + return } } } - return
+ return
-

- {title} {message} +

+ {title} {message}

-

+

{text}

- +
+
{leftButton}
+
{rightButton}
+
} @@ -465,7 +515,7 @@ const styles = StyleSheet.create({ padding: '0 10px' }, - enabledContent__grant: { + enabledContent__overlay: { position: 'absolute', zIndex: 3, top: 0, @@ -474,12 +524,12 @@ const styles = StyleSheet.create({ minHeight: '159px', background: '#f3f3f3', borderRadius: '8px', - padding: '30px 50px 20px', + padding: '27px 50px 17px', boxSizing: 'border-box', boxShadow: '4px 6px 3px #dadada' }, - enabledContent__grant_close: { + enabledContent__overlay_close: { position: 'absolute', right: '15px', top: '15px', @@ -495,29 +545,52 @@ const styles = StyleSheet.create({ } }, - enabledContent__grant_title: { + enabledContent__overlay_title: { color: '#5f5f5f', fontSize: '20px', display: 'block', marginBottom: '10px' }, - enabledContent__grant_bold: { + enabledContent__overlay_bold: { color: '#ff5500' }, - enabledContent__grant_text: { + enabledContent__overlay_text: { fontSize: '16px', color: '#828282', maxWidth: '700px', lineHeight: '25px', - padding: '5px' + padding: '5px 5px 5px 0' }, - enabledContent__grant_button: { + enabledContent__overlay_buttons: { + display: 'grid', + gridTemplateColumns: '1fr 1fr' + }, + + enabledContent__overlay_buttons_left: { + marginLeft: 0 + }, + + enabledContent__overlay_buttons_right: { + marginRight: 0 + }, + + enabledContent__overlay_button: { float: 'right' }, + enabledContent__overlay_link: { + color: '#5f5f5f', + fontSize: '16px', + textDecoration: 'none', + + ':hover': { + textDecoration: 'underline' + } + }, + enabledContent__walletBar: { display: 'grid', gridTemplateColumns: '1fr 1fr 1fr', diff --git a/package.json b/package.json index 70ca0eff977..0029e5bf100 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,7 @@ "aphrodite": "1.1.0", "async": "^2.0.1", "bat-balance": "^1.0.7", - "bat-client": "^2.0.11", + "bat-client": "^2.1.1", "bat-publisher": "^2.0.13", "bignumber.js": "^4.0.4", "bloodhound-js": "brave/bloodhound", diff --git a/test/unit/app/browser/reducers/ledgerReducerTest.js b/test/unit/app/browser/reducers/ledgerReducerTest.js index 7f7367bc7e0..0dbc7548d30 100644 --- a/test/unit/app/browser/reducers/ledgerReducerTest.js +++ b/test/unit/app/browser/reducers/ledgerReducerTest.js @@ -343,9 +343,6 @@ describe('ledgerReducer unit tests', function () { it('calls ledgerApi.paymentPresent', function () { assert(paymentPresentSpy.withArgs(appState, 123, true).calledOnce) }) - it('returns an ununmodified state', function () { - assert.deepEqual(returnedState, appState) - }) }) describe('APP_ON_ADD_FUNDS_CLOSED', function () {