perf: add useMemo to the return value of useTheme

This commit is contained in:
yusheng chen
2025-03-23 21:29:46 +08:00
parent 2890e036ed
commit 3ac00598ff

View File

@@ -1,4 +1,4 @@
import { useCallback, useEffect, useState } from "react"; import { useCallback, useEffect, useMemo, useState } from "react";
type Theme = "light" | "dark" | "system"; type Theme = "light" | "dark" | "system";
@@ -35,17 +35,18 @@ const useTheme = (): [Theme, (mode: Theme) => void] => {
darkModeMediaQuery.removeEventListener("change", handleDarkModeChange); darkModeMediaQuery.removeEventListener("change", handleDarkModeChange);
}; };
}, [theme]); }, [theme]);
return [ const setThemeWithSideEffect = useCallback((newTheme: Theme) => {
setTheme(newTheme);
localStorage.setItem("theme", newTheme);
if (newTheme !== "system") {
document.documentElement.classList.toggle("dark", newTheme === "dark");
}
}, []);
return useMemo(() => [
theme, theme,
useCallback((newTheme: Theme) => { setThemeWithSideEffect,
setTheme(newTheme); ], [theme]);
localStorage.setItem("theme", newTheme);
if (newTheme !== "system") {
document.documentElement.classList.toggle("dark", newTheme === "dark");
}
}, []),
];
}; };
export default useTheme; export default useTheme;