import { ReactNode, createContext } from 'react'; // hooks import useLocalStorage from '../hooks/useLocalStorage'; // utils import getColorPresets, { colorPresets, defaultPreset } from '../utils/getColorPresets'; // config import { defaultSettings } from '../config'; // @type import { ThemeMode, ThemeLayout, ThemeDirection, ThemeColorPresets, SettingsContextProps, } from '../components/settings/type'; // ---------------------------------------------------------------------- const initialState: SettingsContextProps = { ...defaultSettings, onChangeMode: () => {}, onToggleMode: () => {}, onChangeDirection: () => {}, onChangeColor: () => {}, onToggleStretch: () => {}, onChangeLayout: () => {}, onResetSetting: () => {}, setColor: defaultPreset, colorOption: [], }; const SettingsContext = createContext(initialState); type SettingsProviderProps = { children: ReactNode; }; function SettingsProvider({ children }: SettingsProviderProps) { const [settings, setSettings] = useLocalStorage('settings', { themeMode: initialState.themeMode, themeDirection: initialState.themeDirection, themeColorPresets: initialState.themeColorPresets, themeStretch: initialState.themeStretch, themeLayout: initialState.themeLayout, }); const onChangeMode = (event: React.ChangeEvent) => { setSettings({ ...settings, themeMode: (event.target as HTMLInputElement).value as ThemeMode, }); }; const onToggleMode = () => { setSettings({ ...settings, themeMode: settings.themeMode === 'light' ? 'dark' : 'light', }); }; const onChangeDirection = (event: React.ChangeEvent) => { setSettings({ ...settings, themeDirection: (event.target as HTMLInputElement).value as ThemeDirection, }); }; const onChangeColor = (event: React.ChangeEvent) => { setSettings({ ...settings, themeColorPresets: (event.target as HTMLInputElement).value as ThemeColorPresets, }); }; const onChangeLayout = (event: React.ChangeEvent) => { setSettings({ ...settings, themeLayout: (event.target as HTMLInputElement).value as ThemeLayout, }); }; const onToggleStretch = () => { setSettings({ ...settings, themeStretch: !settings.themeStretch, }); }; const onResetSetting = () => { setSettings({ themeMode: initialState.themeMode, themeLayout: initialState.themeLayout, themeStretch: initialState.themeStretch, themeDirection: initialState.themeDirection, themeColorPresets: initialState.themeColorPresets, }); }; return ( ({ name: color.name, value: color.main, })), // Stretch onToggleStretch, // Navbar Horizontal onChangeLayout, // Reset Setting onResetSetting, }} > {children} ); } export { SettingsProvider, SettingsContext };