@hitachivantara/uikit-react-core
Version:
Core React components for the NEXT Design System.
86 lines (85 loc) • 2.81 kB
JavaScript
import * as React from "react";
import { useEventCallback, ownerDocument } from "@mui/material/utils";
import { useInstanceEventHandler } from "../useInstanceEventHandler.js";
import { populateInstance } from "../utils.js";
const useTreeViewFocus = ({
instance,
params,
state,
setState,
models,
rootRef
}) => {
const setFocusedNodeId = useEventCallback(
(nodeId) => {
const cleanNodeId = typeof nodeId === "function" ? nodeId(state.focusedNodeId) : nodeId;
setState((prevState) => ({ ...prevState, focusedNodeId: cleanNodeId }));
}
);
const isNodeFocused = React.useCallback(
(nodeId) => state.focusedNodeId === nodeId,
[state.focusedNodeId]
);
const focusNode = useEventCallback(
(event, nodeId) => {
if (nodeId) {
setFocusedNodeId(nodeId);
if (params.onNodeFocus) {
params.onNodeFocus(event, nodeId);
}
}
}
);
populateInstance(instance, {
isNodeFocused,
focusNode
});
useInstanceEventHandler(instance, "removeNode", ({ id }) => {
setFocusedNodeId((oldFocusedNodeId) => {
if (oldFocusedNodeId === id && rootRef.current === ownerDocument(rootRef.current).activeElement) {
return instance.getChildrenIds(null)[0];
}
return oldFocusedNodeId;
});
});
const createHandleFocus = (otherHandlers) => (event) => {
otherHandlers.onFocus?.(event);
if (event.target === event.currentTarget) {
const isNodeVisible = (nodeId) => {
const node = instance.getNode(nodeId);
return node && (node.parentId == null || instance.isNodeExpanded(node.parentId));
};
let nodeToFocusId;
if (Array.isArray(models.selected.value)) {
nodeToFocusId = models.selected.value.find(isNodeVisible);
} else if (models.selected.value != null && isNodeVisible(models.selected.value)) {
nodeToFocusId = models.selected.value;
}
if (nodeToFocusId == null) {
nodeToFocusId = instance.getNavigableChildrenIds(null)[0];
}
instance.focusNode(event, nodeToFocusId);
}
};
const createHandleBlur = (otherHandlers) => (event) => {
otherHandlers.onBlur?.(event);
setFocusedNodeId(null);
};
const focusedNode = instance.getNode(state.focusedNodeId);
const activeDescendant = focusedNode ? focusedNode.idAttribute : null;
return {
getRootProps: (otherHandlers) => ({
onFocus: createHandleFocus(otherHandlers),
onBlur: createHandleBlur(otherHandlers),
"aria-activedescendant": activeDescendant ?? void 0
})
};
};
useTreeViewFocus.getInitialState = () => ({ focusedNodeId: null });
useTreeViewFocus.getDefaultizedParams = (params) => ({
...params,
disabledItemsFocusable: params.disabledItemsFocusable ?? false
});
export {
useTreeViewFocus
};