UNPKG

@hitachivantara/uikit-react-core

Version:
62 lines (61 loc) 2.61 kB
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 };