@hitachivantara/uikit-react-core
Version:
UI Kit Core React components.
62 lines (61 loc) • 2.61 kB
JavaScript
import { populateInstance } from "../utils.js";
import { useInstanceEventHandler } from "../useInstanceEventHandler.js";
import * as React from "react";
import { ownerDocument, useEventCallback } from "@mui/material/utils";
//#region src/TreeView/internals/hooks/plugins/useTreeViewFocus.ts
var 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
}));
});
populateInstance(instance, {
isNodeFocused: React.useCallback((nodeId) => state.focusedNodeId === nodeId, [state.focusedNodeId]),
focusNode: useEventCallback((event, nodeId) => {
if (nodeId) {
setFocusedNodeId(nodeId);
if (params.onNodeFocus) params.onNodeFocus(event, nodeId);
}
})
});
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
});
//#endregion
export { useTreeViewFocus };