import React, { useState, useEffect } from 'react' export enum Mode { Light, Dark, Unset, } export const useLightSwitch = (): Mode => { const darkMedia = window.matchMedia('(prefers-color-scheme: dark)') const lightMedia = window.matchMedia('(prefers-color-scheme: light)') const [dark, setDark] = useState(darkMedia.matches) const [light, setLight] = useState(lightMedia.matches) const unsed = !dark && !light useEffect(() => { const darkFn = (e: MediaQueryListEvent) => { setDark(e.matches) } const lightFn = (e: MediaQueryListEvent) => { setLight(e.matches) } darkMedia.addListener(darkFn) lightMedia.addListener(lightFn) return () => { darkMedia.removeListener(darkFn) lightMedia.removeListener(lightFn) } }, []) return unsed ? Mode.Unset : dark ? Mode.Dark : Mode.Light } export const modeSelector = (mode: Mode, { light, dark, unset }: { light?: A, dark?: B, unset?: C }): A | B | C | undefined => { switch (mode) { case Mode.Light: return light case Mode.Dark: return dark case Mode.Unset: return unset } } export const useModeSelector = ({ light, dark, unset }: { light?: A, dark?: B, unset?: C }): A | B | C | undefined => { const mode = useLightSwitch() return modeSelector(mode, { light, dark, unset }) }