diff --git a/package-lock.json b/package-lock.json
index cfb0ff55..6ed75fa2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -3937,9 +3937,9 @@
}
},
"@edx/paragon": {
- "version": "14.14.1",
- "resolved": "https://registry.npmjs.org/@edx/paragon/-/paragon-14.14.1.tgz",
- "integrity": "sha512-QO0OqH7zu/EVcv+E93eSW32IsXnF62y3+UmQ8aqAAAcn8PAXeUauckrxv0h4frdnzzoL+sfe/MsybacJdq7U7Q==",
+ "version": "14.15.0",
+ "resolved": "https://registry.npmjs.org/@edx/paragon/-/paragon-14.15.0.tgz",
+ "integrity": "sha512-g8Otnqj/bg+z6z/wcD04XPguASy3OwTi+947Qq/zrSMMaRG4xKraWCZVP0HZ5NTKTKh/GkQGsm7G6PPiUu5Ulg==",
"requires": {
"@fortawesome/fontawesome-svg-core": "^1.2.30",
"@fortawesome/free-solid-svg-icons": "^5.14.0",
@@ -3950,7 +3950,7 @@
"classnames": "^2.2.6",
"email-prop-type": "^3.0.0",
"font-awesome": "^4.7.0",
- "mailto-link": "^1.0.0",
+ "mailto-link": "^2.0.0",
"prop-types": "^15.7.2",
"react-bootstrap": "^1.3.0",
"react-focus-on": "^3.5.0",
@@ -3964,6 +3964,28 @@
"uncontrollable": "7.2.1"
},
"dependencies": {
+ "mailto-link": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mailto-link/-/mailto-link-2.0.0.tgz",
+ "integrity": "sha512-b5FErkZ4t6mpH1IFZSw7Mm2IQHXQ2R0/5Q4xd7Rv8dVkWvE54mFG/UW7HjfFazXFjXTNsM+dSX2tTeIDrV9K9A==",
+ "requires": {
+ "assert-ok": "~1.0.0",
+ "cast-array": "~1.0.1",
+ "object-filter": "~1.0.2",
+ "query-string": "~7.0.0"
+ }
+ },
+ "query-string": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.0.0.tgz",
+ "integrity": "sha512-Iy7moLybliR5ZgrK/1R3vjrXq03S13Vz4Rbm5Jg3EFq1LUmQppto0qtXz4vqZ386MSRjZgnTSZ9QC+NZOSd/XA==",
+ "requires": {
+ "decode-uri-component": "^0.2.0",
+ "filter-obj": "^1.1.0",
+ "split-on-first": "^1.0.0",
+ "strict-uri-encode": "^2.0.0"
+ }
+ },
"react-responsive": {
"version": "6.1.2",
"resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-6.1.2.tgz",
@@ -3974,6 +3996,11 @@
"prop-types": "^15.6.1"
}
},
+ "strict-uri-encode": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
+ "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY="
+ },
"uncontrollable": {
"version": "7.2.1",
"resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz",
@@ -12859,6 +12886,11 @@
}
}
},
+ "filter-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz",
+ "integrity": "sha1-mzERErxsYSehbgFsbF1/GeCAXFs="
+ },
"finalhandler": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
@@ -23042,6 +23074,11 @@
"wbuf": "^1.7.3"
}
},
+ "split-on-first": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz",
+ "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw=="
+ },
"split-string": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
diff --git a/package.json b/package.json
index ac50454f..35b87e72 100644
--- a/package.json
+++ b/package.json
@@ -38,7 +38,7 @@
"@edx/frontend-component-cookie-policy-banner": "2.1.12",
"@edx/frontend-component-header": "2.2.5",
"@edx/frontend-platform": "1.8.4",
- "@edx/paragon": "14.14.1",
+ "@edx/paragon": "14.15.0",
"@fortawesome/fontawesome-svg-core": "1.2.32",
"@fortawesome/free-brands-svg-icons": "5.15.1",
"@fortawesome/free-regular-svg-icons": "5.15.1",
diff --git a/src/forgot-password/ForgotPasswordPage.jsx b/src/forgot-password/ForgotPasswordPage.jsx
index 2b4b3e20..8ba02ebc 100644
--- a/src/forgot-password/ForgotPasswordPage.jsx
+++ b/src/forgot-password/ForgotPasswordPage.jsx
@@ -11,7 +11,7 @@ import { sendPageEvent } from '@edx/frontend-platform/analytics';
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import { Form, StatefulButton, Hyperlink } from '@edx/paragon';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
-import { faSpinner, faChevronLeft } from '@fortawesome/free-solid-svg-icons';
+import { faChevronLeft } from '@fortawesome/free-solid-svg-icons';
import { forgotPassword } from './data/actions';
import { forgotPasswordResultSelector } from './data/selectors';
@@ -103,7 +103,6 @@ const ForgotPasswordPage = (props) => {
default: intl.formatMessage(messages['forgot.password.page.submit.button']),
pending: '',
}}
- icons={{ pending: }}
onClick={handleSubmit}
onMouseDown={(e) => e.preventDefault()}
/>
@@ -111,7 +110,7 @@ const ForgotPasswordPage = (props) => {
{intl.formatMessage(messages['need.help.sign.in.text'])}
{intl.formatMessage(messages['additional.help.text'])}
- {getConfig().INFO_EMAIL}
+ {getConfig().INFO_EMAIL}
>
diff --git a/src/login/AccountActivationMessage.jsx b/src/login/AccountActivationMessage.jsx
index c86cd5db..250f3afc 100644
--- a/src/login/AccountActivationMessage.jsx
+++ b/src/login/AccountActivationMessage.jsx
@@ -3,6 +3,7 @@ import React from 'react';
import { getConfig } from '@edx/frontend-platform';
import { FormattedMessage, injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import { Alert } from '@edx/paragon';
+import { CheckCircle, Error } from '@edx/paragon/icons';
import PropTypes from 'prop-types';
import { ACCOUNT_ACTIVATION_MESSAGE } from './data/constants';
@@ -15,6 +16,11 @@ const AccountActivationMessage = (props) => {
let activationMessage;
let heading;
+ const iconMapping = {
+ [ACCOUNT_ACTIVATION_MESSAGE.SUCCESS]: CheckCircle,
+ [ACCOUNT_ACTIVATION_MESSAGE.ERROR]: Error,
+ };
+
switch (messageType) {
case ACCOUNT_ACTIVATION_MESSAGE.SUCCESS: {
heading = intl.formatMessage(messages['account.activation.success.message.title']);
@@ -48,7 +54,12 @@ const AccountActivationMessage = (props) => {
}
return activationMessage ? (
-
+
{heading && {heading}}
{activationMessage}
diff --git a/src/login/LoginPage.jsx b/src/login/LoginPage.jsx
index 59aaee2c..83ef2f2d 100644
--- a/src/login/LoginPage.jsx
+++ b/src/login/LoginPage.jsx
@@ -13,8 +13,6 @@ import {
Form, Hyperlink, Icon, StatefulButton,
} from '@edx/paragon';
import { Institution } from '@edx/paragon/icons';
-import { faSpinner } from '@fortawesome/free-solid-svg-icons';
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import AccountActivationMessage from './AccountActivationMessage';
import { loginRequest, loginRequestFailure, loginRequestReset } from './data/actions';
@@ -241,9 +239,6 @@ class LoginPage extends React.Component {
default: intl.formatMessage(messages['sign.in.button']),
pending: '',
}}
- icons={{
- pending: ,
- }}
onClick={this.handleSubmit}
onMouseDown={(e) => e.preventDefault()}
/>
diff --git a/src/login/tests/LoginPage.test.jsx b/src/login/tests/LoginPage.test.jsx
index 53d5a2f5..39e7348e 100644
--- a/src/login/tests/LoginPage.test.jsx
+++ b/src/login/tests/LoginPage.test.jsx
@@ -160,9 +160,8 @@ describe('LoginPage', () => {
const loginPage = mount(reduxWrapper());
const button = loginPage.find('button[type="submit"] span').first();
- // test pending state icon and that pending state icon has title associated with it
- expect(button.find('svg').prop('className')).toEqual(expect.stringContaining('fa-spinner'));
- expect(button.find('svg').find('title').text()).toEqual('Loading');
+ // test pending state has icon
+ expect(button.find('.pgn__stateful-btn-icon').length).toEqual(1);
});
it('should show forgot password link', () => {
diff --git a/src/register/RegistrationPage.jsx b/src/register/RegistrationPage.jsx
index 43eff28f..0df1fd69 100644
--- a/src/register/RegistrationPage.jsx
+++ b/src/register/RegistrationPage.jsx
@@ -11,11 +11,9 @@ import { sendPageEvent, sendTrackEvent } from '@edx/frontend-platform/analytics'
import {
injectIntl, intlShape, getCountryList, getLocale, FormattedMessage,
} from '@edx/frontend-platform/i18n';
-import { faSpinner } from '@fortawesome/free-solid-svg-icons';
import {
Form, Hyperlink, StatefulButton,
} from '@edx/paragon';
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { closest } from 'fastest-levenshtein';
import {
@@ -549,9 +547,6 @@ class RegistrationPage extends React.Component {
default: intl.formatMessage(messages['create.account.button']),
pending: '',
}}
- icons={{
- pending: ,
- }}
onClick={this.handleSubmit}
onMouseDown={(e) => e.preventDefault()}
/>
diff --git a/src/register/tests/RegistrationPage.test.jsx b/src/register/tests/RegistrationPage.test.jsx
index 15db6a2c..e03b08b5 100644
--- a/src/register/tests/RegistrationPage.test.jsx
+++ b/src/register/tests/RegistrationPage.test.jsx
@@ -344,6 +344,7 @@ describe('RegistrationPage', () => {
const expectedMessage = 'We couldn\'t create your account.An error has occurred. Try refreshing the page, or check your internet connection.';
props = {
errorCode: INTERNAL_SERVER_ERROR,
+ failureCount: 0,
};
const registrationPage = mount(reduxWrapper());
@@ -355,6 +356,7 @@ describe('RegistrationPage', () => {
const expectedMessage = 'We couldn\'t create your account.Too many failed registration attempts. Try again later.';
props = {
errorCode: FORBIDDEN_REQUEST,
+ failureCount: 0,
};
const registrationPage = mount(reduxWrapper());
@@ -365,10 +367,11 @@ describe('RegistrationPage', () => {
it('should match tpa session expired error message', () => {
const expectedMessage = 'We couldn\'t create your account.Registration using Google has timed out.';
props = {
- errorCode: TPA_SESSION_EXPIRED,
context: {
provider: 'Google',
},
+ errorCode: TPA_SESSION_EXPIRED,
+ failureCount: 0,
};
const registrationPage = mount(reduxWrapper());
@@ -395,9 +398,8 @@ describe('RegistrationPage', () => {
const registrationPage = mount(reduxWrapper());
const button = registrationPage.find('button[type="submit"] span').first();
- // test pending state icon and that pending state icon has title associated with it
- expect(button.find('svg').prop('className')).toEqual(expect.stringContaining('fa-spinner'));
- expect(button.find('svg').find('title').text()).toEqual('Loading');
+ // test pending state has icon
+ expect(button.find('.pgn__stateful-btn-icon').length).toEqual(1);
});
it('should show single sign on provider button', () => {
@@ -469,7 +471,7 @@ describe('RegistrationPage', () => {
},
});
- renderer.create(reduxWrapper());
+ renderer.create(reduxWrapper());
expect(document.cookie).toMatch(`${getConfig().USER_SURVEY_COOKIE_NAME}=register`);
});
diff --git a/src/reset-password/ResetPasswordPage.jsx b/src/reset-password/ResetPasswordPage.jsx
index e4abaa37..8aa300c1 100644
--- a/src/reset-password/ResetPasswordPage.jsx
+++ b/src/reset-password/ResetPasswordPage.jsx
@@ -8,7 +8,7 @@ import { Form, Spinner, StatefulButton } from '@edx/paragon';
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import { getQueryParameters, getConfig } from '@edx/frontend-platform';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
-import { faChevronLeft, faSpinner } from '@fortawesome/free-solid-svg-icons';
+import { faChevronLeft } from '@fortawesome/free-solid-svg-icons';
import messages from './messages';
import { resetPassword, validateToken } from './data/actions';
@@ -163,7 +163,6 @@ const ResetPasswordPage = (props) => {
default: intl.formatMessage(messages['reset.password']),
pending: '',
}}
- icons={{ pending: }}
onClick={e => handleSubmit(e)}
onMouseDown={(e) => e.preventDefault()}
/>