From ea70ecbaa4beeac06503fabf49173acf5a51e3d3 Mon Sep 17 00:00:00 2001 From: fightrate-bot Date: Tue, 16 Jun 2026 01:46:09 -0300 Subject: [PATCH] feat(hooks): useMotionPreference for reduce motion respect (no test - jest preset conflicts with mocking react-native) --- src/hooks/useMotionPreference.ts | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/hooks/useMotionPreference.ts 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; +}