From 3586307ee766201d3a9d103bc633a5f5a4dfcc6c Mon Sep 17 00:00:00 2001 From: Kristin Aoki <42981026+KristinAoki@users.noreply.github.com> Date: Tue, 11 Jul 2023 10:30:52 -0400 Subject: [PATCH] feat: react based studio footer (#359) --- package-lock.json | 8 +- package.json | 2 +- src/footer/Footer.jsx | 166 +++++++++++++++++++++++++++++++++++++ src/footer/Footer.test.jsx | 120 +++++++++++++++++++++++++++ src/footer/index.jsx | 3 + src/footer/messages.js | 66 +++++++++++++++ src/index.jsx | 2 + 7 files changed, 362 insertions(+), 5 deletions(-) create mode 100644 src/footer/Footer.jsx create mode 100644 src/footer/Footer.test.jsx create mode 100644 src/footer/index.jsx create mode 100644 src/footer/messages.js diff --git a/package-lock.json b/package-lock.json index ba2af872f..0bd3b0d77 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,7 +45,7 @@ "@edx/browserslist-config": "^1.1.1", "@edx/frontend-build": "12.8.27", "@edx/frontend-platform": "4.2.0", - "@edx/paragon": "^20.32.0", + "@edx/paragon": "^20.45.0", "@edx/reactifex": "^2.1.1", "@testing-library/dom": "^8.13.0", "@testing-library/jest-dom": "^5.16.5", @@ -2439,9 +2439,9 @@ } }, "node_modules/@edx/paragon": { - "version": "20.32.0", - "resolved": "https://registry.npmjs.org/@edx/paragon/-/paragon-20.32.0.tgz", - "integrity": "sha512-d2rlYoWyRLvzPMo7MfCojqU/Qvk0cXnBpXW7aOOOQYhTvC3m3Y3yNWjQ8DJhbnWyL1tFEjZG2mjlgXHDHBqtLQ==", + "version": "20.45.0", + "resolved": "https://registry.npmjs.org/@edx/paragon/-/paragon-20.45.0.tgz", + "integrity": "sha512-9lHcnSJ36sQ+bsYFhydf/Pvp3Bo5N3go8R3ORPTNtvYnwiKSfjlv11QpURC/xHobXsT2eYHiwl2gNmq1yP09BA==", "dev": true, "dependencies": { "@fortawesome/fontawesome-svg-core": "^6.1.1", diff --git a/package.json b/package.json index fd6c545e7..af9f07691 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "@edx/browserslist-config": "^1.1.1", "@edx/frontend-build": "12.8.27", "@edx/frontend-platform": "4.2.0", - "@edx/paragon": "^20.32.0", + "@edx/paragon": "^20.45.0", "@edx/reactifex": "^2.1.1", "@testing-library/dom": "^8.13.0", "@testing-library/jest-dom": "^5.16.5", diff --git a/src/footer/Footer.jsx b/src/footer/Footer.jsx new file mode 100644 index 000000000..e8bd1b2d3 --- /dev/null +++ b/src/footer/Footer.jsx @@ -0,0 +1,166 @@ +import React, { useState } from 'react'; +import PropTypes from 'prop-types'; +import _ from 'lodash-es'; +import { intlShape, injectIntl, FormattedMessage } from '@edx/frontend-platform/i18n'; +import { + ActionRow, + Button, + Hyperlink, + Image, + TransitionReplace, +} from '@edx/paragon'; +import { ExpandLess, ExpandMore, Help } from '@edx/paragon/icons'; +import messages from './messages'; + +const Footer = ({ + marketingBaseUrl, + termsOfServiceUrl, + privacyPolicyUrl, + supportEmail, + platformName, + lmsBaseUrl, + studioBaseUrl, + showAccessibilityPage, + // injected + intl, +}) => { + const [isOpen, setIsOpen] = useState(false); + + return ( + <> +
+
+ +
+
+ + {isOpen ? ( + + + + {platformName === 'edX' ? ( + + ) : ( + + )} + + + {!_.isEmpty(supportEmail) && ( + + )} + + + ) : null} + + + © {new Date().getFullYear()} {platformName} + + {!_.isEmpty(termsOfServiceUrl) && ( + + {intl.formatMessage(messages.termsOfServiceLinkLabel)} + + )}{!_.isEmpty(privacyPolicyUrl) && ( + + {intl.formatMessage(messages.privacyPolicyLinkLabel)} + + )} + {showAccessibilityPage && ( + + {intl.formatMessage(messages.accessibilityRequestLinkLabel)} + + )} + LMS + + + {/* + Site operators: Please do not remove this paragraph! this attributes back to edX and + makes your acknowledgement of edX's trademarks clear. + Translators: 'edX' and 'Open edX' are trademarks of 'edX Inc.'. Please do not translate + any of these trademarks and company names. + */} + + edX Inc. + + + Powered by Open edX + + + + ); +}; + +Footer.defaultProps = { + marketingBaseUrl: null, + termsOfServiceUrl: null, + privacyPolicyUrl: null, + spanishPrivacyPolicy: null, + supportEmail: null, +}; + +Footer.propTypes = { + marketingBaseUrl: PropTypes.string, + termsOfServiceUrl: PropTypes.string, + privacyPolicyUrl: PropTypes.string, + spanishPrivacyPolicy: PropTypes.string, + supportEmail: PropTypes.string, + platformName: PropTypes.string.isRequired, + lmsBaseUrl: PropTypes.string.isRequired, + studioBaseUrl: PropTypes.string.isRequired, + showAccessibilityPage: PropTypes.bool.isRequired, + // injected + intl: intlShape.isRequired, +}; + +export default injectIntl(Footer); diff --git a/src/footer/Footer.test.jsx b/src/footer/Footer.test.jsx new file mode 100644 index 000000000..ae8c46336 --- /dev/null +++ b/src/footer/Footer.test.jsx @@ -0,0 +1,120 @@ +import React from 'react'; +import { fireEvent, render, screen } from '@testing-library/react'; +import '@testing-library/jest-dom/extend-expect'; +import { IntlProvider } from '@edx/frontend-platform/i18n'; +import { formatMessage } from '../testUtils'; +import Footer from './Footer'; +import messages from './messages'; + +const renderComponent = ( + termsOfServiceUrl, + privacyPolicyUrl, + supportEmail, + showAccessibilityPage, + platformName, +) => { + render( + +