import { useEffect, useState } from 'react' import { useRecoilState } from "recoil"; import { themeStore } from '../../stores'; import { THEME, DEFAULT_THEME_KEY, getSystemDefaultTheme, storeTheme, ThemeOptions } from "../../lib/theme"; const options = [ { label: 'Dark', value: ThemeOptions.DARK, }, { label: 'Light', value: ThemeOptions.LIGHT, }, ]; const ThemePreferences = () => { const defaultTheme = getSystemDefaultTheme(); const [theme, setTheme] = useRecoilState(themeStore); const [selected, setSelected] = useState(theme.selectedTheme); const [useDefault, setUseDefault] = useState(theme.useDefault); const handleUpdateTheme = ({ selectedTheme, useDefault }: THEME) => { setTheme({ ...theme, selectedTheme, useDefault, }); storeTheme(selectedTheme); }; const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => { const selectedTheme = event.target.value as ThemeOptions setSelected(selectedTheme); handleUpdateTheme({ selectedTheme, useDefault: false }); }; const setDefaultThemePreference = (useDefaultTheme): void => { setUseDefault(useDefaultTheme) localStorage.setItem(DEFAULT_THEME_KEY, `${useDefaultTheme}`); if (useDefaultTheme) { handleUpdateTheme({ selectedTheme: defaultTheme, useDefault: useDefaultTheme, }); } }; useEffect(() => { setUseDefault(theme.useDefault) setSelected(theme.selectedTheme); }, [theme]); return ( <div className="flex flex-col gap-4"> <h3 className="text-lg">Theme preference</h3> <p> Your theme preference is saved per device. Any newly connected device will adopt the preference from the device it was connected by. </p> <div> <div className="form-control items-start"> <label className="label cursor-pointer"> <input type="checkbox" name="use-default-theme" className="checkbox checked:bg-base-content" checked={useDefault} onChange={(event) => setDefaultThemePreference(event.target.checked) } /> <span className="label-text text-sm ml-2">Use system default</span> </label> </div> {options.map((option, key) => ( <div key={key} className="form-control items-start"> <label className="label cursor-pointer"> <input type="radio" name="theme-preference" className="radio checked:bg-base-content" value={option.value} checked={selected === option.value} disabled={useDefault} onChange={handleChange} /> <span className="label-text text-sm ml-2">{option.label}</span> </label> </div> ))} </div> </div> ); } export default ThemePreferences;