Skip to content

Instantly share code, notes, and snippets.

@MikelArnaiz
Last active September 23, 2020 16:32
Show Gist options
  • Save MikelArnaiz/6231b95e435f4cb3b7b5a895a94be4d4 to your computer and use it in GitHub Desktop.
Save MikelArnaiz/6231b95e435f4cb3b7b5a895a94be4d4 to your computer and use it in GitHub Desktop.
Hook ColorScheme, is dark mode etc
import { useState, useEffect } from 'react'
export enum ColorScheme {
Dark = 'dark',
Light = 'light',
NoPreference = 'no-preference',
}
export const useIsColorScheme = (colorScheme: ColorScheme) => {
const [isColorScheme, setIsColorScheme] = useState<boolean>(false)
const onChange = (ev: MediaQueryListEvent) => {
setIsColorScheme(ev.matches)
}
useEffect(() => {
const matcher = window.matchMedia(`(prefers-color-scheme: ${colorScheme})`)
matcher.addEventListener('change', onChange)
setIsColorScheme(matcher.matches)
return () => {
matcher.removeEventListener('change', onChange)
}
}, [colorScheme])
return isColorScheme
}
export const useColorScheme = (initialValue: ColorScheme = ColorScheme.NoPreference): ColorScheme => {
const [colorScheme, setColorScheme] = useState<ColorScheme>(initialValue)
const isColorScheme: Record<ColorScheme, boolean> = {
[ColorScheme.Dark]: useIsColorScheme(ColorScheme.Dark),
[ColorScheme.Light]: useIsColorScheme(ColorScheme.Light),
[ColorScheme.NoPreference]: useIsColorScheme(ColorScheme.NoPreference),
}
useEffect(() => {
const [color] = entries(isColorScheme).find(([_k, isActive]) => isActive) ?? [initialValue, true]
setColorScheme(color)
}, [isColorScheme, initialValue])
return colorScheme
}
const entries = <K extends string | number | symbol, V>(o: Record<K, V>): Array<[K, V]> => {
return Object.entries(o) as Array<[K, V]>
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment