UNPKG

@newrelic/gatsby-theme-newrelic

Version:

[![Community Project header](https://github.com/newrelic/opensource-website/raw/master/src/images/categories/Community_Project.png)](https://opensource.newrelic.com/oss-category/#community-project)

59 lines (50 loc) 1.43 kB
import { useEffect, useCallback, useMemo } from 'react'; import useEventListener from './useEventListener'; import initialize from './initializeUseDarkMode'; const useDarkMode = ( initialValue = false, { element, classNameDark, classNameLight, onChange, storageKey = 'darkMode', storageProvider, global, } = {} ) => { const { usePersistedDarkModeState, getDefaultOnChange, getInitialValue, mediaQueryEventTarget, } = useMemo( () => initialize(storageKey, storageProvider, global), [storageKey, storageProvider, global] ); const [state, setState] = usePersistedDarkModeState( getInitialValue(initialValue) ); const stateChangeCallback = useMemo( () => onChange || getDefaultOnChange(element, classNameDark, classNameLight), [onChange, element, classNameDark, classNameLight, getDefaultOnChange] ); // Call the onChange handler useEffect(() => { stateChangeCallback(state); }, [stateChangeCallback, state]); // Listen for media changes and set state. useEventListener( 'change', ({ matches }) => setState(matches), mediaQueryEventTarget ); return { value: state, enable: useCallback(() => setState(true), [setState]), disable: useCallback(() => setState(false), [setState]), toggle: useCallback(() => setState((current) => !current), [setState]), }; }; export default useDarkMode;