Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 43 additions & 52 deletions src/components/Footer.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from 'react';
import React, { useContext } from 'react';
import PropTypes from 'prop-types';
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import { useIntl } from '@edx/frontend-platform/i18n';
import { sendTrackEvent } from '@edx/frontend-platform/analytics';
import { ensureConfig } from '@edx/frontend-platform';
import { AppContext } from '@edx/frontend-platform/react';
Expand All @@ -17,66 +17,57 @@ const EVENT_NAMES = {
FOOTER_LINK: 'edx.bi.footer.link',
};

class SiteFooter extends React.Component {
constructor(props) {
super(props);
this.externalLinkClickHandler = this.externalLinkClickHandler.bind(this);
}
const SiteFooter = ({
supportedLanguages,
onLanguageSelected,
logo,
}) => {
const intl = useIntl();
const { config } = useContext(AppContext);

externalLinkClickHandler(event) {
const showLanguageSelector = supportedLanguages.length > 0 && onLanguageSelected;

const externalLinkClickHandler = (event) => {
const label = event.currentTarget.getAttribute('href');
const eventName = EVENT_NAMES.FOOTER_LINK;
const properties = {
category: 'outbound_link',
label,
};
sendTrackEvent(eventName, properties);
}

render() {
const {
supportedLanguages,
onLanguageSelected,
logo,
intl,
} = this.props;
const showLanguageSelector = supportedLanguages.length > 0 && onLanguageSelected;
const { config } = this.context;
};

return (
<footer
role="contentinfo"
className="footer d-flex border-top py-3 px-4"
>
<div className="container-fluid d-flex">
<a
className="d-block"
href={config.LMS_BASE_URL}
aria-label={intl.formatMessage(messages['footer.logo.ariaLabel'])}
>
<img
style={{ maxHeight: 45 }}
src={logo || config.LOGO_TRADEMARK_URL}
alt={intl.formatMessage(messages['footer.logo.altText'])}
/>
</a>
<div className="flex-grow-1" />
{showLanguageSelector && (
<LanguageSelector
options={supportedLanguages}
onSubmit={onLanguageSelected}
/>
)}
</div>
</footer>
);
}
}

SiteFooter.contextType = AppContext;
return (
<footer
role="contentinfo"
className="footer d-flex border-top py-3 px-4"
>
<div className="container-fluid d-flex">
<a
className="d-block"
href={config.LMS_BASE_URL}
aria-label={intl.formatMessage(messages['footer.logo.ariaLabel'])}
onClick={externalLinkClickHandler}
>
<img
style={{ maxHeight: 45 }}
src={logo || config.LOGO_TRADEMARK_URL}
alt={intl.formatMessage(messages['footer.logo.altText'])}
/>
</a>
<div className="flex-grow-1" />
{showLanguageSelector && (
<LanguageSelector
options={supportedLanguages}
onSubmit={onLanguageSelected}
/>
)}
</div>
</footer>
);
};

SiteFooter.propTypes = {
intl: intlShape.isRequired,
logo: PropTypes.string,
onLanguageSelected: PropTypes.func,
supportedLanguages: PropTypes.arrayOf(PropTypes.shape({
Expand All @@ -91,5 +82,5 @@ SiteFooter.defaultProps = {
supportedLanguages: [],
};

export default injectIntl(SiteFooter);
export default SiteFooter;
export { EVENT_NAMES };
8 changes: 4 additions & 4 deletions src/components/LanguageSelector.jsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import React from 'react';
import PropTypes from 'prop-types';
import { injectIntl, intlShape, FormattedMessage } from '@edx/frontend-platform/i18n';
import { useIntl, FormattedMessage } from '@edx/frontend-platform/i18n';

const LanguageSelector = ({
intl, options, onSubmit, ...props
options, onSubmit, ...props
}) => {
const intl = useIntl();
const handleSubmit = (e) => {
e.preventDefault();
const languageCode = e.target.elements['site-footer-language-select'].value;
Expand Down Expand Up @@ -47,12 +48,11 @@ const LanguageSelector = ({
};

LanguageSelector.propTypes = {
intl: intlShape.isRequired,
onSubmit: PropTypes.func.isRequired,
options: PropTypes.arrayOf(PropTypes.shape({
value: PropTypes.string,
label: PropTypes.string,
})).isRequired,
};

export default injectIntl(LanguageSelector);
export default LanguageSelector;
3 changes: 3 additions & 0 deletions src/components/__snapshots__/Footer.test.jsx.snap
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ exports[`<Footer /> renders correctly renders with a language selector 1`] = `
aria-label="edX Home"
className="d-block"
href="http://localhost:18000"
onClick={[Function]}
>
<img
alt="Powered by Open edX"
Expand Down Expand Up @@ -81,6 +82,7 @@ exports[`<Footer /> renders correctly renders without a language selector 1`] =
aria-label="edX Home"
className="d-block"
href="http://localhost:18000"
onClick={[Function]}
>
<img
alt="Powered by Open edX"
Expand Down Expand Up @@ -111,6 +113,7 @@ exports[`<Footer /> renders correctly renders without a language selector in es
aria-label="edX Home"
className="d-block"
href="http://localhost:18000"
onClick={[Function]}
>
<img
alt="Powered by Open edX"
Expand Down