@mui/x-tree-view
Version:
The community edition of the MUI X Tree View components.
112 lines (110 loc) • 3.64 kB
JavaScript
;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useTreeView = void 0;
exports.useTreeViewApiInitialization = useTreeViewApiInitialization;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var React = _interopRequireWildcard(require("react"));
var _useRefWithInit = require("@base-ui/utils/useRefWithInit");
var _store = require("@mui/x-internals/store");
var _useMergedRefs = require("@base-ui/utils/useMergedRefs");
var _corePlugins = require("../corePlugins");
var _useExtractPluginParamsFromProps = require("./useExtractPluginParamsFromProps");
var _useTreeViewBuildContext = require("./useTreeViewBuildContext");
function initializeInputApiRef(inputApiRef) {
if (inputApiRef.current == null) {
inputApiRef.current = {};
}
return inputApiRef;
}
function useTreeViewApiInitialization(inputApiRef) {
const fallbackPublicApiRef = React.useRef({});
if (inputApiRef) {
return initializeInputApiRef(inputApiRef);
}
return fallbackPublicApiRef;
}
/**
* This is the main hook that sets the plugin system up for the tree-view.
*
* It manages the data used to create the tree-view.
*
* @param plugins All the plugins that will be used in the tree-view.
* @param props The props passed to the tree-view.
* @param rootRef The ref of the root element.
*/
const useTreeView = ({
plugins: inPlugins,
rootRef,
props
}) => {
const plugins = React.useMemo(() => [..._corePlugins.TREE_VIEW_CORE_PLUGINS, ...inPlugins], [inPlugins]);
const {
pluginParams,
forwardedProps,
apiRef
} = (0, _useExtractPluginParamsFromProps.useExtractPluginParamsFromProps)({
plugins,
props
});
const instance = (0, _useRefWithInit.useRefWithInit)(() => ({})).current;
const publicAPI = useTreeViewApiInitialization(apiRef);
const innerRootRef = React.useRef(null);
const handleRootRef = (0, _useMergedRefs.useMergedRefs)(innerRootRef, rootRef);
const store = (0, _useRefWithInit.useRefWithInit)(() => {
const initialState = {};
for (const plugin of plugins) {
if (plugin.getInitialState) {
Object.assign(initialState, plugin.getInitialState(pluginParams));
}
}
return new _store.Store(initialState);
}).current;
const contextValue = (0, _useTreeViewBuildContext.useTreeViewBuildContext)({
plugins,
instance,
publicAPI: publicAPI.current,
store,
rootRef: innerRootRef
});
const rootPropsGetters = [];
const runPlugin = plugin => {
const pluginResponse = plugin({
instance,
params: pluginParams,
rootRef: innerRootRef,
plugins,
store
});
if (pluginResponse.getRootProps) {
rootPropsGetters.push(pluginResponse.getRootProps);
}
if (pluginResponse.publicAPI) {
Object.assign(publicAPI.current, pluginResponse.publicAPI);
}
if (pluginResponse.instance) {
Object.assign(instance, pluginResponse.instance);
}
};
plugins.forEach(runPlugin);
const getRootProps = (otherHandlers = {}) => {
const rootProps = (0, _extends2.default)({
role: 'tree'
}, forwardedProps, otherHandlers, {
ref: handleRootRef
});
rootPropsGetters.forEach(rootPropsGetter => {
Object.assign(rootProps, rootPropsGetter(otherHandlers));
});
return rootProps;
};
return {
getRootProps,
rootRef: handleRootRef,
contextValue
};
};
exports.useTreeView = useTreeView;