Skip to content

Commit c2d3ccc

Browse files
committed
refactor: make the lang selector a slot
1 parent c40231f commit c2d3ccc

File tree

7 files changed

+43
-224
lines changed

7 files changed

+43
-224
lines changed

README.rst

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -86,20 +86,6 @@ This library has the following exports:
8686
* ``messages``: Internationalization messages suitable for use with `@edx/frontend-platform/i18n <https://edx.github.io/frontend-platform/module-Internationalization.html>`_
8787
* ``dist/footer.scss``: A SASS file which contains style information for the component. It should be imported into the micro-frontend's own SCSS file.
8888

89-
Language Selector
90-
-----------------
91-
92-
The language selector dropdown is optional and can be enabled by setting the MFE configuration variable ``ENABLE_FOOTER_LANG_SELECTOR`` to ``true``.
93-
Secondly, configue the languages that should be displayed in the dropdown by setting the MFE configuration variable ``SITE_SUPPORTED_LANGUAGES`` to an array of locale languages.
94-
Example:
95-
96-
.. code-block:: python
97-
98-
MFE_CONFIG["EDX_FRONTEND_APP_CONFIG"] = {
99-
"ENABLE_FOOTER_LANG_SELECTOR": True,
100-
"SITE_SUPPORTED_LANGUAGES": ['en', 'es', 'fr', 'pt-br'],
101-
}
102-
10389
Plugin
10490
======
10591
The footer can be replaced or modified using `Frontend Plugin Framework <https://github.com/openedx/frontend-plugin-framework>`_.

src/components/Footer.jsx

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import { ensureConfig } from '@edx/frontend-platform';
66
import { AppContext } from '@edx/frontend-platform/react';
77

88
import messages from './Footer.messages';
9-
import LanguageSelector from './LanguageSelector';
9+
10+
import LanguageSelectorSlot from '../plugin-slots/LanguageSelectorSlot';
1011

1112
ensureConfig([
1213
'LMS_BASE_URL',
@@ -57,15 +58,9 @@ class SiteFooter extends React.Component {
5758
/>
5859
</a>
5960
<div className="flex-grow-1" />
60-
{config.ENABLE_FOOTER_LANG_SELECTOR && (
6161
<div className="mb-2">
62-
<LanguageSelector
63-
options={config.SITE_SUPPORTED_LANGUAGES}
64-
username={authenticatedUser?.username}
65-
langCookieName={config.LANGUAGE_PREFERENCE_COOKIE_NAME}
66-
/>
62+
<LanguageSelectorSlot />
6763
</div>
68-
)}
6964
</div>
7065
</footer>
7166
);
Lines changed: 11 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,27 @@
11
import React, { useMemo, useState } from 'react';
22
import PropTypes from 'prop-types';
3-
import { publish } from '@edx/frontend-platform';
4-
import {
5-
injectIntl, LOCALE_CHANGED, getLocale, handleRtl, getPrimaryLanguageSubtag,
6-
} from '@edx/frontend-platform/i18n';
7-
import { logError } from '@edx/frontend-platform/logging';
8-
import { Dropdown, useWindowSize } from '@openedx/paragon';
3+
import { changeUserSessionLanguage, getPrimaryLanguageSubtag, getSupportedLocaleList, getLocale } from '@edx/frontend-platform/i18n';
4+
import { Dropdown, Scrollable, useWindowSize } from '@openedx/paragon';
95
import { Language } from '@openedx/paragon/icons';
10-
import { getCookies } from '@edx/frontend-platform/i18n/lib';
11-
import { patchPreferences, postSetLang } from './data';
126

13-
const onLanguageSelected = async ({ langCookieName, username, selectedLlocale }) => {
14-
try {
15-
if (username) {
16-
await patchPreferences(username, { prefLang: selectedLlocale });
17-
await postSetLang(selectedLlocale);
18-
} else {
19-
getCookies().set(langCookieName, selectedLlocale);
20-
}
21-
publish(LOCALE_CHANGED, getLocale());
22-
handleRtl();
23-
} catch (error) {
24-
logError(error);
25-
}
26-
};
277
const getLocaleName = (locale) => {
288
const langName = new Intl.DisplayNames([locale], { type: 'language', languageDisplay: 'standard' }).of(locale);
299
return langName.replace(/^\w/, (c) => c.toUpperCase());
3010
};
3111

3212
const LanguageSelector = ({
33-
langCookieName, options, username,
13+
supportedLanguages = [], ...props
3414
}) => {
3515
const [currentLocale, setLocale] = useState(getLocale());
3616
const { width } = useWindowSize();
37-
38-
const handleSelect = (selectedLlocale) => {
17+
const options = supportedLanguages.length > 0 ? supportedLanguages : getSupportedLocaleList();
18+
19+
const handleSelect = async (selectedLlocale) => {
3920
if (currentLocale !== selectedLlocale) {
40-
onLanguageSelected({ langCookieName, username, selectedLlocale });
21+
await changeUserSessionLanguage(selectedLlocale);
4122
}
4223
setLocale(selectedLlocale);
4324
};
44-
4525
const currentLocaleLabel = useMemo(() => {
4626
if (width < 576) {
4727
return '';
@@ -63,20 +43,20 @@ const LanguageSelector = ({
6343
{currentLocaleLabel}
6444
</Dropdown.Toggle>
6545
<Dropdown.Menu>
46+
<Scrollable style={{'max-height': '40vh'}}>
6647
{options.map((locale) => (
6748
<Dropdown.Item key={`lang-selector-${locale}`} eventKey={locale}>
6849
{getLocaleName(locale)}
6950
</Dropdown.Item>
7051
))}
52+
</Scrollable>
7153
</Dropdown.Menu>
7254
</Dropdown>
7355
);
7456
};
7557

7658
LanguageSelector.propTypes = {
77-
langCookieName: PropTypes.string.isRequired,
78-
options: PropTypes.arrayOf(PropTypes.string).isRequired,
79-
username: PropTypes.string,
59+
supportedLanguages: PropTypes.arrayOf(PropTypes.string),
8060
};
8161

82-
export default injectIntl(LanguageSelector);
62+
export default LanguageSelector;

src/components/LanguageSelector/data.js

Lines changed: 0 additions & 30 deletions
This file was deleted.

src/components/LanguageSelector/index.test.jsx

Lines changed: 0 additions & 141 deletions
This file was deleted.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# FooterLanguageSelectorSlot
2+
3+
### Slot ID: `org.openedx.frontend.layout.footer_lang_selector.v1`
4+
5+
### Slot ID Aliases
6+
* `footer_lang_selector`
7+
8+
## Description
9+
10+
This slot is used to repace/modify/hide the language selector in the footer.
11+
12+
## Example
13+
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import React from 'react';
2+
import { PluginSlot } from '@openedx/frontend-plugin-framework';
3+
import PropTypes from 'prop-types';
4+
import LanguageSelector from '../../components/LanguageSelector';
5+
6+
const LanguageSelectorSlot = ({ supportedLanguages }) => (
7+
<PluginSlot id="org.openedx.frontend.layout.footer_lang_selector.v1" pluginProps={{ supportedLanguages }}>
8+
<LanguageSelector supportedLanguages={supportedLanguages} />
9+
</PluginSlot>
10+
);
11+
12+
LanguageSelectorSlot.propTypes = {
13+
supportedLanguages: PropTypes.arrayOf(PropTypes.string),
14+
};
15+
16+
export default LanguageSelectorSlot;

0 commit comments

Comments
 (0)