File size: 1,902 Bytes
83106dd
970eef1
83106dd
 
 
 
 
970eef1
 
83106dd
 
 
970eef1
 
83106dd
 
 
 
 
970eef1
83106dd
 
 
 
970eef1
83106dd
970eef1
83106dd
 
 
 
970eef1
83106dd
 
 
970eef1
 
83106dd
 
 
 
 
970eef1
83106dd
970eef1
 
83106dd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import { useState, useEffect, createContext, useContext } from "react";

// Créer un contexte pour le thème
const ThemeModeContext = createContext();

// Provider pour le contexte du thème
export const ThemeModeProvider = ({ children }) => {
  // Get system preference
  const getSystemPreference = () => {
    return window.matchMedia("(prefers-color-scheme: dark)").matches
      ? "dark"
      : "light";
  };

  // Essayer de récupérer le mode depuis localStorage ou utiliser la préférence système
  const getSavedTheme = () => {
    const savedTheme = localStorage.getItem("theme-mode");
    return savedTheme || getSystemPreference();
  };

  // Initialize theme mode from saved or system preference
  const [mode, setMode] = useState(getSavedTheme);

  // Listen to system preference changes if no saved preference
  useEffect(() => {
    const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
    const handleChange = (e) => {
      // Only change if no user preference is saved
      if (!localStorage.getItem("theme-mode")) {
        setMode(e.matches ? "dark" : "light");
      }
    };

    mediaQuery.addEventListener("change", handleChange);
    return () => mediaQuery.removeEventListener("change", handleChange);
  }, []);

  // Save theme preference to localStorage when it changes
  useEffect(() => {
    localStorage.setItem("theme-mode", mode);
  }, [mode]);

  const toggleTheme = () => {
    setMode((prevMode) => (prevMode === "light" ? "dark" : "light"));
  };

  return (
    <ThemeModeContext.Provider value={{ mode, toggleTheme }}>
      {children}
    </ThemeModeContext.Provider>
  );
};

// Hook pour utiliser le contexte du thème
export const useThemeMode = () => {
  const context = useContext(ThemeModeContext);
  if (context === undefined) {
    throw new Error("useThemeMode must be used within a ThemeModeProvider");
  }
  return context;
};