import { useState, useEffect, useRef } from 'react' import { useLocation } from 'react-router-dom' import { useTranslation } from 'react-i18next' import dayjs from 'dayjs' import { Settings as SettingsIcon } from 'lucide-react' import { maps } from 'hue-map' import { ToggleField, SelectField } from '/src/components' import { useSettingsStore, useLocaleUpdateStore } from '/src/stores' import { OpenButton, Modal, Heading, Cover, } from './Settings.styles' import locales from '/src/i18n/locales' import { unhyphenate } from '/src/utils' // Language specific options const setDefaults = (lang, store) => { if (locales[lang]) { store.setWeekStart(locales[lang].weekStart) store.setTimeFormat(locales[lang].timeFormat) } } const Settings = () => { const { pathname } = useLocation() 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)} /> [ palette, unhyphenate(palette) ])), }} small value={store.colormap} onChange={event => store.setColormap(event.target.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