Back to Snippets
ReactTypeScript

React Dark Mode Toggle

A hook and component for toggling dark mode with system preference detection.

reactdark modethemetoggle
import { useState, useEffect } from class=class="text-emerald-400">"text-emerald-400">'react'

function useDarkMode(): [boolean, () => void] {
  const [isDark, setIsDark] = useState(() => {
    if (typeof window === class=class="text-emerald-400">"text-emerald-400">'undefined') return false
    const saved = localStorage.getItem(class=class="text-emerald-400">"text-emerald-400">'theme')
    if (saved) return saved === class=class="text-emerald-400">"text-emerald-400">'dark'
    return window.matchMedia(class=class="text-emerald-400">"text-emerald-400">'(prefers-color-scheme: dark)').matches
  })

  useEffect(() => {
    const root = document.documentElement
    if (isDark) {
      root.classList.add(class=class="text-emerald-400">"text-emerald-400">'dark')
      localStorage.setItem(class=class="text-emerald-400">"text-emerald-400">'theme', class=class="text-emerald-400">"text-emerald-400">'dark')
    } else {
      root.classList.remove(class=class="text-emerald-400">"text-emerald-400">'dark')
      localStorage.setItem(class=class="text-emerald-400">"text-emerald-400">'theme', class=class="text-emerald-400">"text-emerald-400">'light')
    }
  }, [isDark])

  const toggle = () => setIsDark(prev => !prev)

  return [isDark, toggle]
}

export default useDarkMode

How to Use

Use in your layout: const [isDark, toggleDark] = useDarkMode(). Call toggleDark() on a button click. It respects system preferences on first visit and persists the choice in localStorage.

Related Technology

React

Have a Project in Mind?

Let's discuss how we can bring your idea to life. From initial concept to production-ready product — we've got you covered.

or book a free call