Skip to content

Instantly share code, notes, and snippets.

@awareness481
Created March 14, 2023 13:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save awareness481/b8a0cd4e6d4b6a3f02f3aa9f3cc47e56 to your computer and use it in GitHub Desktop.
Save awareness481/b8a0cd4e6d4b6a3f02f3aa9f3cc47e56 to your computer and use it in GitHub Desktop.
// only works on react 18
import { useSyncExternalStore } from "react";
export const useColorScheme = () => {
const scheme = useSyncExternalStore(
subscribe,
getSnapshot,
getServerSnapshot
);
return scheme;
};
function getServerSnapshot() {
return "no-preference";
}
function getSnapshot() {
if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
return "dark";
}
if (window.matchMedia("(prefers-color-scheme: light)").matches) {
return "light";
}
return "no-preference";
}
function subscribe(callback: (callback: MediaQueryListEvent) => unknown) {
const isDark = window.matchMedia("(prefers-color-scheme: dark)");
const isLight = window.matchMedia("(prefers-color-scheme: light)");
isDark.addEventListener("change", callback);
isLight.addEventListener("change", callback);
return () => {
isDark.removeEventListener("change", callback);
isLight.removeEventListener("change", callback);
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment