mirror of
https://github.com/hanzoai/sentinel.git
synced 2026-10-30 14:49:14 +00:00
38 lines
1.2 KiB
TypeScript
38 lines
1.2 KiB
TypeScript
import type {DependencyList, RefObject} from 'react';
|
|
import {useCallback, useEffect, useMemo} from 'react';
|
|
import type {CellMeasurerCacheParams, List} from 'react-virtualized';
|
|
import {CellMeasurerCache} from 'react-virtualized';
|
|
|
|
type Opts = {
|
|
cellMeasurer: CellMeasurerCacheParams;
|
|
deps: DependencyList;
|
|
ref: RefObject<List>;
|
|
};
|
|
function useVirtualizedList({cellMeasurer, deps, ref}: Opts) {
|
|
const cache = useMemo(() => new CellMeasurerCache(cellMeasurer), [cellMeasurer]);
|
|
|
|
const updateList = useCallback(() => {
|
|
cache.clearAll();
|
|
ref.current?.forceUpdateGrid();
|
|
}, [cache, ref]);
|
|
|
|
// Restart cache when items changes
|
|
// XXX: this has potential to break the UI, especially with dynamic content
|
|
// in lists (e.g. ObjectInspector). Consider removing this as deps can easily
|
|
// be forgotten to be memoized.
|
|
//
|
|
// The reason for high potential to break UI: updateList clears the cache, so
|
|
// any cells that were expanded but scrolled out of view will have their
|
|
// cached heights reset while they re-render expanded.
|
|
useEffect(() => {
|
|
updateList();
|
|
}, [updateList, deps]);
|
|
|
|
return {
|
|
cache,
|
|
updateList,
|
|
};
|
|
}
|
|
|
|
export default useVirtualizedList;
|