@shopify/polaris
Version:
Shopify’s admin product component library
39 lines (29 loc) • 897 B
text/typescript
import {useContext, useMemo, useEffect} from 'react';
import {useUniqueId} from '../unique-id';
import {MissingAppProviderError} from '../errors';
import {FocusManagerContext} from './context';
interface Options {
trapping: boolean;
}
export function useFocusManager({trapping}: Options) {
const focusManager = useContext(FocusManagerContext);
const id = useUniqueId();
if (!focusManager) {
throw new MissingAppProviderError('No FocusManager was provided.');
}
const {
trapFocusList,
add: addFocusItem,
remove: removeFocusItem,
} = focusManager;
const canSafelyFocus = trapFocusList[0] === id;
const value = useMemo(() => ({canSafelyFocus}), [canSafelyFocus]);
useEffect(() => {
if (!trapping) return;
addFocusItem(id);
return () => {
removeFocusItem(id);
};
}, [addFocusItem, id, removeFocusItem, trapping]);
return value;
}