@mui/x-tree-view
Version:
The community edition of the MUI X Tree View components.
116 lines (114 loc) • 4 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useTreeViewFocus = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
var _useInstanceEventHandler = require("../../hooks/useInstanceEventHandler");
var _useTreeViewFocus = require("./useTreeViewFocus.selectors");
var _useTreeViewExpansion = require("../useTreeViewExpansion/useTreeViewExpansion.selectors");
var _useTreeViewItems = require("../useTreeViewItems/useTreeViewItems.selectors");
const useTreeViewFocus = ({
instance,
params,
store
}) => {
const setFocusedItemId = (0, _useEventCallback.default)(itemId => {
store.update(prevState => {
const focusedItemId = (0, _useTreeViewFocus.selectorFocusedItemId)(prevState);
if (focusedItemId === itemId) {
return prevState;
}
return (0, _extends2.default)({}, prevState, {
focus: (0, _extends2.default)({}, prevState.focus, {
focusedItemId: itemId
})
});
});
});
const isItemVisible = itemId => {
const itemMeta = (0, _useTreeViewItems.selectorItemMeta)(store.value, itemId);
return itemMeta && (itemMeta.parentId == null || (0, _useTreeViewExpansion.selectorIsItemExpanded)(store.value, itemMeta.parentId));
};
const innerFocusItem = (event, itemId) => {
const itemElement = instance.getItemDOMElement(itemId);
if (itemElement) {
itemElement.focus();
}
setFocusedItemId(itemId);
if (params.onItemFocus) {
params.onItemFocus(event, itemId);
}
};
const focusItem = (0, _useEventCallback.default)((event, itemId) => {
// If we receive an itemId, and it is visible, the focus will be set to it
if (isItemVisible(itemId)) {
innerFocusItem(event, itemId);
}
});
const removeFocusedItem = (0, _useEventCallback.default)(() => {
const focusedItemId = (0, _useTreeViewFocus.selectorFocusedItemId)(store.value);
if (focusedItemId == null) {
return;
}
const itemMeta = (0, _useTreeViewItems.selectorItemMeta)(store.value, focusedItemId);
if (itemMeta) {
const itemElement = instance.getItemDOMElement(focusedItemId);
if (itemElement) {
itemElement.blur();
}
}
setFocusedItemId(null);
});
(0, _useInstanceEventHandler.useInstanceEventHandler)(instance, 'removeItem', ({
id
}) => {
const focusedItemId = (0, _useTreeViewFocus.selectorFocusedItemId)(store.value);
const defaultFocusableItemId = (0, _useTreeViewFocus.selectorDefaultFocusableItemId)(store.value);
if (focusedItemId === id && defaultFocusableItemId != null) {
innerFocusItem(null, defaultFocusableItemId);
}
});
const createRootHandleFocus = otherHandlers => event => {
otherHandlers.onFocus?.(event);
if (event.defaultMuiPrevented) {
return;
}
// if the event bubbled (which is React specific) we don't want to steal focus
const defaultFocusableItemId = (0, _useTreeViewFocus.selectorDefaultFocusableItemId)(store.value);
if (event.target === event.currentTarget && defaultFocusableItemId != null) {
innerFocusItem(event, defaultFocusableItemId);
}
};
const createRootHandleBlur = otherHandlers => event => {
otherHandlers.onBlur?.(event);
if (event.defaultMuiPrevented) {
return;
}
setFocusedItemId(null);
};
return {
getRootProps: otherHandlers => ({
onFocus: createRootHandleFocus(otherHandlers),
onBlur: createRootHandleBlur(otherHandlers)
}),
publicAPI: {
focusItem
},
instance: {
focusItem,
removeFocusedItem
}
};
};
exports.useTreeViewFocus = useTreeViewFocus;
useTreeViewFocus.getInitialState = () => ({
focus: {
focusedItemId: null
}
});
useTreeViewFocus.params = {
onItemFocus: true
};