UseThemeSwitcher
This useThemeSwitcher
is used for
switching Light and Dark theme.
UseThemeSwitcher
useThemeSwitcher.tsx
'use client'
import React, { useEffect, useState } from 'react'
const UseThemeSwitcher = (): [string, React.Dispatch<string>] => {
const preferDarkQuery = '(prefer-color-schema: dark)'
const [mode, setMode] = useState<string>('')
useEffect(() => {
const mediaQuery = window.matchMedia(preferDarkQuery)
const userPref = window.localStorage.getItem('theme')
const handleChange = () => {
if (userPref) {
let check = userPref === 'dark' ? 'dark' : 'light'
setMode(check)
if (check === 'dark') {
document.documentElement.classList.add('dark')
} else {
document.documentElement.classList.remove('dark')
}
} else {
let check = mediaQuery.matches ? 'dark' : 'light'
setMode(check)
if (check === 'dark') {
document.documentElement.classList.add('dark')
} else {
document.documentElement.classList.remove('dark')
}
}
}
mediaQuery.addEventListener('change', handleChange)
return () => mediaQuery.removeEventListener('change', handleChange)
}, [])
useEffect(() => {
if (mode === 'dark') {
window.localStorage.setItem('theme', 'dark')
document.documentElement.classList.add('dark')
} else {
window.localStorage.setItem('theme', 'light')
document.documentElement.classList.remove('dark')
}
}, [mode])
return [mode, setMode]
}
export default UseThemeSwitcher
Usage
navbar.tsx
const [mode, setMode] = UseThemeSwitcher()
return (
<button
onClick={() => {
setMode(mode === 'light' ? 'dark' : 'light')
}}
>
{mode === 'dark' ? <SunIcon /> : <MoonIcon />}
</button>
)
Last updated on April 25, 2023