Skip to content

Commit dd4af33

Browse files
author
Ahtesham Quraish
committed
fix: Replace custom language names list with standard Intl DisplayNames API #2332
1 parent 0e1550a commit dd4af33

File tree

7 files changed

+153
-236
lines changed

7 files changed

+153
-236
lines changed

package-lock.json

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"start": "fedx-scripts webpack-dev-server --progress",
1919
"start:with-theme": "paragon install-theme && npm start && npm install",
2020
"dev": "PUBLIC_PATH=/authoring/ MFE_CONFIG_API_URL='http://localhost:8000/api/mfe_config/v1' fedx-scripts webpack-dev-server --progress --host apps.local.openedx.io",
21-
"test": "TZ=UTC fedx-scripts jest --coverage --passWithNoTests",
21+
"test": "TZ=UTC fedx-scripts jest --passWithNoTests",
2222
"test:ci": "TZ=UTC fedx-scripts jest --silent --coverage --passWithNoTests",
2323
"types": "tsc --noEmit"
2424
},
@@ -73,6 +73,7 @@
7373
"file-saver": "^2.0.5",
7474
"formik": "2.4.6",
7575
"frontend-components-tinymce-advanced-plugins": "^1.0.3",
76+
"iso-639-1": "^3.1.5",
7677
"jszip": "^3.10.1",
7778
"lodash": "4.17.21",
7879
"meilisearch": "^0.41.0",

src/editors/containers/VideoEditor/components/VideoSettingsModal/components/TranscriptWidget/LanguageSelector.jsx

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ import { Check } from '@openedx/paragon/icons';
1212
import { connect, useDispatch } from 'react-redux';
1313
import { useIntl } from '@edx/frontend-platform/i18n';
1414
import { thunkActions, selectors } from '../../../../../../data/redux';
15-
import { videoTranscriptLanguages } from '../../../../../../data/constants/video';
1615
import { FileInput, fileInput } from '../../../../../../sharedComponents/FileInput';
16+
import { getLanguageName } from '../../../../../../data/constants/video';
1717
import messages from './messages';
1818

1919
export const hooks = {
@@ -45,27 +45,27 @@ export const hooks = {
4545
};
4646

4747
const LanguageSelector = ({
48-
index, // For a unique id for the form control
48+
index,
4949
language,
50-
// Redux
51-
openLanguages, // Only allow those languages not already associated with a transcript to be selected
50+
openLanguages,
5251
}) => {
5352
const intl = useIntl();
53+
const dispatch = useDispatch();
54+
5455
const [localLang, setLocalLang] = React.useState(language);
55-
const input = fileInput({ onAddFile: hooks.addFileCallback({ dispatch: useDispatch(), localLang }) });
56+
const input = fileInput({ onAddFile: hooks.addFileCallback({ dispatch, localLang }) });
5657
const onLanguageChange = hooks.onSelectLanguage({
57-
dispatch: useDispatch(), languageBeforeChange: localLang, setLocalLang, triggerupload: input.click,
58+
dispatch, languageBeforeChange: localLang, setLocalLang, triggerupload: input.click,
5859
});
5960

6061
const getTitle = () => {
61-
if (Object.prototype.hasOwnProperty.call(videoTranscriptLanguages, language)) {
62+
if (language) {
6263
return (
6364
<ActionRow>
64-
{videoTranscriptLanguages[language]}
65+
{getLanguageName(language)}
6566
<ActionRow.Spacer />
6667
<Icon className="text-primary-500" src={Check} />
6768
</ActionRow>
68-
6969
);
7070
}
7171
return (
@@ -78,10 +78,7 @@ const LanguageSelector = ({
7878

7979
return (
8080
<>
81-
82-
<Dropdown
83-
className="w-100 mb-2"
84-
>
81+
<Dropdown className="w-100 mb-2">
8582
<Dropdown.Toggle
8683
iconAs={Button}
8784
aria-label={intl.formatMessage(messages.languageSelectLabel)}
@@ -93,14 +90,25 @@ const LanguageSelector = ({
9390
{getTitle()}
9491
</Dropdown.Toggle>
9592
<Dropdown.Menu>
96-
{Object.entries(videoTranscriptLanguages).map(([lang, text]) => {
93+
{openLanguages.map(lang => {
94+
const name = getLanguageName(lang);
95+
9796
if (language === lang) {
98-
return (<Dropdown.Item>{text}<Icon className="text-primary-500" src={Check} /></Dropdown.Item>);
99-
}
100-
if (openLanguages.some(row => row.includes(lang))) {
101-
return (<Dropdown.Item onClick={() => onLanguageChange({ newLang: lang })}>{text}</Dropdown.Item>);
97+
return (
98+
<Dropdown.Item key={lang}>
99+
{name}
100+
<Icon className="text-primary-500" src={Check} />
101+
</Dropdown.Item>
102+
);
102103
}
103-
return (<Dropdown.Item className="disabled">{text}</Dropdown.Item>);
104+
return (
105+
<Dropdown.Item
106+
key={lang}
107+
onClick={() => onLanguageChange({ newLang: lang })}
108+
>
109+
{name}
110+
</Dropdown.Item>
111+
);
104112
})}
105113
</Dropdown.Menu>
106114
</Dropdown>

src/editors/containers/VideoEditor/components/VideoSettingsModal/components/TranscriptWidget/LanguageSelector.test.jsx

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from 'react';
22
import {
3-
render, screen, initializeMocks, fireEvent,
3+
render, screen, initializeMocks,
44
} from '@src/testUtils';
55
import LanguageSelector from './LanguageSelector';
66
import { selectors } from '../../../../../../data/redux';
@@ -13,19 +13,22 @@ const lang3 = 'sImLisH';
1313
const lang3Code = 'sl';
1414

1515
jest.mock('../../../../../../data/constants/video', () => ({
16-
videoTranscriptLanguages: {
17-
[lang1Code]: lang1,
18-
[lang2Code]: lang2,
19-
[lang3Code]: lang3,
20-
},
16+
getLanguageName: jest.fn((code) => {
17+
const mockMap = {
18+
kl: lang1,
19+
el: lang2,
20+
sl: lang3,
21+
};
22+
return mockMap[code] || code;
23+
}),
2124
}));
2225

2326
describe('LanguageSelector', () => {
2427
const props = {
2528
onSelect: jest.fn().mockName('props.OnSelect'),
2629
index: 1,
2730
language: lang1Code,
28-
openLanguages: [[lang2Code, lang2], [lang3Code, lang3]],
31+
openLanguages: [lang2Code, lang3Code, lang1Code],
2932
};
3033
beforeEach(() => {
3134
initializeMocks();
@@ -46,13 +49,4 @@ describe('LanguageSelector', () => {
4649
render(<LanguageSelector {...props} language="" />);
4750
expect(screen.getByText('Select Language')).toBeInTheDocument();
4851
});
49-
50-
test('transcripts no Open Languages, all dropdown items should be disabled', () => {
51-
const { video } = selectors;
52-
jest.spyOn(video, 'openLanguages').mockReturnValue([]);
53-
const { container } = render(<LanguageSelector {...props} language="" />);
54-
fireEvent.click(screen.getByRole('button', { name: 'Languages' }));
55-
const disabledItems = container.querySelectorAll('.disabled.dropdown-item');
56-
expect(disabledItems.length).toBe(3);
57-
});
5852
});

0 commit comments

Comments
 (0)