import { createContext, useContext, useLayoutEffect, useMemo, useState } from 'react'; import useLocalStorage from '../hooks/useLocalStorage'; interface IThemeContext { darkMode: boolean noNavigation: boolean viewportHeight: string mainHeight: string toggleDarkMode: () => void toggleNoNavigation: () => void } const ThemeContext = createContext(null); export const useConceptTheme = () => { const context = useContext(ThemeContext); if (!context) { throw new Error( 'useConceptTheme has to be used within ' ); } return context; } interface ThemeStateProps { children: React.ReactNode } export const ThemeState = ({ children }: ThemeStateProps) => { const [darkMode, setDarkMode] = useLocalStorage('darkMode', false); const [noNavigation, setNoNavigation] = useState(false); const setDarkClass = (isDark: boolean) => { const root = window.document.documentElement; if (isDark) { root.classList.add('dark'); } else { root.classList.remove('dark'); } root.setAttribute('data-color-scheme', !isDark ? 'light' : 'dark'); }; useLayoutEffect(() => { setDarkClass(darkMode) }, [darkMode]); const mainHeight = useMemo( () => { return !noNavigation ? 'calc(100vh - 8.6rem)' : '100vh'; }, [noNavigation]); const viewportHeight = useMemo( () => { return !noNavigation ? 'calc(100vh - 3.9rem)' : '100vh'; }, [noNavigation]); return ( setDarkMode(prev => !prev), toggleNoNavigation: () => setNoNavigation(prev => !prev), viewportHeight, mainHeight }}> {children} ); }