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
JavaScript
// ** 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