diff --git a/src/hooks/useMotionPreference.ts b/src/hooks/useMotionPreference.ts new file mode 100644 index 0000000..775f2de --- /dev/null +++ b/src/hooks/useMotionPreference.ts @@ -0,0 +1,29 @@ +import { useEffect, useState } from 'react'; +import { AccessibilityInfo } from 'react-native'; + +export type MotionPreferenceListener = (reduceMotion: boolean) => void; + +export function useMotionPreference(): boolean { + const [reduceMotion, setReduceMotion] = useState(false); + + useEffect(() => { + let mounted = true; + AccessibilityInfo.isReduceMotionEnabled() + .then((value) => { + if (mounted) setReduceMotion(value); + }) + .catch(() => undefined); + + const listener: MotionPreferenceListener = (value) => { + if (mounted) setReduceMotion(value); + }; + AccessibilityInfo.addEventListener('reduceMotionChanged', listener); + + return () => { + mounted = false; + AccessibilityInfo.removeEventListener('reduceMotionChanged', listener); + }; + }, []); + + return reduceMotion; +}