@shopify/flash-list 1.8.0 → 2.0.0-alpha.2
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/README.md +147 -26
- package/dist/FlashListProps.d.ts +65 -2
- package/dist/FlashListProps.d.ts.map +1 -1
- package/dist/__tests__/AverageWindow.test.js +35 -0
- package/dist/__tests__/AverageWindow.test.js.map +1 -1
- package/dist/enableNewCore.d.ts +3 -0
- package/dist/enableNewCore.d.ts.map +1 -0
- package/dist/enableNewCore.js +25 -0
- package/dist/enableNewCore.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -8
- package/dist/index.js.map +1 -1
- package/dist/recyclerview/RecycleKeyManager.d.ts +82 -0
- package/dist/recyclerview/RecycleKeyManager.d.ts.map +1 -0
- package/dist/recyclerview/RecycleKeyManager.js +135 -0
- package/dist/recyclerview/RecycleKeyManager.js.map +1 -0
- package/dist/recyclerview/RecyclerView.d.ts +12 -0
- package/dist/recyclerview/RecyclerView.d.ts.map +1 -0
- package/dist/recyclerview/RecyclerView.js +283 -0
- package/dist/recyclerview/RecyclerView.js.map +1 -0
- package/dist/recyclerview/RecyclerViewContextProvider.d.ts +12 -0
- package/dist/recyclerview/RecyclerViewContextProvider.d.ts.map +1 -0
- package/dist/recyclerview/RecyclerViewContextProvider.js +11 -0
- package/dist/recyclerview/RecyclerViewContextProvider.js.map +1 -0
- package/dist/recyclerview/RecyclerViewManager.d.ts +52 -0
- package/dist/recyclerview/RecyclerViewManager.d.ts.map +1 -0
- package/dist/recyclerview/RecyclerViewManager.js +323 -0
- package/dist/recyclerview/RecyclerViewManager.js.map +1 -0
- package/dist/recyclerview/RecyclerViewProps.d.ts +9 -0
- package/dist/recyclerview/RecyclerViewProps.d.ts.map +1 -0
- package/dist/recyclerview/RecyclerViewProps.js +3 -0
- package/dist/recyclerview/RecyclerViewProps.js.map +1 -0
- package/dist/recyclerview/ViewHolder.d.ts +45 -0
- package/dist/recyclerview/ViewHolder.d.ts.map +1 -0
- package/dist/recyclerview/ViewHolder.js +96 -0
- package/dist/recyclerview/ViewHolder.js.map +1 -0
- package/dist/recyclerview/ViewHolderCollection.d.ts +57 -0
- package/dist/recyclerview/ViewHolderCollection.d.ts.map +1 -0
- package/dist/recyclerview/ViewHolderCollection.js +75 -0
- package/dist/recyclerview/ViewHolderCollection.js.map +1 -0
- package/dist/recyclerview/components/CompatScroller.d.ts +7 -0
- package/dist/recyclerview/components/CompatScroller.d.ts.map +1 -0
- package/dist/recyclerview/components/CompatScroller.js +8 -0
- package/dist/recyclerview/components/CompatScroller.js.map +1 -0
- package/dist/recyclerview/components/CompatView.d.ts +7 -0
- package/dist/recyclerview/components/CompatView.d.ts.map +1 -0
- package/dist/recyclerview/components/CompatView.js +8 -0
- package/dist/recyclerview/components/CompatView.js.map +1 -0
- package/dist/recyclerview/components/ScrollAnchor.d.ts +28 -0
- package/dist/recyclerview/components/ScrollAnchor.d.ts.map +1 -0
- package/dist/recyclerview/components/ScrollAnchor.js +35 -0
- package/dist/recyclerview/components/ScrollAnchor.js.map +1 -0
- package/dist/recyclerview/components/StickyHeaders.d.ts +38 -0
- package/dist/recyclerview/components/StickyHeaders.d.ts.map +1 -0
- package/dist/recyclerview/components/StickyHeaders.js +119 -0
- package/dist/recyclerview/components/StickyHeaders.js.map +1 -0
- package/dist/recyclerview/helpers/ConsecutiveNumbers.d.ts +51 -0
- package/dist/recyclerview/helpers/ConsecutiveNumbers.d.ts.map +1 -0
- package/dist/recyclerview/helpers/ConsecutiveNumbers.js +122 -0
- package/dist/recyclerview/helpers/ConsecutiveNumbers.js.map +1 -0
- package/dist/recyclerview/helpers/EngagedIndicesTracker.d.ts +59 -0
- package/dist/recyclerview/helpers/EngagedIndicesTracker.d.ts.map +1 -0
- package/dist/recyclerview/helpers/EngagedIndicesTracker.js +138 -0
- package/dist/recyclerview/helpers/EngagedIndicesTracker.js.map +1 -0
- package/dist/recyclerview/hooks/useBoundDetection.d.ts +19 -0
- package/dist/recyclerview/hooks/useBoundDetection.d.ts.map +1 -0
- package/dist/recyclerview/hooks/useBoundDetection.js +103 -0
- package/dist/recyclerview/hooks/useBoundDetection.js.map +1 -0
- package/dist/recyclerview/hooks/useLayoutState.d.ts +12 -0
- package/dist/recyclerview/hooks/useLayoutState.d.ts.map +1 -0
- package/dist/recyclerview/hooks/useLayoutState.js +43 -0
- package/dist/recyclerview/hooks/useLayoutState.js.map +1 -0
- package/dist/recyclerview/hooks/useOnLoad.d.ts +25 -0
- package/dist/recyclerview/hooks/useOnLoad.d.ts.map +1 -0
- package/dist/recyclerview/hooks/useOnLoad.js +73 -0
- package/dist/recyclerview/hooks/useOnLoad.js.map +1 -0
- package/dist/recyclerview/hooks/useRecyclerViewController.d.ts +72 -0
- package/dist/recyclerview/hooks/useRecyclerViewController.d.ts.map +1 -0
- package/dist/recyclerview/hooks/useRecyclerViewController.js +370 -0
- package/dist/recyclerview/hooks/useRecyclerViewController.js.map +1 -0
- package/dist/recyclerview/hooks/useRecyclerViewManager.d.ts +6 -0
- package/dist/recyclerview/hooks/useRecyclerViewManager.d.ts.map +1 -0
- package/dist/recyclerview/hooks/useRecyclerViewManager.js +27 -0
- package/dist/recyclerview/hooks/useRecyclerViewManager.js.map +1 -0
- package/dist/recyclerview/hooks/useRecyclingState.d.ts +16 -0
- package/dist/recyclerview/hooks/useRecyclingState.d.ts.map +1 -0
- package/dist/recyclerview/hooks/useRecyclingState.js +54 -0
- package/dist/recyclerview/hooks/useRecyclingState.js.map +1 -0
- package/dist/recyclerview/hooks/useSecondaryProps.d.ts +27 -0
- package/dist/recyclerview/hooks/useSecondaryProps.d.ts.map +1 -0
- package/dist/recyclerview/hooks/useSecondaryProps.js +93 -0
- package/dist/recyclerview/hooks/useSecondaryProps.js.map +1 -0
- package/dist/recyclerview/hooks/useUnmountFlag.d.ts +11 -0
- package/dist/recyclerview/hooks/useUnmountFlag.d.ts.map +1 -0
- package/dist/recyclerview/hooks/useUnmountFlag.js +28 -0
- package/dist/recyclerview/hooks/useUnmountFlag.js.map +1 -0
- package/dist/recyclerview/layout-managers/GridLayoutManager.d.ts +65 -0
- package/dist/recyclerview/layout-managers/GridLayoutManager.d.ts.map +1 -0
- package/dist/recyclerview/layout-managers/GridLayoutManager.js +204 -0
- package/dist/recyclerview/layout-managers/GridLayoutManager.js.map +1 -0
- package/dist/recyclerview/layout-managers/LayoutManager.d.ts +281 -0
- package/dist/recyclerview/layout-managers/LayoutManager.d.ts.map +1 -0
- package/dist/recyclerview/layout-managers/LayoutManager.js +250 -0
- package/dist/recyclerview/layout-managers/LayoutManager.js.map +1 -0
- package/dist/recyclerview/layout-managers/LinearLayoutManager.d.ts +52 -0
- package/dist/recyclerview/layout-managers/LinearLayoutManager.d.ts.map +1 -0
- package/dist/recyclerview/layout-managers/LinearLayoutManager.js +191 -0
- package/dist/recyclerview/layout-managers/LinearLayoutManager.js.map +1 -0
- package/dist/recyclerview/layout-managers/MasonryLayoutManager.d.ts +73 -0
- package/dist/recyclerview/layout-managers/MasonryLayoutManager.d.ts.map +1 -0
- package/dist/recyclerview/layout-managers/MasonryLayoutManager.js +274 -0
- package/dist/recyclerview/layout-managers/MasonryLayoutManager.js.map +1 -0
- package/dist/recyclerview/utils/adjustOffsetForRTL.d.ts +12 -0
- package/dist/recyclerview/utils/adjustOffsetForRTL.d.ts.map +1 -0
- package/dist/recyclerview/utils/adjustOffsetForRTL.js +18 -0
- package/dist/recyclerview/utils/adjustOffsetForRTL.js.map +1 -0
- package/dist/recyclerview/utils/componentUtils.d.ts +19 -0
- package/dist/recyclerview/utils/componentUtils.d.ts.map +1 -0
- package/dist/recyclerview/utils/componentUtils.js +32 -0
- package/dist/recyclerview/utils/componentUtils.js.map +1 -0
- package/dist/recyclerview/utils/findVisibleIndex.d.ts +24 -0
- package/dist/recyclerview/utils/findVisibleIndex.d.ts.map +1 -0
- package/dist/recyclerview/utils/findVisibleIndex.js +82 -0
- package/dist/recyclerview/utils/findVisibleIndex.js.map +1 -0
- package/dist/recyclerview/utils/measureLayout.d.ts +56 -0
- package/dist/recyclerview/utils/measureLayout.d.ts.map +1 -0
- package/dist/recyclerview/utils/measureLayout.js +77 -0
- package/dist/recyclerview/utils/measureLayout.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/AverageWindow.d.ts +13 -0
- package/dist/utils/AverageWindow.d.ts.map +1 -1
- package/dist/utils/AverageWindow.js +30 -1
- package/dist/utils/AverageWindow.js.map +1 -1
- package/package.json +1 -1
- package/src/FlashListProps.ts +73 -2
- package/src/__tests__/AverageWindow.test.ts +49 -1
- package/src/enableNewCore.ts +22 -0
- package/src/index.ts +21 -0
- package/src/recyclerview/RecycleKeyManager.ts +185 -0
- package/src/recyclerview/RecyclerView.tsx +500 -0
- package/src/recyclerview/RecyclerViewContextProvider.ts +19 -0
- package/src/recyclerview/RecyclerViewManager.ts +379 -0
- package/src/recyclerview/RecyclerViewProps.ts +10 -0
- package/src/recyclerview/ViewHolder.tsx +173 -0
- package/src/recyclerview/ViewHolderCollection.tsx +164 -0
- package/src/recyclerview/components/CompatScroller.ts +9 -0
- package/src/recyclerview/components/CompatView.ts +9 -0
- package/src/recyclerview/components/ScrollAnchor.tsx +53 -0
- package/src/recyclerview/components/StickyHeaders.tsx +210 -0
- package/src/recyclerview/helpers/ConsecutiveNumbers.ts +120 -0
- package/src/recyclerview/helpers/EngagedIndicesTracker.ts +191 -0
- package/src/recyclerview/hooks/useBoundDetection.ts +127 -0
- package/src/recyclerview/hooks/useLayoutState.ts +46 -0
- package/src/recyclerview/hooks/useOnLoad.ts +78 -0
- package/src/recyclerview/hooks/useRecyclerViewController.tsx +487 -0
- package/src/recyclerview/hooks/useRecyclerViewManager.ts +30 -0
- package/src/recyclerview/hooks/useRecyclingState.ts +63 -0
- package/src/recyclerview/hooks/useSecondaryProps.tsx +119 -0
- package/src/recyclerview/hooks/useUnmountFlag.ts +26 -0
- package/src/recyclerview/layout-managers/GridLayoutManager.ts +215 -0
- package/src/recyclerview/layout-managers/LayoutManager.ts +493 -0
- package/src/recyclerview/layout-managers/LinearLayoutManager.ts +167 -0
- package/src/recyclerview/layout-managers/MasonryLayoutManager.ts +302 -0
- package/src/recyclerview/utils/adjustOffsetForRTL.ts +17 -0
- package/src/recyclerview/utils/componentUtils.ts +28 -0
- package/src/recyclerview/utils/findVisibleIndex.ts +94 -0
- package/src/recyclerview/utils/measureLayout.ts +89 -0
- package/src/utils/AverageWindow.ts +33 -0
- package/src/viewability/ViewToken.ts +1 -1
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RVEngagedIndicesTrackerImpl = void 0;
|
|
4
|
+
var ConsecutiveNumbers_1 = require("./ConsecutiveNumbers");
|
|
5
|
+
var RVEngagedIndicesTrackerImpl = /** @class */ (function () {
|
|
6
|
+
function RVEngagedIndicesTrackerImpl() {
|
|
7
|
+
// Current scroll position of the list
|
|
8
|
+
this.scrollOffset = 0;
|
|
9
|
+
// Distance to pre-render items before and after the visible viewport (in pixels)
|
|
10
|
+
this.drawDistance = 250;
|
|
11
|
+
// Currently rendered item indices (including buffer items)
|
|
12
|
+
this.engagedIndices = ConsecutiveNumbers_1.ConsecutiveNumbers.EMPTY;
|
|
13
|
+
// Buffer distribution multipliers for scroll direction optimization
|
|
14
|
+
this.smallMultiplier = 0.1; // Used for buffer in the opposite direction of scroll
|
|
15
|
+
this.largeMultiplier = 0.9; // Used for buffer in the direction of scroll
|
|
16
|
+
// Circular buffer to track recent scroll velocities for direction detection
|
|
17
|
+
this.velocityHistory = [-1, -1, -1, -1, -1];
|
|
18
|
+
this.velocityIndex = 0;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Updates scroll position and determines which items should be rendered.
|
|
22
|
+
* Implements a smart buffer system that:
|
|
23
|
+
* 1. Calculates the visible viewport
|
|
24
|
+
* 2. Determines optimal buffer distribution based on scroll direction
|
|
25
|
+
* 3. Adjusts buffer sizes at list boundaries
|
|
26
|
+
* 4. Returns new indices that need to be rendered
|
|
27
|
+
*/
|
|
28
|
+
RVEngagedIndicesTrackerImpl.prototype.updateScrollOffset = function (offset, velocity, layoutManager) {
|
|
29
|
+
// Update current scroll position
|
|
30
|
+
this.scrollOffset = offset;
|
|
31
|
+
// STEP 1: Determine the currently visible viewport
|
|
32
|
+
var windowSize = layoutManager.getWindowsSize();
|
|
33
|
+
var isHorizontal = layoutManager.isHorizontal();
|
|
34
|
+
var viewportStart = offset;
|
|
35
|
+
var viewportSize = isHorizontal ? windowSize.width : windowSize.height;
|
|
36
|
+
var viewportEnd = viewportStart + viewportSize;
|
|
37
|
+
// STEP 2: Determine buffer size and distribution
|
|
38
|
+
// The total extra space where items will be pre-rendered
|
|
39
|
+
var totalBuffer = this.drawDistance * 2;
|
|
40
|
+
// Determine scroll direction to optimize buffer distribution
|
|
41
|
+
var isScrollingBackward = this.isScrollingBackward(isHorizontal ? velocity === null || velocity === void 0 ? void 0 : velocity.x : velocity === null || velocity === void 0 ? void 0 : velocity.y);
|
|
42
|
+
// Distribute more buffer in the direction of scrolling
|
|
43
|
+
// When scrolling forward: more buffer after viewport
|
|
44
|
+
// When scrolling backward: more buffer before viewport
|
|
45
|
+
var beforeRatio = isScrollingBackward
|
|
46
|
+
? this.largeMultiplier
|
|
47
|
+
: this.smallMultiplier;
|
|
48
|
+
var afterRatio = isScrollingBackward
|
|
49
|
+
? this.smallMultiplier
|
|
50
|
+
: this.largeMultiplier;
|
|
51
|
+
var bufferBefore = Math.ceil(totalBuffer * beforeRatio);
|
|
52
|
+
var bufferAfter = Math.ceil(totalBuffer * afterRatio);
|
|
53
|
+
// STEP 3: Calculate the extended viewport (visible area + buffers)
|
|
54
|
+
// The start position with buffer (never less than 0)
|
|
55
|
+
var extendedStart = Math.max(0, viewportStart - bufferBefore);
|
|
56
|
+
// If we couldn't apply full buffer at start, calculate how much was unused
|
|
57
|
+
var unusedStartBuffer = Math.max(0, bufferBefore - viewportStart);
|
|
58
|
+
// Add any unused start buffer to the end buffer
|
|
59
|
+
var extendedEnd = viewportEnd + bufferAfter + unusedStartBuffer;
|
|
60
|
+
// STEP 4: Handle end boundary adjustments
|
|
61
|
+
// Get the total content size to check for end boundary
|
|
62
|
+
var layoutSize = layoutManager.getLayoutSize();
|
|
63
|
+
var maxPosition = isHorizontal ? layoutSize.width : layoutSize.height;
|
|
64
|
+
// If we hit the end boundary, redistribute unused buffer to the start
|
|
65
|
+
if (extendedEnd > maxPosition) {
|
|
66
|
+
// Calculate unused end buffer and apply it to the start if possible
|
|
67
|
+
var unusedEndBuffer = extendedEnd - maxPosition;
|
|
68
|
+
extendedEnd = maxPosition;
|
|
69
|
+
// Try to extend start position further with the unused end buffer
|
|
70
|
+
extendedStart = Math.max(0, extendedStart - unusedEndBuffer);
|
|
71
|
+
}
|
|
72
|
+
// STEP 5: Get and return the new engaged indices
|
|
73
|
+
var newEngagedIndices = layoutManager.getVisibleLayouts(extendedStart, extendedEnd);
|
|
74
|
+
if (!isHorizontal) {
|
|
75
|
+
//console.log("newEngagedIndices", newEngagedIndices, this.scrollOffset);
|
|
76
|
+
}
|
|
77
|
+
// Only return new indices if they've changed
|
|
78
|
+
var oldEngagedIndices = this.engagedIndices;
|
|
79
|
+
this.engagedIndices = newEngagedIndices;
|
|
80
|
+
return newEngagedIndices.equals(oldEngagedIndices)
|
|
81
|
+
? undefined
|
|
82
|
+
: newEngagedIndices;
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Determines scroll direction by analyzing recent velocity history.
|
|
86
|
+
* Uses a majority voting system on the last 5 velocity values.
|
|
87
|
+
* @param velocity - Current scroll velocity component (x or y)
|
|
88
|
+
* @returns true if scrolling backward (negative direction), false otherwise
|
|
89
|
+
*/
|
|
90
|
+
RVEngagedIndicesTrackerImpl.prototype.isScrollingBackward = function (velocity) {
|
|
91
|
+
//update velocity history
|
|
92
|
+
if (velocity) {
|
|
93
|
+
this.velocityHistory[this.velocityIndex] = velocity;
|
|
94
|
+
this.velocityIndex =
|
|
95
|
+
(this.velocityIndex + 1) % this.velocityHistory.length;
|
|
96
|
+
}
|
|
97
|
+
//should decide based on whether we have more positive or negative values, use for loop
|
|
98
|
+
var positiveCount = 0;
|
|
99
|
+
var negativeCount = 0;
|
|
100
|
+
for (var i = 0; i < this.velocityHistory.length; i++) {
|
|
101
|
+
if (this.velocityHistory[i] > 0) {
|
|
102
|
+
positiveCount++;
|
|
103
|
+
}
|
|
104
|
+
else if (this.velocityHistory[i] < 0) {
|
|
105
|
+
negativeCount++;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return positiveCount < negativeCount;
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* Calculates which items are currently visible in the viewport.
|
|
112
|
+
* Unlike getEngagedIndices, this doesn't include buffer items.
|
|
113
|
+
* @param layoutManager - Layout manager to fetch item positions
|
|
114
|
+
* @returns Indices of items currently visible in the viewport
|
|
115
|
+
*/
|
|
116
|
+
RVEngagedIndicesTrackerImpl.prototype.computeVisibleIndices = function (layoutManager) {
|
|
117
|
+
var windowSize = layoutManager.getWindowsSize();
|
|
118
|
+
var isHorizontal = layoutManager.isHorizontal();
|
|
119
|
+
// Calculate viewport boundaries
|
|
120
|
+
var viewportStart = this.scrollOffset;
|
|
121
|
+
var viewportSize = isHorizontal ? windowSize.width : windowSize.height;
|
|
122
|
+
var viewportEnd = viewportStart + viewportSize;
|
|
123
|
+
// Get indices of items currently visible in the viewport
|
|
124
|
+
var newVisibleIndices = layoutManager.getVisibleLayouts(viewportStart, viewportEnd);
|
|
125
|
+
return newVisibleIndices;
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* Returns the currently engaged (rendered) indices.
|
|
129
|
+
* This includes both visible items and buffer items.
|
|
130
|
+
* @returns The last computed set of engaged indices
|
|
131
|
+
*/
|
|
132
|
+
RVEngagedIndicesTrackerImpl.prototype.getEngagedIndices = function () {
|
|
133
|
+
return this.engagedIndices;
|
|
134
|
+
};
|
|
135
|
+
return RVEngagedIndicesTrackerImpl;
|
|
136
|
+
}());
|
|
137
|
+
exports.RVEngagedIndicesTrackerImpl = RVEngagedIndicesTrackerImpl;
|
|
138
|
+
//# sourceMappingURL=EngagedIndicesTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EngagedIndicesTracker.js","sourceRoot":"","sources":["../../../src/recyclerview/helpers/EngagedIndicesTracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { RecyclerViewManager } from "../RecyclerViewManager";
|
|
3
|
+
import { RecyclerViewProps } from "../RecyclerViewProps";
|
|
4
|
+
import { CompatScroller } from "../components/CompatScroller";
|
|
5
|
+
/**
|
|
6
|
+
* Hook to detect when the scroll position reaches near the start or end of the list
|
|
7
|
+
* and trigger the appropriate callbacks. This hook is responsible for:
|
|
8
|
+
* 1. Detecting when the user scrolls near the end of the list (onEndReached)
|
|
9
|
+
* 2. Detecting when the user scrolls near the start of the list (onStartReached)
|
|
10
|
+
* 3. Managing auto-scrolling to bottom when new content is added
|
|
11
|
+
*
|
|
12
|
+
* @param recyclerViewManager - The RecyclerViewManager instance that handles the list's core functionality
|
|
13
|
+
* @param props - The RecyclerViewProps containing configuration and callbacks
|
|
14
|
+
* @param scrollViewRef - Reference to the scrollable container component
|
|
15
|
+
*/
|
|
16
|
+
export declare function useBoundDetection<T>(recyclerViewManager: RecyclerViewManager<T>, props: RecyclerViewProps<T>, scrollViewRef: React.RefObject<CompatScroller>): {
|
|
17
|
+
checkBounds: () => void;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=useBoundDetection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBoundDetection.d.ts","sourceRoot":"","sources":["../../../src/recyclerview/hooks/useBoundDetection.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAC3C,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAC3B,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC;;EA0G/C"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useBoundDetection = void 0;
|
|
4
|
+
var react_1 = require("react");
|
|
5
|
+
var react_2 = require("react");
|
|
6
|
+
/**
|
|
7
|
+
* Hook to detect when the scroll position reaches near the start or end of the list
|
|
8
|
+
* and trigger the appropriate callbacks. This hook is responsible for:
|
|
9
|
+
* 1. Detecting when the user scrolls near the end of the list (onEndReached)
|
|
10
|
+
* 2. Detecting when the user scrolls near the start of the list (onStartReached)
|
|
11
|
+
* 3. Managing auto-scrolling to bottom when new content is added
|
|
12
|
+
*
|
|
13
|
+
* @param recyclerViewManager - The RecyclerViewManager instance that handles the list's core functionality
|
|
14
|
+
* @param props - The RecyclerViewProps containing configuration and callbacks
|
|
15
|
+
* @param scrollViewRef - Reference to the scrollable container component
|
|
16
|
+
*/
|
|
17
|
+
function useBoundDetection(recyclerViewManager, props, scrollViewRef) {
|
|
18
|
+
// Track whether we've already triggered the end reached callback to prevent duplicate calls
|
|
19
|
+
var pendingEndReached = (0, react_2.useRef)(false);
|
|
20
|
+
// Track whether we've already triggered the start reached callback to prevent duplicate calls
|
|
21
|
+
var pendingStartReached = (0, react_2.useRef)(false);
|
|
22
|
+
// Track whether we should auto-scroll to bottom when new content is added
|
|
23
|
+
var pendingAutoscrollToBottom = (0, react_2.useRef)(false);
|
|
24
|
+
var horizontal = props.horizontal, data = props.data, maintainVisibleContentPosition = props.maintainVisibleContentPosition;
|
|
25
|
+
/**
|
|
26
|
+
* Checks if the scroll position is near the start or end of the list
|
|
27
|
+
* and triggers appropriate callbacks if configured.
|
|
28
|
+
*/
|
|
29
|
+
var checkBounds = (0, react_1.useCallback)(function () {
|
|
30
|
+
var _a, _b, _c;
|
|
31
|
+
// Skip all calculations if neither callback is provided and autoscroll is disabled
|
|
32
|
+
var autoscrollToBottomThreshold = (_a = maintainVisibleContentPosition === null || maintainVisibleContentPosition === void 0 ? void 0 : maintainVisibleContentPosition.autoscrollToBottomThreshold) !== null && _a !== void 0 ? _a : -1;
|
|
33
|
+
if (!props.onEndReached &&
|
|
34
|
+
!props.onStartReached &&
|
|
35
|
+
autoscrollToBottomThreshold < 0) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (recyclerViewManager.getIsFirstLayoutComplete()) {
|
|
39
|
+
var lastScrollOffset = recyclerViewManager.getAbsoluteLastScrollOffset();
|
|
40
|
+
var contentSize = recyclerViewManager.getChildContainerDimensions();
|
|
41
|
+
var windowSize = recyclerViewManager.getWindowSize();
|
|
42
|
+
var isHorizontal = props.horizontal === true;
|
|
43
|
+
// Calculate dimensions based on scroll direction
|
|
44
|
+
var visibleLength = isHorizontal ? windowSize.width : windowSize.height;
|
|
45
|
+
var contentLength = (isHorizontal ? contentSize.width : contentSize.height) +
|
|
46
|
+
recyclerViewManager.firstItemOffset;
|
|
47
|
+
// Check if we're near the end of the list
|
|
48
|
+
if (props.onEndReached) {
|
|
49
|
+
var onEndReachedThreshold = (_b = props.onEndReachedThreshold) !== null && _b !== void 0 ? _b : 0.5;
|
|
50
|
+
var endThresholdDistance = onEndReachedThreshold * visibleLength;
|
|
51
|
+
var isNearEnd = Math.ceil(lastScrollOffset + visibleLength) >=
|
|
52
|
+
contentLength - endThresholdDistance;
|
|
53
|
+
if (isNearEnd && !pendingEndReached.current) {
|
|
54
|
+
pendingEndReached.current = true;
|
|
55
|
+
props.onEndReached();
|
|
56
|
+
}
|
|
57
|
+
pendingEndReached.current = isNearEnd;
|
|
58
|
+
}
|
|
59
|
+
// Check if we're near the start of the list
|
|
60
|
+
if (props.onStartReached) {
|
|
61
|
+
var onStartReachedThreshold = (_c = props.onStartReachedThreshold) !== null && _c !== void 0 ? _c : 0.2;
|
|
62
|
+
var startThresholdDistance = onStartReachedThreshold * visibleLength;
|
|
63
|
+
var isNearStart = lastScrollOffset <= startThresholdDistance;
|
|
64
|
+
if (isNearStart && !pendingStartReached.current) {
|
|
65
|
+
pendingStartReached.current = true;
|
|
66
|
+
props.onStartReached();
|
|
67
|
+
}
|
|
68
|
+
pendingStartReached.current = isNearStart;
|
|
69
|
+
}
|
|
70
|
+
// Handle auto-scrolling to bottom for vertical lists
|
|
71
|
+
if (!horizontal) {
|
|
72
|
+
var autoscrollToBottomThresholdDistance = autoscrollToBottomThreshold * visibleLength;
|
|
73
|
+
var isNearBottom = Math.ceil(lastScrollOffset + visibleLength) >=
|
|
74
|
+
contentLength - autoscrollToBottomThresholdDistance;
|
|
75
|
+
if (isNearBottom) {
|
|
76
|
+
pendingAutoscrollToBottom.current = true;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
pendingAutoscrollToBottom.current = false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}, [recyclerViewManager, props]);
|
|
84
|
+
// Reset end reached state when data changes
|
|
85
|
+
(0, react_1.useMemo)(function () {
|
|
86
|
+
pendingEndReached.current = false;
|
|
87
|
+
}, [data]);
|
|
88
|
+
// Auto-scroll to bottom when new content is added and we're near the bottom
|
|
89
|
+
(0, react_1.useEffect)(function () {
|
|
90
|
+
if (pendingAutoscrollToBottom.current) {
|
|
91
|
+
requestAnimationFrame(function () {
|
|
92
|
+
var _a;
|
|
93
|
+
(_a = scrollViewRef.current) === null || _a === void 0 ? void 0 : _a.scrollToEnd();
|
|
94
|
+
pendingAutoscrollToBottom.current = false;
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}, [data]);
|
|
98
|
+
return {
|
|
99
|
+
checkBounds: checkBounds,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
exports.useBoundDetection = useBoundDetection;
|
|
103
|
+
//# sourceMappingURL=useBoundDetection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBoundDetection.js","sourceRoot":"","sources":["../../../src/recyclerview/hooks/useBoundDetection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom hook that combines state management with RecyclerView layout updates.
|
|
3
|
+
* This hook provides a way to manage state that affects the layout of the RecyclerView,
|
|
4
|
+
* ensuring that any state changes trigger a layout recalculation.
|
|
5
|
+
*
|
|
6
|
+
* @param initialState - The initial state value or a function that returns the initial state
|
|
7
|
+
* @returns A tuple containing:
|
|
8
|
+
* - The current state value
|
|
9
|
+
* - A setter function that updates the state and triggers a layout recalculation
|
|
10
|
+
*/
|
|
11
|
+
export declare function useLayoutState<T>(initialState: T | (() => T)): [T, (newValue: T | ((prevValue: T) => T)) => void];
|
|
12
|
+
//# sourceMappingURL=useLayoutState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLayoutState.d.ts","sourceRoot":"","sources":["../../../src/recyclerview/hooks/useLayoutState.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,YAAY,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAC1B,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CA6BpD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useLayoutState = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var react_1 = require("react");
|
|
6
|
+
var RecyclerViewContextProvider_1 = require("../RecyclerViewContextProvider");
|
|
7
|
+
/**
|
|
8
|
+
* Custom hook that combines state management with RecyclerView layout updates.
|
|
9
|
+
* This hook provides a way to manage state that affects the layout of the RecyclerView,
|
|
10
|
+
* ensuring that any state changes trigger a layout recalculation.
|
|
11
|
+
*
|
|
12
|
+
* @param initialState - The initial state value or a function that returns the initial state
|
|
13
|
+
* @returns A tuple containing:
|
|
14
|
+
* - The current state value
|
|
15
|
+
* - A setter function that updates the state and triggers a layout recalculation
|
|
16
|
+
*/
|
|
17
|
+
function useLayoutState(initialState) {
|
|
18
|
+
// Initialize state with the provided initial value
|
|
19
|
+
var _a = tslib_1.__read((0, react_1.useState)(initialState), 2), state = _a[0], setState = _a[1];
|
|
20
|
+
// Get the RecyclerView context for layout management
|
|
21
|
+
var recyclerViewContext = (0, RecyclerViewContextProvider_1.useRecyclerViewContext)();
|
|
22
|
+
/**
|
|
23
|
+
* Setter function that updates the state and triggers a layout recalculation.
|
|
24
|
+
* This ensures that any state changes that affect the layout are properly reflected
|
|
25
|
+
* in the RecyclerView's visual representation.
|
|
26
|
+
*
|
|
27
|
+
* @param newValue - Either a new state value or a function that receives the previous state
|
|
28
|
+
* and returns the new state
|
|
29
|
+
*/
|
|
30
|
+
var setLayoutState = (0, react_1.useCallback)(function (newValue) {
|
|
31
|
+
// Update the state using either the new value or the result of the updater function
|
|
32
|
+
setState(function (prevValue) {
|
|
33
|
+
return typeof newValue === "function"
|
|
34
|
+
? newValue(prevValue)
|
|
35
|
+
: newValue;
|
|
36
|
+
});
|
|
37
|
+
// Trigger a layout recalculation in the RecyclerView
|
|
38
|
+
recyclerViewContext === null || recyclerViewContext === void 0 ? void 0 : recyclerViewContext.layout();
|
|
39
|
+
}, [recyclerViewContext]);
|
|
40
|
+
return [state, setLayoutState];
|
|
41
|
+
}
|
|
42
|
+
exports.useLayoutState = useLayoutState;
|
|
43
|
+
//# sourceMappingURL=useLayoutState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLayoutState.js","sourceRoot":"","sources":["../../../src/recyclerview/hooks/useLayoutState.ts"],"names":[],"mappings":";;;;AAAA,+BAA8C;AAE9C,8EAAwE;AAExE;;;;;;;;;GASG;AACH,SAAgB,cAAc,CAC5B,YAA2B;IAE3B,mDAAmD;IAC7C,IAAA,KAAA,eAAoB,IAAA,gBAAQ,EAAI,YAAY,CAAC,IAAA,EAA5C,KAAK,QAAA,EAAE,QAAQ,QAA6B,CAAC;IACpD,qDAAqD;IACrD,IAAM,mBAAmB,GAAG,IAAA,oDAAsB,GAAE,CAAC;IAErD;;;;;;;OAOG;IACH,IAAM,cAAc,GAAG,IAAA,mBAAW,EAChC,UAAC,QAAmC;QAClC,oFAAoF;QACpF,QAAQ,CAAC,UAAC,SAAS;YACjB,OAAA,OAAO,QAAQ,KAAK,UAAU;gBAC5B,CAAC,CAAE,QAAgC,CAAC,SAAS,CAAC;gBAC9C,CAAC,CAAC,QAAQ;QAFZ,CAEY,CACb,CAAC;QACF,qDAAqD;QACrD,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,MAAM,EAAE,CAAC;IAChC,CAAC,EACD,CAAC,mBAAmB,CAAC,CACtB,CAAC;IAEF,OAAO,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;AACjC,CAAC;AA/BD,wCA+BC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { RecyclerViewManager } from "../RecyclerViewManager";
|
|
2
|
+
/**
|
|
3
|
+
* Hook to track when the RecyclerView has loaded its items and notify when loading is complete.
|
|
4
|
+
* Similar to FlashList's onLoad functionality, this hook tracks the time it takes to render
|
|
5
|
+
* the initial set of items in the RecyclerView and provides performance metrics.
|
|
6
|
+
*
|
|
7
|
+
* @param recyclerViewManager - The RecyclerViewManager instance managing the list
|
|
8
|
+
* @param onLoad - Optional callback function that will be called when the list has loaded with timing information
|
|
9
|
+
* @returns Object containing isLoaded state indicating whether the list has completed initial rendering
|
|
10
|
+
*/
|
|
11
|
+
export declare const useOnListLoad: <T>(recyclerViewManager: RecyclerViewManager<T>, onLoad?: ((info: {
|
|
12
|
+
elapsedTimeInMs: number;
|
|
13
|
+
}) => void) | undefined) => {
|
|
14
|
+
isLoaded: boolean;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Core hook that detects when a RecyclerView has completed its initial layout.
|
|
18
|
+
* This hook monitors the RecyclerViewManager and triggers the provided callback
|
|
19
|
+
* once the first layout is complete.
|
|
20
|
+
*
|
|
21
|
+
* @param recyclerViewManager - The RecyclerViewManager instance to monitor
|
|
22
|
+
* @param onLoad - Callback function that will be called once when the first layout is complete
|
|
23
|
+
*/
|
|
24
|
+
export declare const useOnLoad: <T>(recyclerViewManager: RecyclerViewManager<T>, onLoad: () => void) => void;
|
|
25
|
+
//# sourceMappingURL=useOnLoad.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOnLoad.d.ts","sourceRoot":"","sources":["../../../src/recyclerview/hooks/useOnLoad.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAI7D;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,oEAER;IAAE,eAAe,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI;cACvC,OAAO;CAsCrB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,2DAEZ,MAAM,IAAI,SAUnB,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useOnLoad = exports.useOnListLoad = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var react_1 = require("react");
|
|
6
|
+
var useUnmountFlag_1 = require("./useUnmountFlag");
|
|
7
|
+
//import { ToastAndroid } from "react-native";
|
|
8
|
+
/**
|
|
9
|
+
* Hook to track when the RecyclerView has loaded its items and notify when loading is complete.
|
|
10
|
+
* Similar to FlashList's onLoad functionality, this hook tracks the time it takes to render
|
|
11
|
+
* the initial set of items in the RecyclerView and provides performance metrics.
|
|
12
|
+
*
|
|
13
|
+
* @param recyclerViewManager - The RecyclerViewManager instance managing the list
|
|
14
|
+
* @param onLoad - Optional callback function that will be called when the list has loaded with timing information
|
|
15
|
+
* @returns Object containing isLoaded state indicating whether the list has completed initial rendering
|
|
16
|
+
*/
|
|
17
|
+
var useOnListLoad = function (recyclerViewManager, onLoad) {
|
|
18
|
+
var loadStartTimeRef = (0, react_1.useRef)(Date.now());
|
|
19
|
+
var _a = tslib_1.__read((0, react_1.useState)(false), 2), isLoaded = _a[0], setIsLoaded = _a[1];
|
|
20
|
+
var dataLength = recyclerViewManager.getDataLength();
|
|
21
|
+
//const dataCollector = useRef<number[]>([]);
|
|
22
|
+
var isUnmounted = (0, useUnmountFlag_1.useUnmountFlag)();
|
|
23
|
+
// Track render cycles by collecting elapsed time on each render
|
|
24
|
+
// useEffect(() => {
|
|
25
|
+
// const elapsedTimeInMs = Date.now() - loadStartTimeRef.current;
|
|
26
|
+
// dataCollector.current?.push(elapsedTimeInMs);
|
|
27
|
+
// });
|
|
28
|
+
(0, react_1.useMemo)(function () {
|
|
29
|
+
loadStartTimeRef.current = Date.now();
|
|
30
|
+
}, [dataLength]);
|
|
31
|
+
(0, exports.useOnLoad)(recyclerViewManager, function () {
|
|
32
|
+
var elapsedTimeInMs = Date.now() - loadStartTimeRef.current;
|
|
33
|
+
// Commented code below was used for debugging purposes
|
|
34
|
+
// to display all collected timing data points
|
|
35
|
+
// const dataCollectorString = dataCollector.current
|
|
36
|
+
// ?.map((value) => value.toString())
|
|
37
|
+
// .join(", ");
|
|
38
|
+
// ToastAndroid?.show(
|
|
39
|
+
// `onLoad called after ${dataCollectorString}`,
|
|
40
|
+
// ToastAndroid.SHORT
|
|
41
|
+
// );
|
|
42
|
+
//console.log("----------> dataCollector", dataCollectorString);
|
|
43
|
+
//console.log("----------> elapsedTimeInMs", elapsedTimeInMs);
|
|
44
|
+
requestAnimationFrame(function () {
|
|
45
|
+
if (!isUnmounted.current) {
|
|
46
|
+
onLoad === null || onLoad === void 0 ? void 0 : onLoad({ elapsedTimeInMs: elapsedTimeInMs });
|
|
47
|
+
setIsLoaded(true);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
return { isLoaded: isLoaded };
|
|
52
|
+
};
|
|
53
|
+
exports.useOnListLoad = useOnListLoad;
|
|
54
|
+
/**
|
|
55
|
+
* Core hook that detects when a RecyclerView has completed its initial layout.
|
|
56
|
+
* This hook monitors the RecyclerViewManager and triggers the provided callback
|
|
57
|
+
* once the first layout is complete.
|
|
58
|
+
*
|
|
59
|
+
* @param recyclerViewManager - The RecyclerViewManager instance to monitor
|
|
60
|
+
* @param onLoad - Callback function that will be called once when the first layout is complete
|
|
61
|
+
*/
|
|
62
|
+
var useOnLoad = function (recyclerViewManager, onLoad) {
|
|
63
|
+
var isLoaded = (0, react_1.useRef)(false);
|
|
64
|
+
(0, react_1.useEffect)(function () {
|
|
65
|
+
// Only trigger onLoad callback once when first layout is complete
|
|
66
|
+
if (recyclerViewManager.getIsFirstLayoutComplete() && !isLoaded.current) {
|
|
67
|
+
isLoaded.current = true;
|
|
68
|
+
onLoad();
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
};
|
|
72
|
+
exports.useOnLoad = useOnLoad;
|
|
73
|
+
//# sourceMappingURL=useOnLoad.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOnLoad.js","sourceRoot":"","sources":["../../../src/recyclerview/hooks/useOnLoad.ts"],"names":[],"mappings":";;;;AAAA,+BAA6D;AAE7D,mDAAkD;AAClD,8CAA8C;AAE9C;;;;;;;;GAQG;AACI,IAAM,aAAa,GAAG,UAC3B,mBAA2C,EAC3C,MAAoD;IAEpD,IAAM,gBAAgB,GAAG,IAAA,cAAM,EAAS,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9C,IAAA,KAAA,eAA0B,IAAA,gBAAQ,EAAU,KAAK,CAAC,IAAA,EAAjD,QAAQ,QAAA,EAAE,WAAW,QAA4B,CAAC;IACzD,IAAM,UAAU,GAAG,mBAAmB,CAAC,aAAa,EAAE,CAAC;IACvD,6CAA6C;IAC7C,IAAM,WAAW,GAAG,IAAA,+BAAc,GAAE,CAAC;IACrC,gEAAgE;IAChE,oBAAoB;IACpB,mEAAmE;IACnE,kDAAkD;IAClD,MAAM;IAEN,IAAA,eAAO,EAAC;QACN,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACxC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,IAAA,iBAAS,EAAC,mBAAmB,EAAE;QAC7B,IAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC;QAC9D,uDAAuD;QACvD,8CAA8C;QAC9C,oDAAoD;QACpD,uCAAuC;QACvC,iBAAiB;QACjB,sBAAsB;QACtB,kDAAkD;QAClD,uBAAuB;QACvB,KAAK;QACL,gEAAgE;QAChE,8DAA8D;QAC9D,qBAAqB,CAAC;YACpB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;gBACxB,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,EAAE,eAAe,iBAAA,EAAE,CAAC,CAAC;gBAC9B,WAAW,CAAC,IAAI,CAAC,CAAC;aACnB;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,QAAQ,UAAA,EAAE,CAAC;AACtB,CAAC,CAAC;AAzCW,QAAA,aAAa,iBAyCxB;AAEF;;;;;;;GAOG;AACI,IAAM,SAAS,GAAG,UACvB,mBAA2C,EAC3C,MAAkB;IAElB,IAAM,QAAQ,GAAG,IAAA,cAAM,EAAU,KAAK,CAAC,CAAC;IACxC,IAAA,iBAAS,EAAC;QACR,kEAAkE;QAClE,IAAI,mBAAmB,CAAC,wBAAwB,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;YACvE,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;YACxB,MAAM,EAAE,CAAC;SACV;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAZW,QAAA,SAAS,aAYpB"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { RefObject } from "react";
|
|
2
|
+
import { RecyclerViewProps } from "../RecyclerViewProps";
|
|
3
|
+
import { CompatScroller } from "../components/CompatScroller";
|
|
4
|
+
import { RecyclerViewManager } from "../RecyclerViewManager";
|
|
5
|
+
import { ScrollAnchorRef } from "../components/ScrollAnchor";
|
|
6
|
+
/**
|
|
7
|
+
* Parameters for scrolling to a specific position in the list.
|
|
8
|
+
* Extends ScrollToEdgeParams to include view positioning options.
|
|
9
|
+
*/
|
|
10
|
+
export interface ScrollToParams extends ScrollToEdgeParams {
|
|
11
|
+
/** Position of the target item relative to the viewport (0 = top, 0.5 = center, 1 = bottom) */
|
|
12
|
+
viewPosition?: number;
|
|
13
|
+
/** Additional offset to apply after viewPosition calculation */
|
|
14
|
+
viewOffset?: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Parameters for scrolling to a specific offset in the list.
|
|
18
|
+
* Used when you want to scroll to an exact pixel position.
|
|
19
|
+
*/
|
|
20
|
+
export interface ScrollToOffsetParams extends ScrollToParams {
|
|
21
|
+
/** The pixel offset to scroll to */
|
|
22
|
+
offset: number;
|
|
23
|
+
/**
|
|
24
|
+
* If true, the first item offset will not be added to the offset calculation.
|
|
25
|
+
* First offset represents header size or top padding.
|
|
26
|
+
*/
|
|
27
|
+
skipFirstItemOffset?: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Parameters for scrolling to a specific index in the list.
|
|
31
|
+
* Used when you want to scroll to a specific item by its position in the data array.
|
|
32
|
+
*/
|
|
33
|
+
export interface ScrollToIndexParams extends ScrollToParams {
|
|
34
|
+
/** The index of the item to scroll to */
|
|
35
|
+
index: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Parameters for scrolling to a specific item in the list.
|
|
39
|
+
* Used when you want to scroll to a specific item by its data value.
|
|
40
|
+
*/
|
|
41
|
+
export interface ScrollToItemParams<T> extends ScrollToParams {
|
|
42
|
+
/** The item to scroll to */
|
|
43
|
+
item: T;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Base parameters for scrolling to the edges of the list.
|
|
47
|
+
*/
|
|
48
|
+
export interface ScrollToEdgeParams {
|
|
49
|
+
/** Whether the scroll should be animated */
|
|
50
|
+
animated?: boolean;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Comprehensive hook that manages RecyclerView scrolling behavior and provides
|
|
54
|
+
* imperative methods for controlling the RecyclerView.
|
|
55
|
+
*
|
|
56
|
+
* This hook combines content offset management and scroll handling functionality:
|
|
57
|
+
* 1. Provides imperative methods for scrolling and measurement
|
|
58
|
+
* 2. Handles initial scroll position when the list first loads
|
|
59
|
+
* 3. Maintains visible content position during updates
|
|
60
|
+
* 4. Manages scroll anchors for chat-like applications
|
|
61
|
+
*
|
|
62
|
+
* @param recyclerViewManager - The RecyclerViewManager instance that handles core functionality
|
|
63
|
+
* @param ref - The ref to expose the imperative methods
|
|
64
|
+
* @param scrollViewRef - Reference to the scrollable container component
|
|
65
|
+
* @param scrollAnchorRef - Reference to the scroll anchor component
|
|
66
|
+
* @param props - The RecyclerViewProps containing configuration
|
|
67
|
+
*/
|
|
68
|
+
export declare function useRecyclerViewController<T>(recyclerViewManager: RecyclerViewManager<T>, ref: React.Ref<any>, scrollViewRef: RefObject<CompatScroller>, scrollAnchorRef: React.RefObject<ScrollAnchorRef>, props: RecyclerViewProps<T>): {
|
|
69
|
+
applyContentOffset: () => Promise<void>;
|
|
70
|
+
applyInitialScrollIndex: () => void;
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=useRecyclerViewController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRecyclerViewController.d.ts","sourceRoot":"","sources":["../../../src/recyclerview/hooks/useRecyclerViewController.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAMV,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAI7D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D;;;GAGG;AACH,MAAM,WAAW,cAAe,SAAQ,kBAAkB;IACxD,+FAA+F;IAC/F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAqB,SAAQ,cAAc;IAC1D,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAoB,SAAQ,cAAc;IACzD,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,CAAE,SAAQ,cAAc;IAC3D,4BAA4B;IAC5B,IAAI,EAAE,CAAC,CAAC;CACT;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EACzC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAC3C,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EACnB,aAAa,EAAE,SAAS,CAAC,cAAc,CAAC,EACxC,eAAe,EAAE,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC,EACjD,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC;;;EA6Y5B"}
|