11"use client" ;
2- import { useState , useEffect } from "react" ;
2+ import { useState , useEffect , use } from "react" ;
3+ import { set } from "zod" ;
34
45export function useChangeTheme ( ) {
56 const [ theme , setTheme ] = useState ( "tomorrow" ) ;
67 useEffect ( ( ) => {
8+ const checkIsDarkSchemePreferred = ( ) =>
9+ window ?. matchMedia ?.( '(prefers-color-scheme:dark)' ) ?. matches ?? false ;
10+ const initialTheme = checkIsDarkSchemePreferred ( ) ? "dark" : "light" ;
11+ document . documentElement . setAttribute ( "data-theme" , initialTheme ) ;
12+ setTheme ( initialTheme === "dark" ? "twilight" : "tomorrow" ) ;
13+
714 const updateTheme = ( ) => {
815 const theme = document . documentElement . getAttribute ( "data-theme" ) ;
916 setTheme ( theme === "dark" ? "twilight" : "tomorrow" ) ;
@@ -15,7 +22,6 @@ export function useChangeTheme(){
1522 attributeFilter : [ "data-theme" ] ,
1623 } ) ;
1724
18- updateTheme ( ) ; // 初回実行
1925
2026 return ( ) => observer . disconnect ( ) ;
2127 } , [ ] ) ;
@@ -24,25 +30,11 @@ export function useChangeTheme(){
2430} ;
2531export function ThemeToggle ( ) {
2632 const [ isChecked , setIsChecked ] = useState ( false ) ;
33+ const theme = useChangeTheme ( ) ;
2734 useEffect ( ( ) => {
28- const checkIsDarkSchemePreferred = ( ) =>
29- window ?. matchMedia ?.( '(prefers-color-scheme:dark)' ) ?. matches ?? false ;
30- setIsChecked ( checkIsDarkSchemePreferred ( ) ) ;
31-
32- const updateChecked = ( ) => {
33- const theme = document . documentElement . getAttribute ( "data-theme" ) ;
34- setIsChecked ( theme === "dark" ) ;
35- }
36-
37- const observer = new MutationObserver ( updateChecked ) ;
38- observer . observe ( document . documentElement , {
39- attributes : true ,
40- attributeFilter : [ "data-theme" ] ,
41- } ) ;
42-
43- return ( ) => observer . disconnect ( ) ;
44- } , [ ] ) ;
45-
35+ setIsChecked ( theme === "twilight" ) ;
36+ } , [ theme ] ) ;
37+
4638 return (
4739 < label className = "flex cursor-pointer gap-2" style = { { marginLeft : "1em" } } >
4840 < svg
0 commit comments