39 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
| import type { ShallowRef } from 'vue';
 | |
| import { shallowRef, ref, watchEffect } from 'vue';
 | |
| import type { BasicDataNode, DataEntity, DataNode, Key } from './interface';
 | |
| 
 | |
| export default function useMaxLevel<TreeDataType extends BasicDataNode = DataNode>(
 | |
|   keyEntities: ShallowRef<Record<Key, DataEntity<TreeDataType>>>,
 | |
| ) {
 | |
|   const maxLevel = ref(0);
 | |
|   const levelEntities = shallowRef<Map<number, Set<DataEntity<TreeDataType>>>>();
 | |
|   watchEffect(() => {
 | |
|     const newLevelEntities = new Map<number, Set<DataEntity<TreeDataType>>>();
 | |
|     let newMaxLevel = 0;
 | |
|     const keyEntitiesValue = keyEntities.value || {};
 | |
|     // Convert entities by level for calculation
 | |
|     for (const key in keyEntitiesValue) {
 | |
|       if (Object.prototype.hasOwnProperty.call(keyEntitiesValue, key)) {
 | |
|         const entity = keyEntitiesValue[key];
 | |
|         const { level } = entity;
 | |
| 
 | |
|         let levelSet: Set<DataEntity<TreeDataType>> = newLevelEntities.get(level);
 | |
|         if (!levelSet) {
 | |
|           levelSet = new Set();
 | |
|           newLevelEntities.set(level, levelSet);
 | |
|         }
 | |
| 
 | |
|         levelSet.add(entity);
 | |
| 
 | |
|         newMaxLevel = Math.max(newMaxLevel, level);
 | |
|       }
 | |
|     }
 | |
|     maxLevel.value = newMaxLevel;
 | |
|     levelEntities.value = newLevelEntities;
 | |
|   });
 | |
|   return {
 | |
|     maxLevel,
 | |
|     levelEntities,
 | |
|   };
 | |
| }
 |