Git Product home page Git Product logo

Comments (2)

ChrAlpha avatar ChrAlpha commented on June 12, 2024

Step further, I dig out sth intereting.

When I try using Context to feat next-themes manually, both color scheme and background color of Disqus are correct.

You can check this demo.

my code goes here
'use client'

import { useState, useEffect, useContext, createContext } from 'react'

const ThemeContext = createContext()

export const useTheme = () => {
  return useContext(ThemeContext)
}

export const ThemeProviders = ({ children }) => {
  const [theme, setTheme] = useState('system')
  const [colorScheme, setColorScheme] = useState('light')

  const toggleTheme = (color) => {
    if (color !== 'system' && color !== 'light' && color !== 'dark') {
      color = 'system'
    }
    setTheme(color)
    typeof window !== 'undefined' && localStorage.setItem('user-color-scheme', color)
  }

  useEffect(() => {
    let localTheme = localStorage.getItem('user-color-scheme')
    if (localTheme && localTheme !== 'system') {
      setTheme(localTheme)
    }

    const handleColorSchemeChange = (event) => {
      if (!event) {
        event = window.matchMedia("(prefers-color-scheme: dark)")
      }
      if (event.matches) {
        setColorScheme("dark")
      } else {
        setColorScheme("light")
      }
    }

    handleColorSchemeChange()
    window.matchMedia("(prefers-color-scheme: dark)").addListener(handleColorSchemeChange)

    return () => {
      window.matchMedia("(prefers-color-scheme: dark)").removeListener(handleColorSchemeChange)
    }
  }, [])


  useEffect(() => {
    document.documentElement.classList.add(theme === 'system' ? colorScheme : theme)
    return () => {
      document.documentElement.classList.remove(theme === 'system' ? colorScheme : theme)
    }
  }, [theme, colorScheme])

  return (
    <ThemeContext.Provider value={{ theme, toggleTheme }}>
      <script dangerouslySetInnerHTML={{__html: `document.documentElement.classList.add((typeof localStorage.getItem('user-color-scheme') === 'undefined' || localStorage.getItem('user-color-scheme') === 'system') ? (window.matchMedia("(prefers-color-scheme: dark)").matches ? 'dark' : 'light') : (localStorage.getItem('user-color-scheme') === 'dark' ? 'dark' : 'light'))`}} />
      {children}
    </ThemeContext.Provider>
  )
}

export const ToggleTheme = ({ responsive }) => {
  const [mounted, setMounted] = useState(false)
  const { theme, toggleTheme } = useTheme()

  useEffect(() => {
    setMounted(true)
  }, [])

  if (!mounted) {
    return null
  }

  return (
...

from next-themes.

trm217 avatar trm217 commented on June 12, 2024

Not a issue related to the library but rather faulty usage.

from next-themes.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.