import React, { createContext, useContext, useState, useEffect } from "react"; import { ConfigProvider, theme } from "antd"; const ThemeContext = createContext(); export const ThemeProvider = ({ children }) => { const [isDarkMode, setIsDarkMode] = useState(() => { const savedTheme = localStorage.getItem("theme"); return savedTheme === "dark"; }); useEffect(() => { localStorage.setItem("theme", isDarkMode ? "dark" : "light"); document.documentElement.classList.toggle("dark", isDarkMode); }, [isDarkMode]); const handleTheme = (event) => { const { clientX, clientY } = event; let outIsDark; const toggleTheme = () => { setIsDarkMode((prev) => { const newPrev = !prev; outIsDark = newPrev; return newPrev; }); }; if ("startViewTransition" in document) { const transition = document.startViewTransition(() => { toggleTheme(); }); transition.ready.then(() => { const radius = Math.hypot( Math.max(clientX, innerWidth - clientX), Math.max(clientY, innerHeight - clientY) ); const clipPath = [ `circle(0px at ${clientX}px ${clientY}px)`, `circle(${radius}px at ${clientX}px ${clientY}px)`, ]; document.documentElement.animate( { clipPath: outIsDark ? clipPath.reverse() : clipPath }, { duration: 300, easing: "ease-in", pseudoElement: outIsDark ? "::view-transition-old(root)" : "::view-transition-new(root)", } ); }); } else { toggleTheme(); } }; return ( {children} ); }; export const useTheme = () => { const context = useContext(ThemeContext); if (!context) { throw new Error("useTheme must be used within a ThemeProvider"); } return context; };