@newrelic/gatsby-theme-newrelic
Version:
[](https://opensource.newrelic.com/oss-category/#community-project)
59 lines (50 loc) • 1.43 kB
JavaScript
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;