1
mirror of https://github.com/jakejarvis/jarv.is.git synced 2026-04-21 10:45:30 -04:00

animated dark mode toggle 🌓

This commit is contained in:
2022-03-07 19:32:43 -05:00
parent 19394c1fb7
commit f5c8a7a21a
8 changed files with 229 additions and 31 deletions
+40
View File
@@ -0,0 +1,40 @@
// SSR-safe reduced motion hook:
// https://www.joshwcomeau.com/react/prefers-reduced-motion/#ssr-safety
import { useEffect, useState } from "react";
const QUERY = "(prefers-reduced-motion: no-preference)";
export const usePrefersReducedMotion = (): boolean => {
// default to no animations on server-side
const [prefersReducedMotion, setPrefersReducedMotion] = useState(true);
useEffect(() => {
// this can now be safely set for the first time on the client-side
setPrefersReducedMotion(!window.matchMedia(QUERY).matches);
// register a listener for changes
const listener = (event: MediaQueryListEvent) => {
setPrefersReducedMotion(!event.matches);
};
const mediaQueryList = window.matchMedia(QUERY);
if (mediaQueryList.addEventListener) {
mediaQueryList.addEventListener("change", listener);
} else {
// support deprecated listener API
mediaQueryList.addListener(listener);
}
// clean up the event listener
return () => {
if (mediaQueryList.removeEventListener) {
mediaQueryList.removeEventListener("change", listener);
} else {
mediaQueryList.removeListener(listener);
}
};
}, [setPrefersReducedMotion]);
return prefersReducedMotion;
};