Updating LocaleSwitcher to use hooks
This commit is contained in:
parent
18427f9fc6
commit
3105371954
@ -67,7 +67,7 @@ exports[`Header opening the Privacy Policy modal 1`] = `
|
|||||||
data-requires-js="true"
|
data-requires-js="true"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
data-component="withI18nextTranslation(LocaleSwitcher)"
|
data-component="LocaleSwitcher"
|
||||||
data-props="{}"
|
data-props="{}"
|
||||||
/>
|
/>
|
||||||
</li>
|
</li>
|
||||||
@ -143,7 +143,7 @@ exports[`Header opening the Privacy Policy modal while holding alt key 1`] = `
|
|||||||
data-requires-js="true"
|
data-requires-js="true"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
data-component="withI18nextTranslation(LocaleSwitcher)"
|
data-component="LocaleSwitcher"
|
||||||
data-props="{}"
|
data-props="{}"
|
||||||
/>
|
/>
|
||||||
</li>
|
</li>
|
||||||
@ -219,7 +219,7 @@ exports[`Header opening the Privacy Policy modal while holding ctrl key 1`] = `
|
|||||||
data-requires-js="true"
|
data-requires-js="true"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
data-component="withI18nextTranslation(LocaleSwitcher)"
|
data-component="LocaleSwitcher"
|
||||||
data-props="{}"
|
data-props="{}"
|
||||||
/>
|
/>
|
||||||
</li>
|
</li>
|
||||||
@ -295,7 +295,7 @@ exports[`Header opening the Privacy Policy modal while holding meta key 1`] = `
|
|||||||
data-requires-js="true"
|
data-requires-js="true"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
data-component="withI18nextTranslation(LocaleSwitcher)"
|
data-component="LocaleSwitcher"
|
||||||
data-props="{}"
|
data-props="{}"
|
||||||
/>
|
/>
|
||||||
</li>
|
</li>
|
||||||
@ -371,7 +371,7 @@ exports[`Header opening the Privacy Policy modal while holding shift key 1`] = `
|
|||||||
data-requires-js="true"
|
data-requires-js="true"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
data-component="withI18nextTranslation(LocaleSwitcher)"
|
data-component="LocaleSwitcher"
|
||||||
data-props="{}"
|
data-props="{}"
|
||||||
/>
|
/>
|
||||||
</li>
|
</li>
|
||||||
@ -448,7 +448,7 @@ exports[`Header rendering 1`] = `
|
|||||||
data-requires-js="true"
|
data-requires-js="true"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
data-component="withI18nextTranslation(LocaleSwitcher)"
|
data-component="LocaleSwitcher"
|
||||||
data-props="{}"
|
data-props="{}"
|
||||||
/>
|
/>
|
||||||
</li>
|
</li>
|
||||||
@ -524,7 +524,7 @@ exports[`Header rendering with no banner 1`] = `
|
|||||||
data-requires-js="true"
|
data-requires-js="true"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
data-component="withI18nextTranslation(LocaleSwitcher)"
|
data-component="LocaleSwitcher"
|
||||||
data-props="{}"
|
data-props="{}"
|
||||||
/>
|
/>
|
||||||
</li>
|
</li>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import React from 'react';
|
import React, { useState, useEffect, useCallback } from 'react';
|
||||||
import { withTranslation, Trans } from 'react-i18next';
|
import { Trans } from 'react-i18next';
|
||||||
|
|
||||||
import ExpandIcon from 'react-feather/dist/icons/chevrons-down';
|
import ExpandIcon from 'react-feather/dist/icons/chevrons-down';
|
||||||
|
|
||||||
@ -8,50 +8,40 @@ import i18n, { locales } from 'i18n';
|
|||||||
import localeToAvailable from './locale-to-available';
|
import localeToAvailable from './locale-to-available';
|
||||||
import style from './style.module.css';
|
import style from './style.module.css';
|
||||||
|
|
||||||
export class LocaleSwitcher extends React.PureComponent {
|
const LocaleSwitcher = () => {
|
||||||
state = {
|
const [ current, updateCurrent ] = useState(localeToAvailable(
|
||||||
current: localeToAvailable(
|
i18n.language || '',
|
||||||
i18n.language || '',
|
locales.map(l => l.code),
|
||||||
locales.map(l => l.code),
|
'en'));
|
||||||
'en')
|
|
||||||
}
|
|
||||||
|
|
||||||
componentDidMount() {
|
useEffect(() => {
|
||||||
i18n.on('languageChanged', this.handleLanguageChange);
|
i18n.on('languageChanged', updateCurrent);
|
||||||
}
|
|
||||||
|
|
||||||
componentWillUnmount() {
|
return () => {
|
||||||
i18n.off('languageChanged', this.handleLanguageChange);
|
i18n.off('languageChanged', updateCurrent);
|
||||||
}
|
};
|
||||||
|
});
|
||||||
|
|
||||||
handleSelectChange = ({ target }) => {
|
const handleSelectChange = useCallback(({ target }) => {
|
||||||
i18n.changeLanguage(target.value);
|
i18n.changeLanguage(target.value);
|
||||||
}
|
});
|
||||||
|
|
||||||
handleLanguageChange = lang => {
|
return <label>
|
||||||
this.setState({ current: lang });
|
<Trans>Language</Trans>
|
||||||
}
|
<div className={ style.switcher }>
|
||||||
|
<select data-testid="language-select"
|
||||||
|
value={ current }
|
||||||
|
onChange={ handleSelectChange }
|
||||||
|
>
|
||||||
|
{ locales.map(locale => (
|
||||||
|
<option value={ locale.code } key={ locale.code }>
|
||||||
|
{ locale.name }
|
||||||
|
</option>
|
||||||
|
)) }
|
||||||
|
</select>
|
||||||
|
<ExpandIcon />
|
||||||
|
</div>
|
||||||
|
</label>;
|
||||||
|
};
|
||||||
|
|
||||||
render() {
|
export default LocaleSwitcher;
|
||||||
const { current } = this.state;
|
|
||||||
|
|
||||||
return <label>
|
|
||||||
<Trans>Language</Trans>
|
|
||||||
<div className={ style.switcher }>
|
|
||||||
<select data-testid="language-select"
|
|
||||||
value={ current }
|
|
||||||
onChange={ this.handleSelectChange }
|
|
||||||
>
|
|
||||||
{ locales.map(locale => (
|
|
||||||
<option value={ locale.code } key={ locale.code }>
|
|
||||||
{ locale.name }
|
|
||||||
</option>
|
|
||||||
)) }
|
|
||||||
</select>
|
|
||||||
<ExpandIcon />
|
|
||||||
</div>
|
|
||||||
</label>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default withTranslation()(LocaleSwitcher);
|
|
||||||
|
@ -3,10 +3,10 @@ jest.mock('react-feather/dist/icons/chevrons-down', () =>
|
|||||||
'react-feather/dist/icons/chevrons-down'));
|
'react-feather/dist/icons/chevrons-down'));
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { render, fireEvent } from 'react-testing-library';
|
import { render, fireEvent, act } from 'react-testing-library';
|
||||||
|
|
||||||
import i18n from 'i18n';
|
import i18n from 'i18n';
|
||||||
import { LocaleSwitcher } from 'components/LocaleSwitcher';
|
import LocaleSwitcher from 'components/LocaleSwitcher';
|
||||||
|
|
||||||
// Ensure initial locale is always "en" during tests
|
// Ensure initial locale is always "en" during tests
|
||||||
jest.mock('./locale-to-available', () => jest.fn(() => 'en'));
|
jest.mock('./locale-to-available', () => jest.fn(() => 'en'));
|
||||||
@ -40,7 +40,11 @@ describe('LocaleSwitcher', () => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
expect(getByTestId('language-select').value).toEqual('en');
|
expect(getByTestId('language-select').value).toEqual('en');
|
||||||
i18n.emit('languageChanged', 'other');
|
|
||||||
|
act(() => {
|
||||||
|
i18n.emit('languageChanged', 'other');
|
||||||
|
});
|
||||||
|
|
||||||
expect(getByTestId('language-select').value).toEqual('other');
|
expect(getByTestId('language-select').value).toEqual('other');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user