@fluentui/react-virtualizer 9.0.0-alpha.21 → 9.0.0-alpha.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.json +40 -1
- package/CHANGELOG.md +15 -2
- package/lib/Hooks.js +0 -1
- package/lib/Hooks.js.map +1 -1
- package/lib/Utilities.js +0 -1
- package/lib/Utilities.js.map +1 -1
- package/lib/Virtualizer.js +0 -1
- package/lib/Virtualizer.js.map +1 -1
- package/lib/VirtualizerScrollView.js +0 -1
- package/lib/VirtualizerScrollView.js.map +1 -1
- package/lib/VirtualizerScrollViewDynamic.js +0 -1
- package/lib/VirtualizerScrollViewDynamic.js.map +1 -1
- package/lib/components/Virtualizer/Virtualizer.js +5 -7
- package/lib/components/Virtualizer/Virtualizer.js.map +1 -1
- package/lib/components/Virtualizer/Virtualizer.types.js +0 -1
- package/lib/components/Virtualizer/Virtualizer.types.js.map +1 -1
- package/lib/components/Virtualizer/index.js +1 -2
- package/lib/components/Virtualizer/index.js.map +1 -1
- package/lib/components/Virtualizer/renderVirtualizer.js +9 -13
- package/lib/components/Virtualizer/renderVirtualizer.js.map +1 -1
- package/lib/components/Virtualizer/useVirtualizer.js +348 -354
- package/lib/components/Virtualizer/useVirtualizer.js.map +1 -1
- package/lib/components/Virtualizer/{useVirtualizerStyles.js → useVirtualizerStyles.styles.js} +1 -1
- package/lib/components/Virtualizer/useVirtualizerStyles.styles.js.map +1 -0
- package/lib/components/VirtualizerScrollView/VirtualizerScrollView.js +5 -7
- package/lib/components/VirtualizerScrollView/VirtualizerScrollView.js.map +1 -1
- package/lib/components/VirtualizerScrollView/VirtualizerScrollView.types.js +1 -2
- package/lib/components/VirtualizerScrollView/VirtualizerScrollView.types.js.map +1 -1
- package/lib/components/VirtualizerScrollView/index.js +1 -2
- package/lib/components/VirtualizerScrollView/index.js.map +1 -1
- package/lib/components/VirtualizerScrollView/renderVirtualizerScrollView.js +4 -8
- package/lib/components/VirtualizerScrollView/renderVirtualizerScrollView.js.map +1 -1
- package/lib/components/VirtualizerScrollView/useVirtualizerScrollView.js +26 -32
- package/lib/components/VirtualizerScrollView/useVirtualizerScrollView.js.map +1 -1
- package/lib/components/VirtualizerScrollView/{useVirtualizerScrollViewStyles.js → useVirtualizerScrollViewStyles.styles.js} +2 -2
- package/lib/components/VirtualizerScrollView/useVirtualizerScrollViewStyles.styles.js.map +1 -0
- package/lib/components/VirtualizerScrollViewDynamic/VirtualizerScrollViewDynamic.js +5 -7
- package/lib/components/VirtualizerScrollViewDynamic/VirtualizerScrollViewDynamic.js.map +1 -1
- package/lib/components/VirtualizerScrollViewDynamic/VirtualizerScrollViewDynamic.types.js +1 -2
- package/lib/components/VirtualizerScrollViewDynamic/VirtualizerScrollViewDynamic.types.js.map +1 -1
- package/lib/components/VirtualizerScrollViewDynamic/index.js +1 -2
- package/lib/components/VirtualizerScrollViewDynamic/index.js.map +1 -1
- package/lib/components/VirtualizerScrollViewDynamic/renderVirtualizerScrollViewDynamic.js +4 -8
- package/lib/components/VirtualizerScrollViewDynamic/renderVirtualizerScrollViewDynamic.js.map +1 -1
- package/lib/components/VirtualizerScrollViewDynamic/useVirtualizerScrollViewDynamic.js +31 -37
- package/lib/components/VirtualizerScrollViewDynamic/useVirtualizerScrollViewDynamic.js.map +1 -1
- package/lib/components/VirtualizerScrollViewDynamic/{useVirtualizerScrollViewDynamicStyles.js → useVirtualizerScrollViewDynamicStyles.styles.js} +2 -2
- package/lib/components/VirtualizerScrollViewDynamic/useVirtualizerScrollViewDynamicStyles.styles.js.map +1 -0
- package/lib/hooks/hooks.types.js +1 -2
- package/lib/hooks/hooks.types.js.map +1 -1
- package/lib/hooks/index.js +0 -1
- package/lib/hooks/index.js.map +1 -1
- package/lib/hooks/useDynamicVirtualizerMeasure.js +91 -91
- package/lib/hooks/useDynamicVirtualizerMeasure.js.map +1 -1
- package/lib/hooks/useIntersectionObserver.js +31 -32
- package/lib/hooks/useIntersectionObserver.js.map +1 -1
- package/lib/hooks/useResizeObserverRef.js +34 -32
- package/lib/hooks/useResizeObserverRef.js.map +1 -1
- package/lib/hooks/useVirtualizerMeasure.js +38 -47
- package/lib/hooks/useVirtualizerMeasure.js.map +1 -1
- package/lib/index.js +0 -1
- package/lib/index.js.map +1 -1
- package/lib/utilities/VirtualizerContext/VirtualizerContext.js +26 -22
- package/lib/utilities/VirtualizerContext/VirtualizerContext.js.map +1 -1
- package/lib/utilities/VirtualizerContext/index.js +0 -1
- package/lib/utilities/VirtualizerContext/index.js.map +1 -1
- package/lib/utilities/VirtualizerContext/types.js +1 -2
- package/lib/utilities/VirtualizerContext/types.js.map +1 -1
- package/lib/utilities/debounce.js +13 -14
- package/lib/utilities/debounce.js.map +1 -1
- package/lib/utilities/index.js +0 -1
- package/lib/utilities/index.js.map +1 -1
- package/lib-commonjs/Hooks.js +0 -3
- package/lib-commonjs/Hooks.js.map +1 -1
- package/lib-commonjs/Utilities.js +0 -3
- package/lib-commonjs/Utilities.js.map +1 -1
- package/lib-commonjs/Virtualizer.js +0 -3
- package/lib-commonjs/Virtualizer.js.map +1 -1
- package/lib-commonjs/VirtualizerScrollView.js +0 -3
- package/lib-commonjs/VirtualizerScrollView.js.map +1 -1
- package/lib-commonjs/VirtualizerScrollViewDynamic.js +0 -3
- package/lib-commonjs/VirtualizerScrollViewDynamic.js.map +1 -1
- package/lib-commonjs/components/Virtualizer/Virtualizer.js +3 -5
- package/lib-commonjs/components/Virtualizer/Virtualizer.js.map +1 -1
- package/lib-commonjs/components/Virtualizer/Virtualizer.types.js +0 -3
- package/lib-commonjs/components/Virtualizer/Virtualizer.types.js.map +1 -1
- package/lib-commonjs/components/Virtualizer/index.js +1 -4
- package/lib-commonjs/components/Virtualizer/index.js.map +1 -1
- package/lib-commonjs/components/Virtualizer/renderVirtualizer.js +1 -3
- package/lib-commonjs/components/Virtualizer/renderVirtualizer.js.map +1 -1
- package/lib-commonjs/components/Virtualizer/useVirtualizer.js +1 -3
- package/lib-commonjs/components/Virtualizer/useVirtualizer.js.map +1 -1
- package/lib-commonjs/components/Virtualizer/{useVirtualizerStyles.js → useVirtualizerStyles.styles.js} +1 -3
- package/lib-commonjs/components/Virtualizer/useVirtualizerStyles.styles.js.map +1 -0
- package/lib-commonjs/components/VirtualizerScrollView/VirtualizerScrollView.js +3 -5
- package/lib-commonjs/components/VirtualizerScrollView/VirtualizerScrollView.js.map +1 -1
- package/lib-commonjs/components/VirtualizerScrollView/VirtualizerScrollView.types.js +0 -3
- package/lib-commonjs/components/VirtualizerScrollView/VirtualizerScrollView.types.js.map +1 -1
- package/lib-commonjs/components/VirtualizerScrollView/index.js +1 -4
- package/lib-commonjs/components/VirtualizerScrollView/index.js.map +1 -1
- package/lib-commonjs/components/VirtualizerScrollView/renderVirtualizerScrollView.js +1 -3
- package/lib-commonjs/components/VirtualizerScrollView/renderVirtualizerScrollView.js.map +1 -1
- package/lib-commonjs/components/VirtualizerScrollView/useVirtualizerScrollView.js +1 -3
- package/lib-commonjs/components/VirtualizerScrollView/useVirtualizerScrollView.js.map +1 -1
- package/lib-commonjs/components/VirtualizerScrollView/{useVirtualizerScrollViewStyles.js → useVirtualizerScrollViewStyles.styles.js} +4 -6
- package/lib-commonjs/components/VirtualizerScrollView/useVirtualizerScrollViewStyles.styles.js.map +1 -0
- package/lib-commonjs/components/VirtualizerScrollViewDynamic/VirtualizerScrollViewDynamic.js +3 -5
- package/lib-commonjs/components/VirtualizerScrollViewDynamic/VirtualizerScrollViewDynamic.js.map +1 -1
- package/lib-commonjs/components/VirtualizerScrollViewDynamic/VirtualizerScrollViewDynamic.types.js +0 -3
- package/lib-commonjs/components/VirtualizerScrollViewDynamic/VirtualizerScrollViewDynamic.types.js.map +1 -1
- package/lib-commonjs/components/VirtualizerScrollViewDynamic/index.js +1 -4
- package/lib-commonjs/components/VirtualizerScrollViewDynamic/index.js.map +1 -1
- package/lib-commonjs/components/VirtualizerScrollViewDynamic/renderVirtualizerScrollViewDynamic.js +1 -3
- package/lib-commonjs/components/VirtualizerScrollViewDynamic/renderVirtualizerScrollViewDynamic.js.map +1 -1
- package/lib-commonjs/components/VirtualizerScrollViewDynamic/useVirtualizerScrollViewDynamic.js +1 -3
- package/lib-commonjs/components/VirtualizerScrollViewDynamic/useVirtualizerScrollViewDynamic.js.map +1 -1
- package/lib-commonjs/components/VirtualizerScrollViewDynamic/{useVirtualizerScrollViewDynamicStyles.js → useVirtualizerScrollViewDynamicStyles.styles.js} +4 -6
- package/lib-commonjs/components/VirtualizerScrollViewDynamic/useVirtualizerScrollViewDynamicStyles.styles.js.map +1 -0
- package/lib-commonjs/hooks/hooks.types.js +0 -3
- package/lib-commonjs/hooks/hooks.types.js.map +1 -1
- package/lib-commonjs/hooks/index.js +0 -3
- package/lib-commonjs/hooks/index.js.map +1 -1
- package/lib-commonjs/hooks/useDynamicVirtualizerMeasure.js +5 -7
- package/lib-commonjs/hooks/useDynamicVirtualizerMeasure.js.map +1 -1
- package/lib-commonjs/hooks/useIntersectionObserver.js +1 -3
- package/lib-commonjs/hooks/useIntersectionObserver.js.map +1 -1
- package/lib-commonjs/hooks/useResizeObserverRef.js +1 -3
- package/lib-commonjs/hooks/useResizeObserverRef.js.map +1 -1
- package/lib-commonjs/hooks/useVirtualizerMeasure.js +7 -9
- package/lib-commonjs/hooks/useVirtualizerMeasure.js.map +1 -1
- package/lib-commonjs/index.js +0 -3
- package/lib-commonjs/index.js.map +1 -1
- package/lib-commonjs/utilities/VirtualizerContext/VirtualizerContext.js +3 -5
- package/lib-commonjs/utilities/VirtualizerContext/VirtualizerContext.js.map +1 -1
- package/lib-commonjs/utilities/VirtualizerContext/index.js +0 -3
- package/lib-commonjs/utilities/VirtualizerContext/index.js.map +1 -1
- package/lib-commonjs/utilities/VirtualizerContext/types.js +0 -3
- package/lib-commonjs/utilities/VirtualizerContext/types.js.map +1 -1
- package/lib-commonjs/utilities/debounce.js +1 -3
- package/lib-commonjs/utilities/debounce.js.map +1 -1
- package/lib-commonjs/utilities/index.js +0 -3
- package/lib-commonjs/utilities/index.js.map +1 -1
- package/package.json +5 -5
- package/lib/components/Virtualizer/useVirtualizerStyles.js.map +0 -1
- package/lib/components/VirtualizerScrollView/useVirtualizerScrollViewStyles.js.map +0 -1
- package/lib/components/VirtualizerScrollViewDynamic/useVirtualizerScrollViewDynamicStyles.js.map +0 -1
- package/lib-commonjs/components/Virtualizer/useVirtualizerStyles.js.map +0 -1
- package/lib-commonjs/components/VirtualizerScrollView/useVirtualizerScrollViewStyles.js.map +0 -1
- package/lib-commonjs/components/VirtualizerScrollViewDynamic/useVirtualizerScrollViewDynamicStyles.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["hooks.types.ts"],"sourcesContent":["import { MutableRefObject } from 'react';\n\nexport type VirtualizerMeasureProps = {\n defaultItemSize: number;\n direction?: 'vertical' | 'horizontal';\n};\n\nexport type VirtualizerMeasureDynamicProps = {\n defaultItemSize: number;\n currentIndex: number;\n numItems: number;\n getItemSize: (index: number) => number;\n direction?: 'vertical' | 'horizontal';\n};\n\n/**\n * Additional direct Ref prevents reading old resize entry data\n * Backwards compatible with ResizeObserverCallback if preferred\n */\nexport interface ResizeCallbackWithRef {\n (entries: ResizeObserverEntry[], observer: ResizeObserver, scrollRef?: MutableRefObject<HTMLElement | null>): void;\n}\n"],"names":[],"mappings":"AAAA,WAqBC"}
|
package/lib/hooks/index.js
CHANGED
package/lib/hooks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["index.ts"],"sourcesContent":["export * from './useIntersectionObserver';\nexport * from './useVirtualizerMeasure';\nexport * from './useDynamicVirtualizerMeasure';\nexport * from './useResizeObserverRef';\nexport * from './hooks.types';\n"],"names":[],"mappings":"AAAA,cAAc,4BAA4B;AAC1C,cAAc,0BAA0B;AACxC,cAAc,iCAAiC;AAC/C,cAAc,yBAAyB;AACvC,cAAc,gBAAgB"}
|
|
@@ -4,96 +4,96 @@ import { useResizeObserverRef_unstable } from './useResizeObserverRef';
|
|
|
4
4
|
import { useRef } from 'react';
|
|
5
5
|
/**
|
|
6
6
|
* React hook that measures virtualized space dynamically to ensure optimized virtualization length.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
} = virtualizerProps;
|
|
16
|
-
const indexRef = useRef(currentIndex);
|
|
17
|
-
indexRef.current = currentIndex;
|
|
18
|
-
const [state, setState] = React.useState({
|
|
19
|
-
virtualizerLength: 0,
|
|
20
|
-
virtualizerBufferItems: 0,
|
|
21
|
-
virtualizerBufferSize: 0
|
|
22
|
-
});
|
|
23
|
-
const {
|
|
24
|
-
virtualizerLength,
|
|
25
|
-
virtualizerBufferItems,
|
|
26
|
-
virtualizerBufferSize
|
|
27
|
-
} = state;
|
|
28
|
-
const container = React.useRef(null);
|
|
29
|
-
const handleScrollResize = React.useCallback(scrollRef => {
|
|
30
|
-
if (!(scrollRef === null || scrollRef === void 0 ? void 0 : scrollRef.current)) {
|
|
31
|
-
// Error? ignore?
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
if (scrollRef.current !== container.current) {
|
|
35
|
-
container.current = scrollRef.current;
|
|
36
|
-
}
|
|
37
|
-
const containerSize = direction === 'vertical' ? scrollRef.current.getBoundingClientRect().height : scrollRef.current.getBoundingClientRect().width;
|
|
38
|
-
let indexSizer = 0;
|
|
39
|
-
let length = 0;
|
|
40
|
-
while (indexSizer <= containerSize && length < numItems) {
|
|
41
|
-
const iItemSize = getItemSize(indexRef.current + length);
|
|
42
|
-
// Increment
|
|
43
|
-
indexSizer += iItemSize;
|
|
44
|
-
length++;
|
|
45
|
-
}
|
|
46
|
-
/*
|
|
47
|
-
* Number of items to append at each end, i.e. 'preload' each side before entering view.
|
|
48
|
-
*/
|
|
49
|
-
const bufferItems = Math.max(Math.floor(length / 4), 2);
|
|
50
|
-
/*
|
|
51
|
-
* This is how far we deviate into the bufferItems to detect a redraw.
|
|
52
|
-
*/
|
|
53
|
-
const bufferSize = Math.max(Math.floor(length / 8 * defaultItemSize), 1);
|
|
54
|
-
const totalLength = length + bufferItems * 2 + 3;
|
|
55
|
-
setState({
|
|
56
|
-
virtualizerLength: totalLength,
|
|
57
|
-
virtualizerBufferSize: bufferSize,
|
|
58
|
-
virtualizerBufferItems: bufferItems
|
|
7
|
+
*/ export const useDynamicVirtualizerMeasure = (virtualizerProps)=>{
|
|
8
|
+
const { defaultItemSize , direction ='vertical' , numItems , getItemSize , currentIndex } = virtualizerProps;
|
|
9
|
+
const indexRef = useRef(currentIndex);
|
|
10
|
+
indexRef.current = currentIndex;
|
|
11
|
+
const [state, setState] = React.useState({
|
|
12
|
+
virtualizerLength: 0,
|
|
13
|
+
virtualizerBufferItems: 0,
|
|
14
|
+
virtualizerBufferSize: 0
|
|
59
15
|
});
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
16
|
+
const { virtualizerLength , virtualizerBufferItems , virtualizerBufferSize } = state;
|
|
17
|
+
const container = React.useRef(null);
|
|
18
|
+
const handleScrollResize = React.useCallback((scrollRef)=>{
|
|
19
|
+
if (!(scrollRef === null || scrollRef === void 0 ? void 0 : scrollRef.current)) {
|
|
20
|
+
// Error? ignore?
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (scrollRef.current !== container.current) {
|
|
24
|
+
container.current = scrollRef.current;
|
|
25
|
+
}
|
|
26
|
+
const containerSize = direction === 'vertical' ? scrollRef.current.getBoundingClientRect().height : scrollRef.current.getBoundingClientRect().width;
|
|
27
|
+
let indexSizer = 0;
|
|
28
|
+
let length = 0;
|
|
29
|
+
while(indexSizer <= containerSize && length < numItems){
|
|
30
|
+
const iItemSize = getItemSize(indexRef.current + length);
|
|
31
|
+
// Increment
|
|
32
|
+
indexSizer += iItemSize;
|
|
33
|
+
length++;
|
|
34
|
+
}
|
|
35
|
+
/*
|
|
36
|
+
* Number of items to append at each end, i.e. 'preload' each side before entering view.
|
|
37
|
+
*/ const bufferItems = Math.max(Math.floor(length / 4), 2);
|
|
38
|
+
/*
|
|
39
|
+
* This is how far we deviate into the bufferItems to detect a redraw.
|
|
40
|
+
*/ const bufferSize = Math.max(Math.floor(length / 8 * defaultItemSize), 1);
|
|
41
|
+
const totalLength = length + bufferItems * 2 + 3;
|
|
42
|
+
setState({
|
|
43
|
+
virtualizerLength: totalLength,
|
|
44
|
+
virtualizerBufferSize: bufferSize,
|
|
45
|
+
virtualizerBufferItems: bufferItems
|
|
46
|
+
});
|
|
47
|
+
}, [
|
|
48
|
+
defaultItemSize,
|
|
49
|
+
direction,
|
|
50
|
+
getItemSize,
|
|
51
|
+
numItems
|
|
52
|
+
]);
|
|
53
|
+
const resizeCallback = React.useCallback((_entries, _observer, scrollRef)=>{
|
|
54
|
+
if (scrollRef) {
|
|
55
|
+
handleScrollResize(scrollRef);
|
|
56
|
+
}
|
|
57
|
+
}, [
|
|
58
|
+
handleScrollResize
|
|
59
|
+
]);
|
|
60
|
+
const scrollRef = useResizeObserverRef_unstable(resizeCallback);
|
|
61
|
+
useIsomorphicLayoutEffect(()=>{
|
|
62
|
+
var _container_current, _container_current1;
|
|
63
|
+
if (!container.current) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const containerSize = direction === 'vertical' ? ((_container_current = container.current) === null || _container_current === void 0 ? void 0 : _container_current.getBoundingClientRect().height) * 1.5 : ((_container_current1 = container.current) === null || _container_current1 === void 0 ? void 0 : _container_current1.getBoundingClientRect().width) * 1.5;
|
|
67
|
+
let couldBeSmaller = false;
|
|
68
|
+
let recheckTotal = 0;
|
|
69
|
+
for(let i = currentIndex; i < currentIndex + virtualizerLength; i++){
|
|
70
|
+
const newItemSize = getItemSize(i);
|
|
71
|
+
recheckTotal += newItemSize;
|
|
72
|
+
const newLength = i - currentIndex;
|
|
73
|
+
const bufferItems = Math.max(Math.floor(newLength / 4), 2);
|
|
74
|
+
const totalNewLength = newLength + bufferItems * 2 + 4;
|
|
75
|
+
const compareLengths = totalNewLength < virtualizerLength;
|
|
76
|
+
if (recheckTotal > containerSize && compareLengths) {
|
|
77
|
+
couldBeSmaller = true;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Check if the render has caused us to need a re-calc of virtualizer length
|
|
82
|
+
if (recheckTotal < containerSize || couldBeSmaller) {
|
|
83
|
+
handleScrollResize(container);
|
|
84
|
+
}
|
|
85
|
+
}, [
|
|
86
|
+
getItemSize,
|
|
87
|
+
currentIndex,
|
|
88
|
+
direction,
|
|
89
|
+
virtualizerLength,
|
|
90
|
+
resizeCallback,
|
|
91
|
+
handleScrollResize
|
|
92
|
+
]);
|
|
93
|
+
return {
|
|
94
|
+
virtualizerLength,
|
|
95
|
+
bufferItems: virtualizerBufferItems,
|
|
96
|
+
bufferSize: virtualizerBufferSize,
|
|
97
|
+
scrollRef
|
|
98
|
+
};
|
|
98
99
|
};
|
|
99
|
-
//# sourceMappingURL=useDynamicVirtualizerMeasure.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["useDynamicVirtualizerMeasure.ts"],"sourcesContent":["import { useIsomorphicLayoutEffect } from '@fluentui/react-utilities';\nimport * as React from 'react';\nimport { VirtualizerMeasureDynamicProps } from './hooks.types';\nimport { useResizeObserverRef_unstable } from './useResizeObserverRef';\nimport { useRef } from 'react';\n\n/**\n * React hook that measures virtualized space dynamically to ensure optimized virtualization length.\n */\nexport const useDynamicVirtualizerMeasure = <TElement extends HTMLElement>(\n virtualizerProps: VirtualizerMeasureDynamicProps,\n): {\n virtualizerLength: number;\n bufferItems: number;\n bufferSize: number;\n scrollRef: (instance: TElement | null) => void;\n} => {\n const { defaultItemSize, direction = 'vertical', numItems, getItemSize, currentIndex } = virtualizerProps;\n const indexRef = useRef<number>(currentIndex);\n indexRef.current = currentIndex;\n\n const [state, setState] = React.useState({\n virtualizerLength: 0,\n virtualizerBufferItems: 0,\n virtualizerBufferSize: 0,\n });\n\n const { virtualizerLength, virtualizerBufferItems, virtualizerBufferSize } = state;\n\n const container = React.useRef<HTMLElement | null>(null);\n const handleScrollResize = React.useCallback(\n (scrollRef: React.MutableRefObject<HTMLElement | null>) => {\n if (!scrollRef?.current) {\n // Error? ignore?\n return;\n }\n\n if (scrollRef.current !== container.current) {\n container.current = scrollRef.current;\n }\n\n const containerSize =\n direction === 'vertical'\n ? scrollRef.current.getBoundingClientRect().height\n : scrollRef.current.getBoundingClientRect().width;\n\n let indexSizer = 0;\n let length = 0;\n\n while (indexSizer <= containerSize && length < numItems) {\n const iItemSize = getItemSize(indexRef.current + length);\n\n // Increment\n indexSizer += iItemSize;\n length++;\n }\n\n /*\n * Number of items to append at each end, i.e. 'preload' each side before entering view.\n */\n const bufferItems = Math.max(Math.floor(length / 4), 2);\n\n /*\n * This is how far we deviate into the bufferItems to detect a redraw.\n */\n const bufferSize = Math.max(Math.floor((length / 8) * defaultItemSize), 1);\n\n const totalLength = length + bufferItems * 2 + 3;\n setState({\n virtualizerLength: totalLength,\n virtualizerBufferSize: bufferSize,\n virtualizerBufferItems: bufferItems,\n });\n },\n [defaultItemSize, direction, getItemSize, numItems],\n );\n\n const resizeCallback = React.useCallback(\n (\n _entries: ResizeObserverEntry[],\n _observer: ResizeObserver,\n scrollRef?: React.MutableRefObject<HTMLElement | null>,\n ) => {\n if (scrollRef) {\n handleScrollResize(scrollRef);\n }\n },\n [handleScrollResize],\n );\n\n const scrollRef = useResizeObserverRef_unstable(resizeCallback);\n\n useIsomorphicLayoutEffect(() => {\n if (!container.current) {\n return;\n }\n\n const containerSize =\n direction === 'vertical'\n ? container.current?.getBoundingClientRect().height * 1.5\n : container.current?.getBoundingClientRect().width * 1.5;\n\n let couldBeSmaller = false;\n let recheckTotal = 0;\n for (let i = currentIndex; i < currentIndex + virtualizerLength; i++) {\n const newItemSize = getItemSize(i);\n recheckTotal += newItemSize;\n\n const newLength = i - currentIndex;\n\n const bufferItems = Math.max(Math.floor(newLength / 4), 2);\n const totalNewLength = newLength + bufferItems * 2 + 4;\n const compareLengths = totalNewLength < virtualizerLength;\n\n if (recheckTotal > containerSize && compareLengths) {\n couldBeSmaller = true;\n break;\n }\n }\n\n // Check if the render has caused us to need a re-calc of virtualizer length\n if (recheckTotal < containerSize || couldBeSmaller) {\n handleScrollResize(container);\n }\n }, [getItemSize, currentIndex, direction, virtualizerLength, resizeCallback, handleScrollResize]);\n\n return {\n virtualizerLength,\n bufferItems: virtualizerBufferItems,\n bufferSize: virtualizerBufferSize,\n scrollRef,\n };\n};\n"],"names":["useIsomorphicLayoutEffect","React","useResizeObserverRef_unstable","useRef","useDynamicVirtualizerMeasure","virtualizerProps","defaultItemSize","direction","numItems","getItemSize","currentIndex","indexRef","current","state","setState","useState","virtualizerLength","virtualizerBufferItems","virtualizerBufferSize","container","handleScrollResize","useCallback","scrollRef","containerSize","getBoundingClientRect","height","width","indexSizer","length","iItemSize","bufferItems","Math","max","floor","bufferSize","totalLength","resizeCallback","_entries","_observer","couldBeSmaller","recheckTotal","i","newItemSize","newLength","totalNewLength","compareLengths"],"mappings":"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"}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { useIsomorphicLayoutEffect } from '@fluentui/react-utilities';
|
|
3
|
-
const {
|
|
4
|
-
useState,
|
|
5
|
-
useRef
|
|
6
|
-
} = React;
|
|
3
|
+
const { useState , useRef } = React;
|
|
7
4
|
/**
|
|
8
5
|
* React hook that allows easy usage of the browser API IntersectionObserver within React
|
|
9
6
|
* @param callback - A function called when the percentage of the target element is visible crosses a threshold.
|
|
@@ -12,33 +9,35 @@ const {
|
|
|
12
9
|
* enough to trigger a callback).
|
|
13
10
|
* @returns An array containing a callback to update the list of Elements the observer should listen to, a callback to
|
|
14
11
|
* update the init options of the IntersectionObserver and a ref to the IntersectionObserver instance itself.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
12
|
+
*/ export const useIntersectionObserver = (callback, options)=>{
|
|
13
|
+
const observer = useRef();
|
|
14
|
+
const [observerList, setObserverList] = useState();
|
|
15
|
+
const [observerInit, setObserverInit] = useState(options);
|
|
16
|
+
// Observer elements in passed in list and clean up previous list
|
|
17
|
+
// This effect is only triggered when observerList is updated
|
|
18
|
+
useIsomorphicLayoutEffect(()=>{
|
|
19
|
+
observer.current = new IntersectionObserver(callback, observerInit);
|
|
20
|
+
// If we have an instance of IO and a list with elements, observer the elements
|
|
21
|
+
if (observer.current && observerList && observerList.length > 0) {
|
|
22
|
+
observerList.forEach((element)=>{
|
|
23
|
+
var _observer_current;
|
|
24
|
+
(_observer_current = observer.current) === null || _observer_current === void 0 ? void 0 : _observer_current.observe(element);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
// clean up previous elements being listened to
|
|
28
|
+
return ()=>{
|
|
29
|
+
if (observer.current) {
|
|
30
|
+
observer.current.disconnect();
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}, [
|
|
34
|
+
observerList,
|
|
35
|
+
observerInit,
|
|
36
|
+
callback
|
|
37
|
+
]);
|
|
38
|
+
return {
|
|
39
|
+
setObserverList,
|
|
40
|
+
setObserverInit,
|
|
41
|
+
observer
|
|
36
42
|
};
|
|
37
|
-
}, [observerList, observerInit, callback]);
|
|
38
|
-
return {
|
|
39
|
-
setObserverList,
|
|
40
|
-
setObserverInit,
|
|
41
|
-
observer
|
|
42
|
-
};
|
|
43
43
|
};
|
|
44
|
-
//# sourceMappingURL=useIntersectionObserver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["useIntersectionObserver.ts"],"sourcesContent":["import type { Dispatch, MutableRefObject, SetStateAction } from 'react';\nimport * as React from 'react';\nimport { useIsomorphicLayoutEffect } from '@fluentui/react-utilities';\n\nconst { useState, useRef } = React;\n\n/**\n * React hook that allows easy usage of the browser API IntersectionObserver within React\n * @param callback - A function called when the percentage of the target element is visible crosses a threshold.\n * @param options - An optional object which customizes the observer. If options isn't specified, the observer uses the\n * document's viewport as the root, with no margin, and a 0% threshold (meaning that even a one-pixel change is\n * enough to trigger a callback).\n * @returns An array containing a callback to update the list of Elements the observer should listen to, a callback to\n * update the init options of the IntersectionObserver and a ref to the IntersectionObserver instance itself.\n */\n\nexport const useIntersectionObserver = (\n callback: IntersectionObserverCallback,\n options?: IntersectionObserverInit,\n): {\n setObserverList: Dispatch<SetStateAction<Element[] | undefined>>;\n setObserverInit: Dispatch<SetStateAction<IntersectionObserverInit | undefined>>;\n observer: MutableRefObject<IntersectionObserver | undefined>;\n} => {\n const observer = useRef<IntersectionObserver>();\n const [observerList, setObserverList] = useState<Element[]>();\n const [observerInit, setObserverInit] = useState<IntersectionObserverInit | undefined>(options);\n\n // Observer elements in passed in list and clean up previous list\n // This effect is only triggered when observerList is updated\n useIsomorphicLayoutEffect(() => {\n observer.current = new IntersectionObserver(callback, observerInit);\n\n // If we have an instance of IO and a list with elements, observer the elements\n if (observer.current && observerList && observerList.length > 0) {\n observerList.forEach(element => {\n observer.current?.observe(element);\n });\n }\n\n // clean up previous elements being listened to\n return () => {\n if (observer.current) {\n observer.current.disconnect();\n }\n };\n }, [observerList, observerInit, callback]);\n\n return { setObserverList, setObserverInit, observer };\n};\n"],"names":["React","useIsomorphicLayoutEffect","useState","useRef","useIntersectionObserver","callback","options","observer","observerList","setObserverList","observerInit","setObserverInit","current","IntersectionObserver","length","forEach","element","observe","disconnect"],"mappings":"AACA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,yBAAyB,QAAQ,4BAA4B;AAEtE,MAAM,EAAEC,SAAQ,EAAEC,OAAM,EAAE,GAAGH;AAE7B;;;;;;;;CAQC,GAED,OAAO,MAAMI,0BAA0B,CACrCC,UACAC,UAKG;IACH,MAAMC,WAAWJ;IACjB,MAAM,CAACK,cAAcC,gBAAgB,GAAGP;IACxC,MAAM,CAACQ,cAAcC,gBAAgB,GAAGT,SAA+CI;IAEvF,iEAAiE;IACjE,6DAA6D;IAC7DL,0BAA0B,IAAM;QAC9BM,SAASK,OAAO,GAAG,IAAIC,qBAAqBR,UAAUK;QAEtD,+EAA+E;QAC/E,IAAIH,SAASK,OAAO,IAAIJ,gBAAgBA,aAAaM,MAAM,GAAG,GAAG;YAC/DN,aAAaO,OAAO,CAACC,CAAAA,UAAW;oBAC9BT;gBAAAA,CAAAA,oBAAAA,SAASK,OAAO,cAAhBL,+BAAAA,KAAAA,IAAAA,kBAAkBU,QAAQD;YAC5B;QACF,CAAC;QAED,+CAA+C;QAC/C,OAAO,IAAM;YACX,IAAIT,SAASK,OAAO,EAAE;gBACpBL,SAASK,OAAO,CAACM,UAAU;YAC7B,CAAC;QACH;IACF,GAAG;QAACV;QAAcE;QAAcL;KAAS;IAEzC,OAAO;QAAEI;QAAiBE;QAAiBJ;IAAS;AACtD,EAAE"}
|
|
@@ -3,38 +3,40 @@ import { debounce } from '../utilities/debounce';
|
|
|
3
3
|
import { canUseDOM } from '@fluentui/react-utilities';
|
|
4
4
|
/**
|
|
5
5
|
* useResizeObserverRef_unstable simplifies resize observer connection and ensures debounce/cleanup
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
setResizeObserver(canUseDOM() ? new ResizeObserver(handleResize) : undefined);
|
|
6
|
+
*/ export const useResizeObserverRef_unstable = (resizeCallback)=>{
|
|
7
|
+
const container = React.useRef(null);
|
|
8
|
+
// the handler for resize observer
|
|
9
|
+
const handleResize = debounce((entries, observer)=>{
|
|
10
|
+
resizeCallback(entries, observer, container);
|
|
11
|
+
});
|
|
12
|
+
// Keep the reference of ResizeObserver in the state, as it should live through renders
|
|
13
|
+
const [resizeObserver, setResizeObserver] = React.useState(()=>canUseDOM() ? new ResizeObserver(handleResize) : undefined);
|
|
14
|
+
React.useEffect(()=>{
|
|
15
|
+
// Update our state when resizeCallback changes
|
|
16
|
+
resizeObserver === null || resizeObserver === void 0 ? void 0 : resizeObserver.disconnect();
|
|
17
|
+
setResizeObserver(canUseDOM() ? new ResizeObserver(handleResize) : undefined);
|
|
19
18
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
}, [
|
|
20
|
+
resizeCallback
|
|
21
|
+
]);
|
|
22
|
+
React.useEffect(()=>{
|
|
23
|
+
return ()=>{
|
|
24
|
+
resizeObserver === null || resizeObserver === void 0 ? void 0 : resizeObserver.disconnect();
|
|
25
|
+
};
|
|
25
26
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
27
|
+
}, []);
|
|
28
|
+
const scrollRef = React.useCallback((instance)=>{
|
|
29
|
+
if (container.current !== instance) {
|
|
30
|
+
if (container.current) {
|
|
31
|
+
resizeObserver === null || resizeObserver === void 0 ? void 0 : resizeObserver.unobserve(container.current);
|
|
32
|
+
}
|
|
33
|
+
container.current = instance;
|
|
34
|
+
if (container.current) {
|
|
35
|
+
resizeObserver === null || resizeObserver === void 0 ? void 0 : resizeObserver.observe(container.current);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}, [
|
|
39
|
+
resizeObserver
|
|
40
|
+
]);
|
|
41
|
+
return scrollRef;
|
|
39
42
|
};
|
|
40
|
-
//# sourceMappingURL=useResizeObserverRef.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["useResizeObserverRef.ts"],"sourcesContent":["import * as React from 'react';\nimport { debounce } from '../utilities/debounce';\nimport { canUseDOM } from '@fluentui/react-utilities';\nimport { ResizeCallbackWithRef } from './hooks.types';\n\n/**\n * useResizeObserverRef_unstable simplifies resize observer connection and ensures debounce/cleanup\n */\nexport const useResizeObserverRef_unstable = (resizeCallback: ResizeCallbackWithRef) => {\n const container = React.useRef<HTMLElement | null>(null);\n // the handler for resize observer\n const handleResize = debounce((entries: ResizeObserverEntry[], observer: ResizeObserver) => {\n resizeCallback(entries, observer, container);\n });\n\n // Keep the reference of ResizeObserver in the state, as it should live through renders\n const [resizeObserver, setResizeObserver] = React.useState(() =>\n canUseDOM() ? new ResizeObserver(handleResize) : undefined,\n );\n\n React.useEffect(() => {\n // Update our state when resizeCallback changes\n resizeObserver?.disconnect();\n setResizeObserver(canUseDOM() ? new ResizeObserver(handleResize) : undefined);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [resizeCallback]);\n\n React.useEffect(() => {\n return () => {\n resizeObserver?.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const scrollRef = React.useCallback(\n (instance: HTMLElement | HTMLDivElement | null) => {\n if (container.current !== instance) {\n if (container.current) {\n resizeObserver?.unobserve(container.current);\n }\n\n container.current = instance;\n if (container.current) {\n resizeObserver?.observe(container.current);\n }\n }\n },\n [resizeObserver],\n );\n\n return scrollRef;\n};\n"],"names":["React","debounce","canUseDOM","useResizeObserverRef_unstable","resizeCallback","container","useRef","handleResize","entries","observer","resizeObserver","setResizeObserver","useState","ResizeObserver","undefined","useEffect","disconnect","scrollRef","useCallback","instance","current","unobserve","observe"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,QAAQ,QAAQ,wBAAwB;AACjD,SAASC,SAAS,QAAQ,4BAA4B;AAGtD;;CAEC,GACD,OAAO,MAAMC,gCAAgC,CAACC,iBAA0C;IACtF,MAAMC,YAAYL,MAAMM,MAAM,CAAqB,IAAI;IACvD,kCAAkC;IAClC,MAAMC,eAAeN,SAAS,CAACO,SAAgCC,WAA6B;QAC1FL,eAAeI,SAASC,UAAUJ;IACpC;IAEA,uFAAuF;IACvF,MAAM,CAACK,gBAAgBC,kBAAkB,GAAGX,MAAMY,QAAQ,CAAC,IACzDV,cAAc,IAAIW,eAAeN,gBAAgBO,SAAS;IAG5Dd,MAAMe,SAAS,CAAC,IAAM;QACpB,+CAA+C;QAC/CL,2BAAAA,4BAAAA,KAAAA,IAAAA,eAAgBM,UAAU;QAC1BL,kBAAkBT,cAAc,IAAIW,eAAeN,gBAAgBO,SAAS;IAC5E,uDAAuD;IACzD,GAAG;QAACV;KAAe;IAEnBJ,MAAMe,SAAS,CAAC,IAAM;QACpB,OAAO,IAAM;YACXL,2BAAAA,4BAAAA,KAAAA,IAAAA,eAAgBM,UAAU;QAC5B;IACA,uDAAuD;IACzD,GAAG,EAAE;IAEL,MAAMC,YAAYjB,MAAMkB,WAAW,CACjC,CAACC,WAAkD;QACjD,IAAId,UAAUe,OAAO,KAAKD,UAAU;YAClC,IAAId,UAAUe,OAAO,EAAE;gBACrBV,2BAAAA,4BAAAA,KAAAA,IAAAA,eAAgBW,SAAS,CAAChB,UAAUe,OAAO;YAC7C,CAAC;YAEDf,UAAUe,OAAO,GAAGD;YACpB,IAAId,UAAUe,OAAO,EAAE;gBACrBV,2BAAAA,4BAAAA,KAAAA,IAAAA,eAAgBY,OAAO,CAACjB,UAAUe,OAAO;YAC3C,CAAC;QACH,CAAC;IACH,GACA;QAACV;KAAe;IAGlB,OAAOO;AACT,EAAE"}
|
|
@@ -2,52 +2,43 @@ import * as React from 'react';
|
|
|
2
2
|
import { useResizeObserverRef_unstable } from './useResizeObserverRef';
|
|
3
3
|
/**
|
|
4
4
|
* React hook that measures virtualized space based on a static size to ensure optimized virtualization length.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const [state, setState] = React.useState({
|
|
12
|
-
virtualizerLength: 0,
|
|
13
|
-
bufferSize: 0,
|
|
14
|
-
bufferItems: 0
|
|
15
|
-
});
|
|
16
|
-
const {
|
|
17
|
-
virtualizerLength,
|
|
18
|
-
bufferItems,
|
|
19
|
-
bufferSize
|
|
20
|
-
} = state;
|
|
21
|
-
const resizeCallback = React.useCallback((_entries, _observer, scrollRef) => {
|
|
22
|
-
if (!(scrollRef === null || scrollRef === void 0 ? void 0 : scrollRef.current)) {
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
const containerSize = direction === 'vertical' ? scrollRef === null || scrollRef === void 0 ? void 0 : scrollRef.current.getBoundingClientRect().height : scrollRef === null || scrollRef === void 0 ? void 0 : scrollRef.current.getBoundingClientRect().width;
|
|
26
|
-
/*
|
|
27
|
-
* Number of items required to cover viewport.
|
|
28
|
-
*/
|
|
29
|
-
const length = Math.ceil(containerSize / defaultItemSize + 1);
|
|
30
|
-
/*
|
|
31
|
-
* Number of items to append at each end, i.e. 'preload' each side before entering view.
|
|
32
|
-
*/
|
|
33
|
-
const newBufferItems = Math.max(Math.floor(length / 4), 2);
|
|
34
|
-
/*
|
|
35
|
-
* This is how far we deviate into the bufferItems to detect a redraw.
|
|
36
|
-
*/
|
|
37
|
-
const newBufferSize = Math.max(Math.floor(length / 8 * defaultItemSize), 1);
|
|
38
|
-
const totalLength = length + newBufferItems * 2 + 1;
|
|
39
|
-
setState({
|
|
40
|
-
virtualizerLength: totalLength,
|
|
41
|
-
bufferItems: newBufferItems,
|
|
42
|
-
bufferSize: newBufferSize
|
|
5
|
+
*/ export const useStaticVirtualizerMeasure = (virtualizerProps)=>{
|
|
6
|
+
const { defaultItemSize , direction ='vertical' } = virtualizerProps;
|
|
7
|
+
const [state, setState] = React.useState({
|
|
8
|
+
virtualizerLength: 0,
|
|
9
|
+
bufferSize: 0,
|
|
10
|
+
bufferItems: 0
|
|
43
11
|
});
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
12
|
+
const { virtualizerLength , bufferItems , bufferSize } = state;
|
|
13
|
+
const resizeCallback = React.useCallback((_entries, _observer, scrollRef)=>{
|
|
14
|
+
if (!(scrollRef === null || scrollRef === void 0 ? void 0 : scrollRef.current)) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const containerSize = direction === 'vertical' ? scrollRef === null || scrollRef === void 0 ? void 0 : scrollRef.current.getBoundingClientRect().height : scrollRef === null || scrollRef === void 0 ? void 0 : scrollRef.current.getBoundingClientRect().width;
|
|
18
|
+
/*
|
|
19
|
+
* Number of items required to cover viewport.
|
|
20
|
+
*/ const length = Math.ceil(containerSize / defaultItemSize + 1);
|
|
21
|
+
/*
|
|
22
|
+
* Number of items to append at each end, i.e. 'preload' each side before entering view.
|
|
23
|
+
*/ const newBufferItems = Math.max(Math.floor(length / 4), 2);
|
|
24
|
+
/*
|
|
25
|
+
* This is how far we deviate into the bufferItems to detect a redraw.
|
|
26
|
+
*/ const newBufferSize = Math.max(Math.floor(length / 8 * defaultItemSize), 1);
|
|
27
|
+
const totalLength = length + newBufferItems * 2 + 1;
|
|
28
|
+
setState({
|
|
29
|
+
virtualizerLength: totalLength,
|
|
30
|
+
bufferItems: newBufferItems,
|
|
31
|
+
bufferSize: newBufferSize
|
|
32
|
+
});
|
|
33
|
+
}, [
|
|
34
|
+
defaultItemSize,
|
|
35
|
+
direction
|
|
36
|
+
]);
|
|
37
|
+
const scrollRef = useResizeObserverRef_unstable(resizeCallback);
|
|
38
|
+
return {
|
|
39
|
+
virtualizerLength,
|
|
40
|
+
bufferItems,
|
|
41
|
+
bufferSize,
|
|
42
|
+
scrollRef
|
|
43
|
+
};
|
|
52
44
|
};
|
|
53
|
-
//# sourceMappingURL=useVirtualizerMeasure.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["useVirtualizerMeasure.ts"],"sourcesContent":["import * as React from 'react';\nimport { VirtualizerMeasureProps } from './hooks.types';\nimport { useResizeObserverRef_unstable } from './useResizeObserverRef';\n\n/**\n * React hook that measures virtualized space based on a static size to ensure optimized virtualization length.\n */\nexport const useStaticVirtualizerMeasure = <TElement extends HTMLElement>(\n virtualizerProps: VirtualizerMeasureProps,\n): {\n virtualizerLength: number;\n bufferItems: number;\n bufferSize: number;\n scrollRef: (instance: TElement | null) => void;\n} => {\n const { defaultItemSize, direction = 'vertical' } = virtualizerProps;\n\n const [state, setState] = React.useState({\n virtualizerLength: 0,\n bufferSize: 0,\n bufferItems: 0,\n });\n\n const { virtualizerLength, bufferItems, bufferSize } = state;\n\n const resizeCallback = React.useCallback(\n (\n _entries: ResizeObserverEntry[],\n _observer: ResizeObserver,\n scrollRef?: React.MutableRefObject<HTMLElement | null>,\n ) => {\n if (!scrollRef?.current) {\n return;\n }\n\n const containerSize =\n direction === 'vertical'\n ? scrollRef?.current.getBoundingClientRect().height\n : scrollRef?.current.getBoundingClientRect().width;\n\n /*\n * Number of items required to cover viewport.\n */\n const length = Math.ceil(containerSize / defaultItemSize + 1);\n\n /*\n * Number of items to append at each end, i.e. 'preload' each side before entering view.\n */\n const newBufferItems = Math.max(Math.floor(length / 4), 2);\n\n /*\n * This is how far we deviate into the bufferItems to detect a redraw.\n */\n const newBufferSize = Math.max(Math.floor((length / 8) * defaultItemSize), 1);\n\n const totalLength = length + newBufferItems * 2 + 1;\n\n setState({\n virtualizerLength: totalLength,\n bufferItems: newBufferItems,\n bufferSize: newBufferSize,\n });\n },\n [defaultItemSize, direction],\n );\n\n const scrollRef = useResizeObserverRef_unstable(resizeCallback);\n\n return {\n virtualizerLength,\n bufferItems,\n bufferSize,\n scrollRef,\n };\n};\n"],"names":["React","useResizeObserverRef_unstable","useStaticVirtualizerMeasure","virtualizerProps","defaultItemSize","direction","state","setState","useState","virtualizerLength","bufferSize","bufferItems","resizeCallback","useCallback","_entries","_observer","scrollRef","current","containerSize","getBoundingClientRect","height","width","length","Math","ceil","newBufferItems","max","floor","newBufferSize","totalLength"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAE/B,SAASC,6BAA6B,QAAQ,yBAAyB;AAEvE;;CAEC,GACD,OAAO,MAAMC,8BAA8B,CACzCC,mBAMG;IACH,MAAM,EAAEC,gBAAe,EAAEC,WAAY,WAAU,EAAE,GAAGF;IAEpD,MAAM,CAACG,OAAOC,SAAS,GAAGP,MAAMQ,QAAQ,CAAC;QACvCC,mBAAmB;QACnBC,YAAY;QACZC,aAAa;IACf;IAEA,MAAM,EAAEF,kBAAiB,EAAEE,YAAW,EAAED,WAAU,EAAE,GAAGJ;IAEvD,MAAMM,iBAAiBZ,MAAMa,WAAW,CACtC,CACEC,UACAC,WACAC,YACG;QACH,IAAI,CAACA,CAAAA,sBAAAA,uBAAAA,KAAAA,IAAAA,UAAWC,OAAO,AAAD,GAAG;YACvB;QACF,CAAC;QAED,MAAMC,gBACJb,cAAc,aACVW,sBAAAA,uBAAAA,KAAAA,IAAAA,UAAWC,OAAO,CAACE,qBAAqB,GAAGC,MAAM,GACjDJ,sBAAAA,uBAAAA,KAAAA,IAAAA,UAAWC,OAAO,CAACE,qBAAqB,GAAGE,KAAK;QAEtD;;OAEC,GACD,MAAMC,SAASC,KAAKC,IAAI,CAACN,gBAAgBd,kBAAkB;QAE3D;;OAEC,GACD,MAAMqB,iBAAiBF,KAAKG,GAAG,CAACH,KAAKI,KAAK,CAACL,SAAS,IAAI;QAExD;;OAEC,GACD,MAAMM,gBAAgBL,KAAKG,GAAG,CAACH,KAAKI,KAAK,CAAC,AAACL,SAAS,IAAKlB,kBAAkB;QAE3E,MAAMyB,cAAcP,SAASG,iBAAiB,IAAI;QAElDlB,SAAS;YACPE,mBAAmBoB;YACnBlB,aAAac;YACbf,YAAYkB;QACd;IACF,GACA;QAACxB;QAAiBC;KAAU;IAG9B,MAAMW,YAAYf,8BAA8BW;IAEhD,OAAO;QACLH;QACAE;QACAD;QACAM;IACF;AACF,EAAE"}
|
package/lib/index.js
CHANGED
|
@@ -3,4 +3,3 @@ export { useIntersectionObserver, useStaticVirtualizerMeasure, useDynamicVirtual
|
|
|
3
3
|
export { VirtualizerContextProvider, useVirtualizerContext_unstable } from './Utilities';
|
|
4
4
|
export { VirtualizerScrollView, virtualizerScrollViewClassNames, useVirtualizerScrollView_unstable, renderVirtualizerScrollView_unstable, useVirtualizerScrollViewStyles_unstable } from './VirtualizerScrollView';
|
|
5
5
|
export { VirtualizerScrollViewDynamic, virtualizerScrollViewDynamicClassNames, useVirtualizerScrollViewDynamic_unstable, renderVirtualizerScrollViewDynamic_unstable, useVirtualizerScrollViewDynamicStyles_unstable } from './VirtualizerScrollViewDynamic';
|
|
6
|
-
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["index.ts"],"sourcesContent":["export {\n Virtualizer,\n virtualizerClassNames,\n useVirtualizer_unstable,\n renderVirtualizer_unstable,\n useVirtualizerStyles_unstable,\n} from './Virtualizer';\nexport type {\n VirtualizerProps,\n VirtualizerState,\n VirtualizerSlots,\n VirtualizerChildRenderFunction,\n} from './Virtualizer';\n\nexport {\n useIntersectionObserver,\n useStaticVirtualizerMeasure,\n useDynamicVirtualizerMeasure,\n useResizeObserverRef_unstable,\n} from './Hooks';\n\nexport type { ResizeCallbackWithRef, VirtualizerMeasureDynamicProps, VirtualizerMeasureProps } from './Hooks';\n\nexport { VirtualizerContextProvider, useVirtualizerContext_unstable } from './Utilities';\n\nexport type { VirtualizerContextProps } from './Utilities';\n\nexport {\n VirtualizerScrollView,\n virtualizerScrollViewClassNames,\n useVirtualizerScrollView_unstable,\n renderVirtualizerScrollView_unstable,\n useVirtualizerScrollViewStyles_unstable,\n} from './VirtualizerScrollView';\n\nexport type {\n VirtualizerScrollViewProps,\n VirtualizerScrollViewState,\n VirtualizerScrollViewSlots,\n} from './VirtualizerScrollView';\n\nexport {\n VirtualizerScrollViewDynamic,\n virtualizerScrollViewDynamicClassNames,\n useVirtualizerScrollViewDynamic_unstable,\n renderVirtualizerScrollViewDynamic_unstable,\n useVirtualizerScrollViewDynamicStyles_unstable,\n} from './VirtualizerScrollViewDynamic';\n\nexport type {\n VirtualizerScrollViewDynamicProps,\n VirtualizerScrollViewDynamicState,\n VirtualizerScrollViewDynamicSlots,\n} from './VirtualizerScrollViewDynamic';\n"],"names":["Virtualizer","virtualizerClassNames","useVirtualizer_unstable","renderVirtualizer_unstable","useVirtualizerStyles_unstable","useIntersectionObserver","useStaticVirtualizerMeasure","useDynamicVirtualizerMeasure","useResizeObserverRef_unstable","VirtualizerContextProvider","useVirtualizerContext_unstable","VirtualizerScrollView","virtualizerScrollViewClassNames","useVirtualizerScrollView_unstable","renderVirtualizerScrollView_unstable","useVirtualizerScrollViewStyles_unstable","VirtualizerScrollViewDynamic","virtualizerScrollViewDynamicClassNames","useVirtualizerScrollViewDynamic_unstable","renderVirtualizerScrollViewDynamic_unstable","useVirtualizerScrollViewDynamicStyles_unstable"],"mappings":"AAAA,SACEA,WAAW,EACXC,qBAAqB,EACrBC,uBAAuB,EACvBC,0BAA0B,EAC1BC,6BAA6B,QACxB,gBAAgB;AAQvB,SACEC,uBAAuB,EACvBC,2BAA2B,EAC3BC,4BAA4B,EAC5BC,6BAA6B,QACxB,UAAU;AAIjB,SAASC,0BAA0B,EAAEC,8BAA8B,QAAQ,cAAc;AAIzF,SACEC,qBAAqB,EACrBC,+BAA+B,EAC/BC,iCAAiC,EACjCC,oCAAoC,EACpCC,uCAAuC,QAClC,0BAA0B;AAQjC,SACEC,4BAA4B,EAC5BC,sCAAsC,EACtCC,wCAAwC,EACxCC,2CAA2C,EAC3CC,8CAA8C,QACzC,iCAAiC"}
|