-const mapStateToProps = (state: RootState, props: TreePickerProps): Pick<TreeProps<any>, 'items'> => {
- const tree = state.treePicker[props.pickerId] || createTree();
- return {
- items: getNodeChildren('')(tree)
- .map(treePickerToTreeItems(tree))
+const flatTree = (itemsIdMap: Map<string, any>, depth: number, items?: any): [] => {
+ return items ? items
+ .map((item: any) => addToItemsIdMap(item, itemsIdMap))
+ .reduce((prev: Array<any>, next: any) => {
+ const { items } = next;
+ prev.push({ ...next, depth });
+ prev.push(...(next.open ? flatTree(itemsIdMap, depth + 1, items) : []));
+ return prev;
+ }, []) : [];
+};
+
+const addToItemsIdMap = <T>(item: TreeItem<T>, itemsIdMap: Map<string, TreeItem<T>>) => {
+ itemsIdMap[item.id] = item;
+ return item;
+};
+
+const memoizedMapStateToProps = () => {
+ let prevTree: Ttree<any>;
+ let mappedProps: Pick<TreeProps<any>, 'items' | 'disableRipple' | 'itemsMap'>;
+ return <T>(state: RootState, props: TreePickerProps<T>): Pick<TreeProps<T>, 'items' | 'disableRipple' | 'itemsMap'> => {
+ const itemsIdMap: Map<string, TreeItem<T>> = new Map();
+ const tree = state.treePicker[props.pickerId] || createTree();
+ if (tree !== prevTree) {
+ prevTree = tree;
+ mappedProps = {
+ disableRipple: true,
+ items: getNodeChildrenIds('')(tree)
+ .map(treePickerToTreeItems(tree))
+ .map(item => addToItemsIdMap(item, itemsIdMap))
+ .map(parentItem => ({
+ ...parentItem,
+ flatTree: true,
+ items: flatTree(itemsIdMap, 2, parentItem.items || []),
+ })),
+ itemsMap: itemsIdMap,
+ };
+ }
+ return mappedProps;