mirror of
https://github.com/Sonny93/my-links.git
synced 2025-12-08 14:43:24 +00:00
54 lines
1.4 KiB
TypeScript
54 lines
1.4 KiB
TypeScript
import dayjs from 'dayjs';
|
|
import { useTranslation } from 'react-i18next';
|
|
import Selector from '~/components/common/form/selector';
|
|
import { LS_LANG_KEY } from '~/constants';
|
|
import { languages } from '~/i18n';
|
|
|
|
type Country = 'fr' | 'en';
|
|
|
|
export default function LangSelector({
|
|
onSelected,
|
|
}: {
|
|
onSelected?: (country: Country) => void;
|
|
}) {
|
|
const { t, i18n } = useTranslation('common');
|
|
|
|
const onToggleLanguageClick = (newLocale: string) => {
|
|
dayjs.locale(newLocale);
|
|
i18n.changeLanguage(newLocale);
|
|
localStorage.setItem(LS_LANG_KEY, newLocale);
|
|
};
|
|
|
|
return (
|
|
<Selector
|
|
name="lng-select"
|
|
label={t('select-your-lang')}
|
|
value={i18n.language}
|
|
onChangeCallback={(value) => {
|
|
onToggleLanguageClick(value.toString());
|
|
if (onSelected) {
|
|
setTimeout(() => onSelected(value.toString() as Country), 150);
|
|
}
|
|
}}
|
|
options={languages.map((lang: Country) => ({
|
|
label: t(`language.${lang}`),
|
|
value: lang,
|
|
}))}
|
|
formatOptionLabel={(country) => (
|
|
<div
|
|
className="country-option"
|
|
style={{ display: 'flex', gap: '.5em', alignItems: 'center' }}
|
|
>
|
|
<img
|
|
src={`/icons/${country.value}.svg`}
|
|
alt="country-image"
|
|
height={24}
|
|
width={24}
|
|
/>
|
|
<span>{country.label}</span>
|
|
</div>
|
|
)}
|
|
/>
|
|
);
|
|
}
|