From 6f9de40da695e5701104788e3216996b7950087d Mon Sep 17 00:00:00 2001 From: Sriram Viswanathan Date: Tue, 28 Mar 2017 14:48:45 -0300 Subject: [#931] Shows error feedback using Snackbar notification when there's a submit failure on backup account page --- web-ui/app/locales/en_US/translation.json | 3 ++ web-ui/app/locales/pt_BR/translation.json | 3 ++ .../backup_account/backup_email/backup_email.js | 12 +++-- .../backup_email/backup_email.spec.js | 27 +++++++++- web-ui/src/backup_account/page.js | 11 +++- web-ui/src/backup_account/page.spec.js | 25 +++++++++ .../snackbar_notification/snackbar_notification.js | 62 ++++++++++++++++++++++ .../snackbar_notification.spec.js | 31 +++++++++++ 8 files changed, 168 insertions(+), 6 deletions(-) create mode 100644 web-ui/src/common/snackbar_notification/snackbar_notification.js create mode 100644 web-ui/src/common/snackbar_notification/snackbar_notification.spec.js (limited to 'web-ui') diff --git a/web-ui/app/locales/en_US/translation.json b/web-ui/app/locales/en_US/translation.json index 7d24a728..c60a705b 100644 --- a/web-ui/app/locales/en_US/translation.json +++ b/web-ui/app/locales/en_US/translation.json @@ -103,6 +103,9 @@ "paragraph": "Save this message, it is really important.", "button": "Got it! I'm ready!", "retry-button": "Hey, I didn't received it" + }, + "error": { + "submit-error": "There was an error. Please try again later." } }, "back-to-inbox": "Back to my inbox", diff --git a/web-ui/app/locales/pt_BR/translation.json b/web-ui/app/locales/pt_BR/translation.json index ccc0fe5a..d43487a2 100644 --- a/web-ui/app/locales/pt_BR/translation.json +++ b/web-ui/app/locales/pt_BR/translation.json @@ -103,6 +103,9 @@ "paragraph": "Salve esse e-mail, ele é bem importante.", "button": "Recebi! Pronto!", "retry-button": "Ei, eu não recebi" + }, + "error": { + "submit-error": "Ocorreu um erro. Por favor tente novamente mais tarde." } }, "back-to-inbox": "Voltar", diff --git a/web-ui/src/backup_account/backup_email/backup_email.js b/web-ui/src/backup_account/backup_email/backup_email.js index 09863950..6eeadee8 100644 --- a/web-ui/src/backup_account/backup_email/backup_email.js +++ b/web-ui/src/backup_account/backup_email/backup_email.js @@ -40,7 +40,7 @@ export class BackupEmail extends React.Component { error: !emptyEmail && !validEmail ? t('backup-account.backup-email.error.invalid-email') : '', submitButtonDisabled: !validEmail || emptyEmail }); - } + }; submitHandler = (event) => { event.preventDefault(); @@ -54,8 +54,14 @@ export class BackupEmail extends React.Component { body: JSON.stringify({ csrftoken: [browser.getCookie('XSRF-TOKEN')] }) - }).then(() => this.props.onSubmit('success')); - } + }).then((response) => { + if (response.status === 204) { + this.props.onSubmit('success'); + } else { + this.props.onSubmit('error'); + } + }); + }; render() { const t = this.props.t; diff --git a/web-ui/src/backup_account/backup_email/backup_email.spec.js b/web-ui/src/backup_account/backup_email/backup_email.spec.js index 48199738..ce357bf7 100644 --- a/web-ui/src/backup_account/backup_email/backup_email.spec.js +++ b/web-ui/src/backup_account/backup_email/backup_email.spec.js @@ -84,7 +84,7 @@ describe('BackupEmail', () => { }); }); - describe('Submit', () => { + describe('Submit on success', () => { let preventDefaultSpy; beforeEach((done) => { @@ -118,8 +118,31 @@ describe('BackupEmail', () => { expect(preventDefaultSpy).toHaveBeenCalled(); }); - it('calls onSubmit from props when success', () => { + it('calls onSubmit from props with success', () => { expect(mockOnSubmit).toHaveBeenCalledWith('success'); }); }); + + describe('Submit on error', () => { + let preventDefaultSpy; + + beforeEach((done) => { + mockOnSubmit = expect.createSpy().andCall(() => done()); + preventDefaultSpy = expect.createSpy(); + expect.spyOn(browser, 'getCookie').andReturn('abc123'); + + backupEmail = shallow(); + + fetchMock.post('/backup-account', 500); + backupEmail.find('form').simulate('submit', { preventDefault: preventDefaultSpy }); + }); + + it('calls onSubmit from props with error', () => { + expect(mockOnSubmit).toHaveBeenCalledWith('error'); + }); + }); + + afterEach(() => { + fetchMock.restore(); + }); }); diff --git a/web-ui/src/backup_account/page.js b/web-ui/src/backup_account/page.js index 49e4b316..d5f64add 100644 --- a/web-ui/src/backup_account/page.js +++ b/web-ui/src/backup_account/page.js @@ -22,6 +22,7 @@ import Footer from 'src/common/footer/footer'; import Header from 'src/common/header/header'; import BackupEmail from 'src/backup_account/backup_email/backup_email'; import Confirmation from 'src/backup_account/confirmation/confirmation'; +import SnackbarNotification from 'src/common/snackbar_notification/snackbar_notification'; import 'font-awesome/scss/font-awesome.scss'; import './page.scss'; @@ -36,13 +37,20 @@ export class Page extends React.Component { saveBackupEmail = (status) => { this.setState({ status }); - } + }; mainContent = () => { if (this.state.status === 'success') return ; return ; }; + showSnackbarOnError = (t) => { + if (this.state.status === 'error') { + return ; + } + return undefined; + }; + render() { const t = this.props.t; return ( @@ -52,6 +60,7 @@ export class Page extends React.Component {
{this.mainContent()}
+ {this.showSnackbarOnError(t)}