react-native-a11y
Version:
Improvements of a11y for ReactNative, this library improve work with reader and keyboard focus and reader in general.
63 lines (49 loc) • 1.48 kB
text/typescript
import { useRef, useCallback, type RefObject, useMemo } from 'react';
import { View } from 'react-native';
import { A11yModule } from '../../../modules';
import { debounce } from '../../../utils';
const SECONDS_PER_FRAME = 16;
const COUNT_OF_FRAMES = 1;
const DEBOUNCE_DELAY = SECONDS_PER_FRAME * COUNT_OF_FRAMES;
export const useA11yOrderManager = <T>(orderRef: RefObject<View>) => {
const currentRef = useRef<(T | null)[]>([]);
const registeredRefs = useRef<(T | null)[]>([]);
const refWasUpdated = useRef<boolean>(false);
const setOrder = useCallback(() => {
A11yModule.setA11yElementsOrder({
tag: orderRef,
views: registeredRefs.current,
});
}, [orderRef]);
const debounceOrder = useMemo(
() => debounce(setOrder, DEBOUNCE_DELAY),
[setOrder]
);
const registerOrderRef = useCallback(
(order: number) =>
(ref: T | null): void => {
refWasUpdated.current = true;
registeredRefs.current[order] = ref;
},
[]
);
const updateRefList = useCallback(() => {
if (!refWasUpdated.current) {
return;
}
refWasUpdated.current = false;
currentRef.current = registeredRefs.current.filter((v) => v);
debounceOrder();
}, [debounceOrder]);
const reset = useCallback(() => {
currentRef.current = [];
registeredRefs.current = [];
refWasUpdated.current = false;
}, []);
return {
registerOrderRef,
updateRefList,
reset,
setOrder,
};
};