import * as React from 'react'; import type { AnyObject } from '../../_util/type'; import type { GetRowKey, Key } from '../interface'; interface MapCache { data?: readonly RecordType[]; childrenColumnName?: string; kvMap?: Map; getRowKey?: (record: RecordType, index: number) => Key; } const useLazyKVMap = ( data: readonly RecordType[], childrenColumnName: string, getRowKey: GetRowKey, ) => { const mapCacheRef = React.useRef>({}); function getRecordByKey(key: Key): RecordType { if ( !mapCacheRef.current || mapCacheRef.current.data !== data || mapCacheRef.current.childrenColumnName !== childrenColumnName || mapCacheRef.current.getRowKey !== getRowKey ) { const kvMap = new Map(); /* eslint-disable no-inner-declarations */ function dig(records: readonly RecordType[]) { records.forEach((record, index) => { const rowKey = getRowKey(record, index); kvMap.set(rowKey, record); if (record && typeof record === 'object' && childrenColumnName in record) { dig((record as any)[childrenColumnName] || []); } }); } /* eslint-enable */ dig(data); mapCacheRef.current = { data, childrenColumnName, kvMap, getRowKey, }; } return mapCacheRef.current.kvMap?.get(key)!; } return [getRecordByKey] as const; }; export default useLazyKVMap;