import { useState, useEffect, useRef } from 'react'; import { useTheme } from '@emotion/react'; import { useLocation } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import dayjs from 'dayjs'; import { ToggleField, SelectField } from 'components'; import { useSettingsStore, useLocaleUpdateStore } from 'stores'; import { OpenButton, Modal, Heading, Cover, } from './settingsStyle'; import locales from 'res/dayjs_locales'; // Language specific options const setDefaults = (lang, store) => { if (locales.hasOwnProperty(lang)) { store.setWeekStart(locales[lang].weekStart); store.setTimeFormat(locales[lang].timeFormat); } }; const Settings = () => { const { pathname } = useLocation(); const theme = useTheme(); const store = useSettingsStore(); const [isOpen, _setIsOpen] = useState(false); const { t, i18n } = useTranslation('common'); const setLocale = useLocaleUpdateStore(state => state.setLocale); const firstControlRef = useRef(); const onEsc = e => { if (e.key === 'Escape') { setIsOpen(false); } }; const setIsOpen = open => { _setIsOpen(open); if (open) { window.setTimeout(() => firstControlRef.current.focus(), 150); document.addEventListener('keyup', onEsc, true); } else { document.removeEventListener('keyup', onEsc); } }; useEffect(() => { if (Object.keys(locales).includes(i18n.language)) { locales[i18n.language].import().then(() => { dayjs.locale(i18n.language); setLocale(dayjs.locale()); document.documentElement.setAttribute('lang', i18n.language); }); } else { setLocale('en'); document.documentElement.setAttribute('lang', 'en') } }, [i18n.language, setLocale]); if (!i18n.options.storedLang) { setDefaults(i18n.language, store); i18n.options.storedLang = i18n.language; } i18n.on('languageChanged', lang => { setDefaults(lang, store); }); // Reset scroll on navigation useEffect(() => window.scrollTo(0, 0), [pathname]); return ( <> setIsOpen(!isOpen)} title={t('options.name')} > setIsOpen(false)} /> {t('options.name')} store.setWeekStart(value === 'Sunday' ? 0 : 1)} inputRef={firstControlRef} /> store.setTimeFormat(value)} /> store.setTheme(value)} /> store.setHighlight(value === 'On')} /> { ls[l] = locales[l].name; return ls; }, {}), ...process.env.NODE_ENV !== 'production' && { 'cimode': 'DEV' }, }} small value={i18n.language} onChange={event => i18n.changeLanguage(event.target.value)} /> ); }; export default Settings;