UNPKG

react-garden

Version:

React + TypeScript + ThreeJS app using Material UI on NextJS, Apollo Client, GraphQL + WordPress REST APIs, for ThreeD web development.. a part of the threed.ai code family.

100 lines (86 loc) 3.1 kB
// ** React Imports import { createContext, useState, useEffect } from 'react' // ** ThemeConfig Import import themeConfig from '~/configs/themeConfig' const initialSettings = { themeColor: 'threed', mode: themeConfig.mode, footer: themeConfig.footer, layout: themeConfig.layout, lastLayout: themeConfig.layout, direction: themeConfig.direction, navHidden: themeConfig.navHidden, appBarBlur: themeConfig.appBarBlur, navCollapsed: themeConfig.navCollapsed, contentWidth: themeConfig.contentWidth, toastPosition: themeConfig.toastPosition, verticalNavToggleType: themeConfig.verticalNavToggleType, skin: themeConfig.layout === 'horizontal' && themeConfig.skin === 'semi-dark' ? 'default' : themeConfig.skin, appBar: themeConfig.layout === 'horizontal' && themeConfig.appBar === 'hidden' ? 'fixed' : themeConfig.appBar } const staticSettings = { appBar: initialSettings.appBar, footer: initialSettings.footer, layout: initialSettings.layout, navHidden: initialSettings.navHidden, lastLayout: initialSettings.lastLayout, toastPosition: initialSettings.toastPosition } const restoreSettings = () => { let settings = null try { const storedData = window.localStorage.getItem('settings') if (storedData) { settings = { ...JSON.parse(storedData), ...staticSettings } } else { settings = initialSettings } } catch (err) { console.error(err) } return settings } // set settings in localStorage const storeSettings = settings => { const initSettings = { ...settings } delete initSettings.appBar delete initSettings.footer delete initSettings.layout delete initSettings.navHidden delete initSettings.lastLayout delete initSettings.toastPosition window.localStorage.setItem('settings', JSON.stringify(initSettings)) } // ** Create Context export const SettingsContext = createContext({ saveSettings: () => null, settings: initialSettings }) export const SettingsProvider = ({ children, pageSettings }) => { // ** State const [settings, setSettings] = useState({ ...initialSettings }) const saveSettings = updatedSettings => { storeSettings(updatedSettings) setSettings(updatedSettings) } useEffect(() => { const restoredSettings = restoreSettings() if (restoredSettings) { setSettings({ ...restoredSettings }) } if (pageSettings) { setSettings({ ...settings, ...pageSettings }) } }, [pageSettings]) useEffect(() => { if (settings.layout === 'horizontal' && settings.skin === 'semi-dark') { saveSettings({ ...settings, skin: 'default' }) } if (settings.layout === 'horizontal' && settings.appBar === 'hidden') { saveSettings({ ...settings, appBar: 'fixed' }) } }, [settings.layout]) // eslint-disable-next-line react/jsx-no-constructed-context-values return <SettingsContext.Provider value={{ settings, saveSettings }}>{children}</SettingsContext.Provider> } export const SettingsConsumer = SettingsContext.Consumer