@chayns-components/core
Version:
A set of beautiful React components for developing your own applications with chayns.
40 lines • 1.49 kB
JavaScript
import { useCallback, useState } from 'react';
export const useListItemFocus = ({
uuid,
listGroupUuid,
isInKeyboardNavigationGroup,
updateActiveListItemUuid
}) => {
const [isFocusWithinListItem, setIsFocusWithinListItem] = useState(false);
const handleFocus = useCallback(event => {
setIsFocusWithinListItem(true);
if (event.currentTarget === event.target && isInKeyboardNavigationGroup && typeof updateActiveListItemUuid === 'function') {
updateActiveListItemUuid(uuid);
}
}, [isInKeyboardNavigationGroup, updateActiveListItemUuid, uuid]);
const handleBlur = useCallback(event => {
const nextFocusedElement = event.relatedTarget;
const currentListItemElement = event.currentTarget;
if (nextFocusedElement && currentListItemElement.contains(nextFocusedElement)) {
return;
}
setIsFocusWithinListItem(false);
if (!isInKeyboardNavigationGroup || typeof updateActiveListItemUuid !== 'function' || typeof listGroupUuid !== 'string') {
return;
}
if (!nextFocusedElement) {
updateActiveListItemUuid(undefined);
return;
}
const nextFocusedListItem = nextFocusedElement.closest(`[data-uuid^="${listGroupUuid}---"]`);
if (!nextFocusedListItem) {
updateActiveListItemUuid(undefined);
}
}, [isInKeyboardNavigationGroup, listGroupUuid, updateActiveListItemUuid]);
return {
isFocusWithinListItem,
handleFocus,
handleBlur
};
};
//# sourceMappingURL=useListItemFocus.js.map