@atlaskit/motion
Version:
A set of utilities to apply motion in your application.
25 lines (24 loc) • 869 B
JavaScript
import { useEffect, useState } from 'react';
import { bind } from 'bind-event-listener';
import { isMatchMediaAvailable } from './is-match-media-available';
import { isReducedMotion } from './is-reduced-motion';
/**
* A React hook version of {@link isReducedMotion}.
* Useful for React components that need to re-render if the user's motion
* preference changes at runtime.
*/
export const useIsReducedMotion = () => {
const [prefersReducedMotion, setPrefersReducedMotion] = useState(isReducedMotion);
useEffect(() => {
if (!isMatchMediaAvailable()) {
return;
}
const mediaQueryList = window.matchMedia('(prefers-reduced-motion: reduce)');
const onChange = event => setPrefersReducedMotion(event.matches);
return bind(mediaQueryList, {
type: 'change',
listener: onChange
});
}, []);
return prefersReducedMotion;
};