2021-03-13 03:35:50 +01:00
|
|
|
//
|
|
|
|
// adapted from
|
|
|
|
// https://github.com/daveschumaker/react-dark-mode-hook/blob/master/useDarkMode.js
|
|
|
|
//
|
|
|
|
import { useState, useEffect, useCallback } from 'react'
|
|
|
|
|
|
|
|
const isClient = typeof window === 'object'
|
|
|
|
|
|
|
|
function getDarkMode() {
|
|
|
|
// if (localStorage.getItem('theme') === 'dark') {
|
|
|
|
// return true
|
|
|
|
// } else if (localStorage.getItem('theme') === 'light') {
|
|
|
|
// return false
|
|
|
|
// }
|
|
|
|
|
|
|
|
if (
|
|
|
|
isClient &&
|
|
|
|
window.matchMedia &&
|
|
|
|
window.matchMedia('(prefers-color-scheme: dark)').matches
|
|
|
|
) {
|
|
|
|
return true
|
|
|
|
} else {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export default function useDarkMode() {
|
2022-11-16 00:14:59 +01:00
|
|
|
const [darkMode, setDarkMode] = useState(getDarkMode())
|
|
|
|
const [themeColor, setThemeColor] = useState<string>()
|
2021-03-13 03:35:50 +01:00
|
|
|
|
2022-11-16 00:14:59 +01:00
|
|
|
const toggleDarkMode = useCallback(() => {
|
2021-03-13 03:51:52 +01:00
|
|
|
setDarkMode(!darkMode)
|
2022-11-16 00:14:59 +01:00
|
|
|
}, [darkMode])
|
|
|
|
|
|
|
|
//
|
|
|
|
// Do things when darkMode changes
|
|
|
|
//
|
|
|
|
useEffect(() => {
|
|
|
|
const bodyClassList = document.body.classList
|
|
|
|
bodyClassList.toggle('dark')
|
|
|
|
bodyClassList.toggle('light')
|
|
|
|
setThemeColor(darkMode === true ? '#1d2224' : '#e7eef4')
|
|
|
|
}, [darkMode])
|
2021-03-13 03:51:52 +01:00
|
|
|
|
2021-03-13 03:35:50 +01:00
|
|
|
//
|
|
|
|
// Handle system theme change events
|
|
|
|
//
|
|
|
|
const handleChange = useCallback(() => {
|
|
|
|
setDarkMode(getDarkMode())
|
|
|
|
}, [])
|
|
|
|
|
|
|
|
useEffect(() => {
|
2022-11-16 00:14:59 +01:00
|
|
|
if (!isClient) return
|
2021-03-13 03:35:50 +01:00
|
|
|
|
|
|
|
const darkModeQuery = window.matchMedia('(prefers-color-scheme: dark)')
|
|
|
|
|
|
|
|
try {
|
|
|
|
darkModeQuery.addEventListener('change', handleChange)
|
|
|
|
} catch (addEventListenerError) {
|
2021-03-13 03:51:52 +01:00
|
|
|
console.error(addEventListenerError)
|
2021-03-13 03:35:50 +01:00
|
|
|
}
|
2021-03-13 03:51:52 +01:00
|
|
|
|
2021-03-13 03:35:50 +01:00
|
|
|
return () =>
|
|
|
|
window
|
|
|
|
.matchMedia('(prefers-color-scheme: dark)')
|
|
|
|
.removeEventListener('change', handleChange)
|
|
|
|
}, [handleChange])
|
|
|
|
|
2022-11-16 00:14:59 +01:00
|
|
|
return { value: darkMode, toggle: toggleDarkMode, themeColor }
|
2021-03-13 03:35:50 +01:00
|
|
|
}
|