@hitachivantara/uikit-react-core
Version:
UI Kit Core React components.
37 lines (36 loc) • 1.27 kB
JavaScript
import * as React from "react";
//#region src/TreeView/internals/hooks/useTreeViewModels.ts
/**
* Implements the same behavior as `useControlled` but for several models.
* The controlled models are never stored in the state and the state is only updated if the model is not controlled.
*/
var useTreeViewModels = (plugins, props) => {
const modelsRef = React.useRef({});
const [modelsState, setModelsState] = React.useState(() => {
const initialState = {};
plugins.forEach((plugin) => {
if (plugin.models) Object.entries(plugin.models).forEach(([modelName, model]) => {
modelsRef.current[modelName] = {
controlledProp: model.controlledProp,
defaultProp: model.defaultProp,
isControlled: props[model.controlledProp] !== void 0
};
initialState[modelName] = props[model.defaultProp];
});
});
return initialState;
});
return Object.fromEntries(Object.entries(modelsRef.current).map(([modelName, model]) => {
return [modelName, {
value: model.isControlled ? props[model.controlledProp] : modelsState[modelName],
setValue: (newValue) => {
if (!model.isControlled) setModelsState((prevState) => ({
...prevState,
[modelName]: newValue
}));
}
}];
}));
};
//#endregion
export { useTreeViewModels };