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