lazy-render-virtual-scroll 1.0.1
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 +303 -0
- package/dist/cjs/adapters/react/LazyList.d.ts +12 -0
- package/dist/cjs/adapters/react/LazyList.d.ts.map +1 -0
- package/dist/cjs/adapters/react/useLazyList.d.ts +13 -0
- package/dist/cjs/adapters/react/useLazyList.d.ts.map +1 -0
- package/dist/cjs/core/Engine.d.ts +48 -0
- package/dist/cjs/core/Engine.d.ts.map +1 -0
- package/dist/cjs/core/PrefetchManager.d.ts +13 -0
- package/dist/cjs/core/PrefetchManager.d.ts.map +1 -0
- package/dist/cjs/core/RequestQueue.d.ts +23 -0
- package/dist/cjs/core/RequestQueue.d.ts.map +1 -0
- package/dist/cjs/core/WindowManager.d.ts +20 -0
- package/dist/cjs/core/WindowManager.d.ts.map +1 -0
- package/dist/cjs/core/types.d.ts +20 -0
- package/dist/cjs/core/types.d.ts.map +1 -0
- package/dist/cjs/index.d.ts +11 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +435 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/platform/browser/ScrollObserver.d.ts +25 -0
- package/dist/cjs/platform/browser/ScrollObserver.d.ts.map +1 -0
- package/dist/cjs/utils/debounce.d.ts +5 -0
- package/dist/cjs/utils/debounce.d.ts.map +1 -0
- package/dist/cjs/utils/throttle.d.ts +5 -0
- package/dist/cjs/utils/throttle.d.ts.map +1 -0
- package/dist/esm/adapters/react/LazyList.d.ts +12 -0
- package/dist/esm/adapters/react/LazyList.d.ts.map +1 -0
- package/dist/esm/adapters/react/useLazyList.d.ts +13 -0
- package/dist/esm/adapters/react/useLazyList.d.ts.map +1 -0
- package/dist/esm/core/Engine.d.ts +48 -0
- package/dist/esm/core/Engine.d.ts.map +1 -0
- package/dist/esm/core/PrefetchManager.d.ts +13 -0
- package/dist/esm/core/PrefetchManager.d.ts.map +1 -0
- package/dist/esm/core/RequestQueue.d.ts +23 -0
- package/dist/esm/core/RequestQueue.d.ts.map +1 -0
- package/dist/esm/core/WindowManager.d.ts +20 -0
- package/dist/esm/core/WindowManager.d.ts.map +1 -0
- package/dist/esm/core/types.d.ts +20 -0
- package/dist/esm/core/types.d.ts.map +1 -0
- package/dist/esm/index.d.ts +11 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +425 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/platform/browser/ScrollObserver.d.ts +25 -0
- package/dist/esm/platform/browser/ScrollObserver.d.ts.map +1 -0
- package/dist/esm/utils/debounce.d.ts +5 -0
- package/dist/esm/utils/debounce.d.ts.map +1 -0
- package/dist/esm/utils/throttle.d.ts +5 -0
- package/dist/esm/utils/throttle.d.ts.map +1 -0
- package/dist/index.d.ts +181 -0
- package/examples/chat-ui/Chat.jsx +158 -0
- package/examples/infinite-feed/Feed.jsx +97 -0
- package/examples/react-basic/App.jsx +64 -0
- package/package.json +55 -0
- package/rollup.config.js +39 -0
- package/src/adapters/react/LazyList.tsx +92 -0
- package/src/adapters/react/useLazyList.ts +87 -0
- package/src/core/Engine.ts +134 -0
- package/src/core/PrefetchManager.ts +22 -0
- package/src/core/RequestQueue.ts +69 -0
- package/src/core/WindowManager.ts +49 -0
- package/src/core/types.ts +24 -0
- package/src/index.ts +17 -0
- package/src/platform/browser/ScrollObserver.ts +86 -0
- package/src/utils/debounce.ts +19 -0
- package/src/utils/throttle.ts +19 -0
- package/test/engine.test.ts +136 -0
- package/test/prefetchManager.test.ts +99 -0
- package/test/reactAdapter.test.ts +26 -0
- package/test/requestQueue.test.ts +88 -0
- package/test/testRunner.ts +8 -0
- package/test/windowManager.test.ts +98 -0
- package/tsconfig.json +33 -0
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
|
|
5
|
+
class WindowManager {
|
|
6
|
+
constructor(itemHeight, viewportHeight, bufferSize = 5) {
|
|
7
|
+
this.itemHeight = itemHeight;
|
|
8
|
+
this.viewportHeight = viewportHeight;
|
|
9
|
+
this.bufferSize = bufferSize;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Calculate the visible range based on scroll position
|
|
13
|
+
*/
|
|
14
|
+
calculateVisibleRange(scrollTop) {
|
|
15
|
+
// Calculate how many items fit in the viewport
|
|
16
|
+
const itemsPerViewport = Math.ceil(this.viewportHeight / this.itemHeight);
|
|
17
|
+
// Calculate the starting index based on scroll position
|
|
18
|
+
const startIndex = Math.floor(scrollTop / this.itemHeight);
|
|
19
|
+
// Calculate the ending index with buffer
|
|
20
|
+
const endIndex = Math.min(startIndex + itemsPerViewport + this.bufferSize, Number.MAX_SAFE_INTEGER // Will be limited by total items later
|
|
21
|
+
);
|
|
22
|
+
return {
|
|
23
|
+
start: Math.max(0, startIndex - this.bufferSize),
|
|
24
|
+
end: endIndex
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Update viewport height if it changes
|
|
29
|
+
*/
|
|
30
|
+
updateViewportHeight(height) {
|
|
31
|
+
this.viewportHeight = height;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Update item height if it changes
|
|
35
|
+
*/
|
|
36
|
+
updateItemHeight(height) {
|
|
37
|
+
this.itemHeight = height;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
class PrefetchManager {
|
|
42
|
+
constructor(bufferSize = 5) {
|
|
43
|
+
this.bufferSize = bufferSize;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Determine if more items should be fetched based on visible range and loaded items
|
|
47
|
+
*/
|
|
48
|
+
shouldPrefetch(visibleEnd, totalLoaded) {
|
|
49
|
+
// Simple rule: if visible end is approaching the loaded boundary, fetch more
|
|
50
|
+
return visibleEnd >= totalLoaded - this.bufferSize;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Update buffer size if it changes
|
|
54
|
+
*/
|
|
55
|
+
updateBufferSize(size) {
|
|
56
|
+
this.bufferSize = size;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
class RequestQueue {
|
|
61
|
+
constructor(maxConcurrent = 1) {
|
|
62
|
+
this.queue = [];
|
|
63
|
+
this.processing = false;
|
|
64
|
+
this.maxConcurrent = maxConcurrent;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Add a request to the queue
|
|
68
|
+
*/
|
|
69
|
+
add(requestFn) {
|
|
70
|
+
return new Promise((resolve, reject) => {
|
|
71
|
+
this.queue.push(() => requestFn().then(resolve).catch(reject));
|
|
72
|
+
// Start processing if not already processing
|
|
73
|
+
if (!this.processing) {
|
|
74
|
+
this.processQueue();
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Process the queue
|
|
80
|
+
*/
|
|
81
|
+
async processQueue() {
|
|
82
|
+
if (this.queue.length === 0) {
|
|
83
|
+
this.processing = false;
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
this.processing = true;
|
|
87
|
+
// Process up to maxConcurrent requests
|
|
88
|
+
const concurrentRequests = [];
|
|
89
|
+
const count = Math.min(this.maxConcurrent, this.queue.length);
|
|
90
|
+
for (let i = 0; i < count; i++) {
|
|
91
|
+
const requestFn = this.queue.shift();
|
|
92
|
+
if (requestFn) {
|
|
93
|
+
concurrentRequests.push(requestFn());
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
await Promise.all(concurrentRequests);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
console.error('Request queue error:', error);
|
|
101
|
+
}
|
|
102
|
+
// Process remaining items
|
|
103
|
+
await this.processQueue();
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Clear the queue
|
|
107
|
+
*/
|
|
108
|
+
clear() {
|
|
109
|
+
this.queue = [];
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get the current queue length
|
|
113
|
+
*/
|
|
114
|
+
getLength() {
|
|
115
|
+
return this.queue.length;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
class Engine {
|
|
120
|
+
constructor(config) {
|
|
121
|
+
this.fetchMoreCallback = null;
|
|
122
|
+
this.config = {
|
|
123
|
+
...config,
|
|
124
|
+
bufferSize: config.bufferSize || 5
|
|
125
|
+
};
|
|
126
|
+
this.windowManager = new WindowManager(this.config.itemHeight, this.config.viewportHeight, this.config.bufferSize);
|
|
127
|
+
this.prefetchManager = new PrefetchManager(this.config.bufferSize);
|
|
128
|
+
this.requestQueue = new RequestQueue(1); // Single request at a time
|
|
129
|
+
this.totalItems = this.config.totalItems || Number.MAX_SAFE_INTEGER;
|
|
130
|
+
this.state = {
|
|
131
|
+
scrollTop: 0,
|
|
132
|
+
visibleRange: { start: 0, end: 0 },
|
|
133
|
+
loadedItems: 0,
|
|
134
|
+
isLoading: false
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Update scroll position and recalculate visible range
|
|
139
|
+
*/
|
|
140
|
+
updateScrollPosition(scrollTop) {
|
|
141
|
+
this.state.scrollTop = scrollTop;
|
|
142
|
+
this.state.visibleRange = this.windowManager.calculateVisibleRange(scrollTop);
|
|
143
|
+
// Check if we need to fetch more items
|
|
144
|
+
if (this.shouldFetchMore()) {
|
|
145
|
+
this.fetchMore();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Get the current visible range
|
|
150
|
+
*/
|
|
151
|
+
getVisibleRange() {
|
|
152
|
+
return this.state.visibleRange;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Check if more items should be fetched
|
|
156
|
+
*/
|
|
157
|
+
shouldFetchMore() {
|
|
158
|
+
if (!this.fetchMoreCallback)
|
|
159
|
+
return false;
|
|
160
|
+
if (this.state.isLoading)
|
|
161
|
+
return false;
|
|
162
|
+
if (this.state.loadedItems >= this.totalItems)
|
|
163
|
+
return false;
|
|
164
|
+
return this.prefetchManager.shouldPrefetch(this.state.visibleRange.end, this.state.loadedItems);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Fetch more items
|
|
168
|
+
*/
|
|
169
|
+
async fetchMore() {
|
|
170
|
+
if (!this.fetchMoreCallback || this.state.isLoading)
|
|
171
|
+
return;
|
|
172
|
+
this.state.isLoading = true;
|
|
173
|
+
try {
|
|
174
|
+
const result = await this.requestQueue.add(this.fetchMoreCallback);
|
|
175
|
+
// Assuming the result contains new items
|
|
176
|
+
// In a real implementation, this would update the loaded items count
|
|
177
|
+
this.state.loadedItems += Array.isArray(result) ? result.length : 1;
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
console.error('Error fetching more items:', error);
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
this.state.isLoading = false;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Set the fetchMore callback function
|
|
188
|
+
*/
|
|
189
|
+
setFetchMoreCallback(callback) {
|
|
190
|
+
this.fetchMoreCallback = callback;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Update total items count
|
|
194
|
+
*/
|
|
195
|
+
updateTotalItems(count) {
|
|
196
|
+
this.totalItems = count;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get current engine state
|
|
200
|
+
*/
|
|
201
|
+
getState() {
|
|
202
|
+
return { ...this.state };
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Update viewport dimensions
|
|
206
|
+
*/
|
|
207
|
+
updateDimensions(viewportHeight, itemHeight) {
|
|
208
|
+
this.windowManager.updateViewportHeight(viewportHeight);
|
|
209
|
+
this.windowManager.updateItemHeight(itemHeight);
|
|
210
|
+
// Recalculate visible range with new dimensions
|
|
211
|
+
this.state.visibleRange = this.windowManager.calculateVisibleRange(this.state.scrollTop);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Cleanup resources
|
|
215
|
+
*/
|
|
216
|
+
cleanup() {
|
|
217
|
+
this.requestQueue.clear();
|
|
218
|
+
this.fetchMoreCallback = null;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
class ScrollObserver {
|
|
223
|
+
constructor(container, callback, options) {
|
|
224
|
+
this.observer = null;
|
|
225
|
+
this.sentinelElement = null;
|
|
226
|
+
/**
|
|
227
|
+
* Handle scroll events
|
|
228
|
+
*/
|
|
229
|
+
this.onScroll = () => {
|
|
230
|
+
// Debounced scroll handler to prevent too frequent updates
|
|
231
|
+
this.debounce(() => {
|
|
232
|
+
this.callback(this.container.scrollTop);
|
|
233
|
+
}, 16); // ~60fps
|
|
234
|
+
};
|
|
235
|
+
this.container = container;
|
|
236
|
+
this.callback = callback;
|
|
237
|
+
this.options = {
|
|
238
|
+
root: container,
|
|
239
|
+
threshold: [0, 1],
|
|
240
|
+
...options
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Start observing scroll events
|
|
245
|
+
*/
|
|
246
|
+
observe() {
|
|
247
|
+
// Create a sentinel element at the bottom to detect when user scrolls near the end
|
|
248
|
+
this.sentinelElement = document.createElement('div');
|
|
249
|
+
this.sentinelElement.style.height = '1px'; // Very small element
|
|
250
|
+
this.sentinelElement.setAttribute('data-lazy-sentinel', '');
|
|
251
|
+
// Add sentinel to the container
|
|
252
|
+
this.container.appendChild(this.sentinelElement);
|
|
253
|
+
// Create intersection observer to detect when sentinel comes into view
|
|
254
|
+
this.observer = new IntersectionObserver((entries) => {
|
|
255
|
+
entries.forEach(entry => {
|
|
256
|
+
if (entry.isIntersecting) {
|
|
257
|
+
// Trigger callback with current scroll position
|
|
258
|
+
this.callback(this.container.scrollTop);
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
}, this.options);
|
|
262
|
+
this.observer.observe(this.sentinelElement);
|
|
263
|
+
// Also listen to scroll events for continuous updates
|
|
264
|
+
this.container.addEventListener('scroll', this.onScroll, { passive: true });
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Debounce function for scroll events
|
|
268
|
+
*/
|
|
269
|
+
debounce(func, wait) {
|
|
270
|
+
let timeout;
|
|
271
|
+
clearTimeout(timeout);
|
|
272
|
+
timeout = setTimeout(func, wait);
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Disconnect observer and clean up
|
|
276
|
+
*/
|
|
277
|
+
disconnect() {
|
|
278
|
+
if (this.observer) {
|
|
279
|
+
this.observer.disconnect();
|
|
280
|
+
this.observer = null;
|
|
281
|
+
}
|
|
282
|
+
if (this.sentinelElement) {
|
|
283
|
+
this.sentinelElement.remove();
|
|
284
|
+
this.sentinelElement = null;
|
|
285
|
+
}
|
|
286
|
+
this.container.removeEventListener('scroll', this.onScroll);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
const useLazyList = (config) => {
|
|
291
|
+
const { fetchMore, ...engineConfig } = config;
|
|
292
|
+
const engineRef = React.useRef(null);
|
|
293
|
+
const containerRef = React.useRef(null);
|
|
294
|
+
const [visibleRange, setVisibleRange] = React.useState({ start: 0, end: 0 });
|
|
295
|
+
const [loadedItems, setLoadedItems] = React.useState([]);
|
|
296
|
+
const [isLoading, setIsLoading] = React.useState(false);
|
|
297
|
+
// Initialize engine
|
|
298
|
+
React.useEffect(() => {
|
|
299
|
+
engineRef.current = new Engine(engineConfig);
|
|
300
|
+
engineRef.current.setFetchMoreCallback(fetchMore);
|
|
301
|
+
return () => {
|
|
302
|
+
if (engineRef.current) {
|
|
303
|
+
engineRef.current.cleanup();
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
}, []);
|
|
307
|
+
// Update engine when config changes
|
|
308
|
+
React.useEffect(() => {
|
|
309
|
+
if (engineRef.current) {
|
|
310
|
+
engineRef.current.updateDimensions(engineConfig.viewportHeight, engineConfig.itemHeight);
|
|
311
|
+
}
|
|
312
|
+
}, [engineConfig.viewportHeight, engineConfig.itemHeight]);
|
|
313
|
+
// Handle scroll events
|
|
314
|
+
const handleScroll = React.useCallback((scrollTop) => {
|
|
315
|
+
if (engineRef.current) {
|
|
316
|
+
engineRef.current.updateScrollPosition(scrollTop);
|
|
317
|
+
// Update state based on engine
|
|
318
|
+
const state = engineRef.current.getState();
|
|
319
|
+
setVisibleRange(state.visibleRange);
|
|
320
|
+
setIsLoading(state.isLoading);
|
|
321
|
+
}
|
|
322
|
+
}, []);
|
|
323
|
+
// Set container reference
|
|
324
|
+
const setContainerRef = (element) => {
|
|
325
|
+
if (element) {
|
|
326
|
+
containerRef.current = element;
|
|
327
|
+
// Initialize scroll observer when container is available
|
|
328
|
+
if (typeof window !== 'undefined' && element) {
|
|
329
|
+
// In a real implementation, we would use ScrollObserver here
|
|
330
|
+
// For now, we'll just attach a basic scroll listener
|
|
331
|
+
const handleScrollEvent = () => {
|
|
332
|
+
handleScroll(element.scrollTop);
|
|
333
|
+
};
|
|
334
|
+
element.addEventListener('scroll', handleScrollEvent, { passive: true });
|
|
335
|
+
// Cleanup
|
|
336
|
+
return () => {
|
|
337
|
+
element.removeEventListener('scroll', handleScrollEvent);
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
return {
|
|
343
|
+
visibleRange,
|
|
344
|
+
loadedItems,
|
|
345
|
+
isLoading,
|
|
346
|
+
setContainerRef,
|
|
347
|
+
// Helper function to trigger manual refresh
|
|
348
|
+
refresh: () => {
|
|
349
|
+
var _a;
|
|
350
|
+
if (engineRef.current) {
|
|
351
|
+
engineRef.current.updateScrollPosition(((_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.scrollTop) || 0);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
};
|
|
355
|
+
};
|
|
356
|
+
|
|
357
|
+
const LazyList = React.forwardRef((props, ref) => {
|
|
358
|
+
const { fetchMore, renderItem, items, itemHeight, viewportHeight, bufferSize, className = '', style = {}, ...rest } = props;
|
|
359
|
+
const { visibleRange, setContainerRef, isLoading } = useLazyList({
|
|
360
|
+
fetchMore,
|
|
361
|
+
itemHeight,
|
|
362
|
+
viewportHeight,
|
|
363
|
+
bufferSize,
|
|
364
|
+
...rest
|
|
365
|
+
});
|
|
366
|
+
// Calculate container height to simulate infinite scroll
|
|
367
|
+
const containerHeight = items.length * itemHeight;
|
|
368
|
+
const visibleItems = items.slice(visibleRange.start, visibleRange.end);
|
|
369
|
+
// Calculate top padding to maintain scroll position
|
|
370
|
+
const paddingTop = visibleRange.start * itemHeight;
|
|
371
|
+
return (React.createElement("div", { ref: (el) => {
|
|
372
|
+
setContainerRef(el);
|
|
373
|
+
if (ref) {
|
|
374
|
+
if (typeof ref === 'function') {
|
|
375
|
+
ref(el);
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
ref.current = el;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}, className: `lazy-list ${className}`, style: {
|
|
382
|
+
height: `${viewportHeight}px`,
|
|
383
|
+
overflowY: 'auto',
|
|
384
|
+
...style
|
|
385
|
+
}, ...rest },
|
|
386
|
+
React.createElement("div", { style: { height: `${paddingTop}px` } }),
|
|
387
|
+
visibleItems.map((item, index) => (React.createElement("div", { key: visibleRange.start + index, style: { height: `${itemHeight}px` }, className: "lazy-item" }, renderItem(item, visibleRange.start + index)))),
|
|
388
|
+
React.createElement("div", { style: {
|
|
389
|
+
height: `${Math.max(0, containerHeight - (visibleRange.end * itemHeight))}px`
|
|
390
|
+
} }),
|
|
391
|
+
isLoading && (React.createElement("div", { className: "lazy-loading" }, "Loading more items..."))));
|
|
392
|
+
});
|
|
393
|
+
LazyList.displayName = 'LazyList';
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* Debounce function to limit the rate at which a function is called
|
|
397
|
+
*/
|
|
398
|
+
function debounce(func, wait) {
|
|
399
|
+
let timeout = null;
|
|
400
|
+
return function executedFunction(...args) {
|
|
401
|
+
if (timeout) {
|
|
402
|
+
clearTimeout(timeout);
|
|
403
|
+
}
|
|
404
|
+
timeout = setTimeout(() => {
|
|
405
|
+
func.apply(this, args);
|
|
406
|
+
}, wait);
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/**
|
|
411
|
+
* Throttle function to limit the rate at which a function is called
|
|
412
|
+
*/
|
|
413
|
+
function throttle(func, limit) {
|
|
414
|
+
let inThrottle;
|
|
415
|
+
return function executedFunction(...args) {
|
|
416
|
+
if (!inThrottle) {
|
|
417
|
+
func.apply(this, args);
|
|
418
|
+
inThrottle = true;
|
|
419
|
+
setTimeout(() => {
|
|
420
|
+
inThrottle = false;
|
|
421
|
+
}, limit);
|
|
422
|
+
}
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
exports.Engine = Engine;
|
|
427
|
+
exports.LazyList = LazyList;
|
|
428
|
+
exports.PrefetchManager = PrefetchManager;
|
|
429
|
+
exports.RequestQueue = RequestQueue;
|
|
430
|
+
exports.ScrollObserver = ScrollObserver;
|
|
431
|
+
exports.WindowManager = WindowManager;
|
|
432
|
+
exports.debounce = debounce;
|
|
433
|
+
exports.throttle = throttle;
|
|
434
|
+
exports.useLazyList = useLazyList;
|
|
435
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/core/WindowManager.ts","../../src/core/PrefetchManager.ts","../../src/core/RequestQueue.ts","../../src/core/Engine.ts","../../src/platform/browser/ScrollObserver.ts","../../src/adapters/react/useLazyList.ts","../../src/adapters/react/LazyList.tsx","../../src/utils/debounce.ts","../../src/utils/throttle.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null],"names":["useRef","useState","useEffect","useCallback","forwardRef"],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export declare class ScrollObserver {
|
|
2
|
+
private container;
|
|
3
|
+
private callback;
|
|
4
|
+
private options;
|
|
5
|
+
private observer;
|
|
6
|
+
private sentinelElement;
|
|
7
|
+
constructor(container: HTMLElement, callback: (scrollTop: number) => void, options?: Partial<IntersectionObserverInit>);
|
|
8
|
+
/**
|
|
9
|
+
* Start observing scroll events
|
|
10
|
+
*/
|
|
11
|
+
observe(): void;
|
|
12
|
+
/**
|
|
13
|
+
* Handle scroll events
|
|
14
|
+
*/
|
|
15
|
+
private onScroll;
|
|
16
|
+
/**
|
|
17
|
+
* Debounce function for scroll events
|
|
18
|
+
*/
|
|
19
|
+
private debounce;
|
|
20
|
+
/**
|
|
21
|
+
* Disconnect observer and clean up
|
|
22
|
+
*/
|
|
23
|
+
disconnect(): void;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=ScrollObserver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScrollObserver.d.ts","sourceRoot":"","sources":["../../../src/platform/browser/ScrollObserver.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,eAAe,CAA4B;gBAGjD,SAAS,EAAE,WAAW,EACtB,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,EACrC,OAAO,CAAC,EAAE,OAAO,CAAC,wBAAwB,CAAC;IAW7C;;OAEG;IACH,OAAO,IAAI,IAAI;IAyBf;;OAEG;IACH,OAAO,CAAC,QAAQ,CAKd;IAEF;;OAEG;IACH,OAAO,CAAC,QAAQ;IAOhB;;OAEG;IACH,UAAU,IAAI,IAAI;CAanB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debounce.d.ts","sourceRoot":"","sources":["../../src/utils/debounce.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACxD,IAAI,EAAE,CAAC,EACP,IAAI,EAAE,MAAM,GACX,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAYlC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"throttle.d.ts","sourceRoot":"","sources":["../../src/utils/throttle.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACxD,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,MAAM,GACZ,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAYlC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { EngineConfig, FetchMoreCallback } from '../../core/types';
|
|
3
|
+
interface LazyListProps extends EngineConfig {
|
|
4
|
+
fetchMore: FetchMoreCallback;
|
|
5
|
+
renderItem: (item: any, index: number) => React.ReactNode;
|
|
6
|
+
items: any[];
|
|
7
|
+
className?: string;
|
|
8
|
+
style?: React.CSSProperties;
|
|
9
|
+
}
|
|
10
|
+
export declare const LazyList: React.ForwardRefExoticComponent<LazyListProps & React.RefAttributes<HTMLDivElement>>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=LazyList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LazyList.d.ts","sourceRoot":"","sources":["../../../src/adapters/react/LazyList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEnE,UAAU,aAAc,SAAQ,YAAY;IAC1C,SAAS,EAAE,iBAAiB,CAAC;IAC7B,UAAU,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;IAC1D,KAAK,EAAE,GAAG,EAAE,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,eAAO,MAAM,QAAQ,sFA6EnB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { EngineConfig, VisibleRange, FetchMoreCallback } from '../../core/types';
|
|
2
|
+
interface LazyListConfig extends EngineConfig {
|
|
3
|
+
fetchMore: FetchMoreCallback;
|
|
4
|
+
}
|
|
5
|
+
export declare const useLazyList: (config: LazyListConfig) => {
|
|
6
|
+
visibleRange: VisibleRange;
|
|
7
|
+
loadedItems: any[];
|
|
8
|
+
isLoading: boolean;
|
|
9
|
+
setContainerRef: (element: HTMLElement | null) => (() => void) | undefined;
|
|
10
|
+
refresh: () => void;
|
|
11
|
+
};
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=useLazyList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLazyList.d.ts","sourceRoot":"","sources":["../../../src/adapters/react/useLazyList.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEjF,UAAU,cAAe,SAAQ,YAAY;IAC3C,SAAS,EAAE,iBAAiB,CAAC;CAC9B;AAED,eAAO,MAAM,WAAW,GAAI,QAAQ,cAAc;;;;+BA4Cd,WAAW,GAAG,IAAI;;CAkCrD,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { EngineConfig, VisibleRange, FetchMoreCallback, EngineState } from './types';
|
|
2
|
+
export declare class Engine {
|
|
3
|
+
private config;
|
|
4
|
+
private windowManager;
|
|
5
|
+
private prefetchManager;
|
|
6
|
+
private requestQueue;
|
|
7
|
+
private state;
|
|
8
|
+
private fetchMoreCallback;
|
|
9
|
+
private totalItems;
|
|
10
|
+
constructor(config: EngineConfig);
|
|
11
|
+
/**
|
|
12
|
+
* Update scroll position and recalculate visible range
|
|
13
|
+
*/
|
|
14
|
+
updateScrollPosition(scrollTop: number): void;
|
|
15
|
+
/**
|
|
16
|
+
* Get the current visible range
|
|
17
|
+
*/
|
|
18
|
+
getVisibleRange(): VisibleRange;
|
|
19
|
+
/**
|
|
20
|
+
* Check if more items should be fetched
|
|
21
|
+
*/
|
|
22
|
+
shouldFetchMore(): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Fetch more items
|
|
25
|
+
*/
|
|
26
|
+
fetchMore(): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Set the fetchMore callback function
|
|
29
|
+
*/
|
|
30
|
+
setFetchMoreCallback(callback: FetchMoreCallback): void;
|
|
31
|
+
/**
|
|
32
|
+
* Update total items count
|
|
33
|
+
*/
|
|
34
|
+
updateTotalItems(count: number): void;
|
|
35
|
+
/**
|
|
36
|
+
* Get current engine state
|
|
37
|
+
*/
|
|
38
|
+
getState(): EngineState;
|
|
39
|
+
/**
|
|
40
|
+
* Update viewport dimensions
|
|
41
|
+
*/
|
|
42
|
+
updateDimensions(viewportHeight: number, itemHeight: number): void;
|
|
43
|
+
/**
|
|
44
|
+
* Cleanup resources
|
|
45
|
+
*/
|
|
46
|
+
cleanup(): void;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=Engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Engine.d.ts","sourceRoot":"","sources":["../../src/core/Engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAKrF,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,YAAY,CAAe;IAEnC,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,EAAE,YAAY;IAyBhC;;OAEG;IACH,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAU7C;;OAEG;IACH,eAAe,IAAI,YAAY;IAI/B;;OAEG;IACH,eAAe,IAAI,OAAO;IAW1B;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBhC;;OAEG;IACH,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAIvD;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIrC;;OAEG;IACH,QAAQ,IAAI,WAAW;IAIvB;;OAEG;IACH,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAQlE;;OAEG;IACH,OAAO,IAAI,IAAI;CAIhB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class PrefetchManager {
|
|
2
|
+
private bufferSize;
|
|
3
|
+
constructor(bufferSize?: number);
|
|
4
|
+
/**
|
|
5
|
+
* Determine if more items should be fetched based on visible range and loaded items
|
|
6
|
+
*/
|
|
7
|
+
shouldPrefetch(visibleEnd: number, totalLoaded: number): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Update buffer size if it changes
|
|
10
|
+
*/
|
|
11
|
+
updateBufferSize(size: number): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=PrefetchManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrefetchManager.d.ts","sourceRoot":"","sources":["../../src/core/PrefetchManager.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAe;IAC1B,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,GAAE,MAAU;IAIlC;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAKhE;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAGrC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare class RequestQueue {
|
|
2
|
+
private queue;
|
|
3
|
+
private processing;
|
|
4
|
+
private maxConcurrent;
|
|
5
|
+
constructor(maxConcurrent?: number);
|
|
6
|
+
/**
|
|
7
|
+
* Add a request to the queue
|
|
8
|
+
*/
|
|
9
|
+
add(requestFn: () => Promise<any>): Promise<any>;
|
|
10
|
+
/**
|
|
11
|
+
* Process the queue
|
|
12
|
+
*/
|
|
13
|
+
private processQueue;
|
|
14
|
+
/**
|
|
15
|
+
* Clear the queue
|
|
16
|
+
*/
|
|
17
|
+
clear(): void;
|
|
18
|
+
/**
|
|
19
|
+
* Get the current queue length
|
|
20
|
+
*/
|
|
21
|
+
getLength(): number;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=RequestQueue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestQueue.d.ts","sourceRoot":"","sources":["../../src/core/RequestQueue.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,aAAa,CAAS;gBAElB,aAAa,GAAE,MAAU;IAIrC;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;IAWhD;;OAEG;YACW,YAAY;IA6B1B;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,SAAS,IAAI,MAAM;CAGpB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { VisibleRange } from './types';
|
|
2
|
+
export declare class WindowManager {
|
|
3
|
+
private itemHeight;
|
|
4
|
+
private viewportHeight;
|
|
5
|
+
private bufferSize;
|
|
6
|
+
constructor(itemHeight: number, viewportHeight: number, bufferSize?: number);
|
|
7
|
+
/**
|
|
8
|
+
* Calculate the visible range based on scroll position
|
|
9
|
+
*/
|
|
10
|
+
calculateVisibleRange(scrollTop: number): VisibleRange;
|
|
11
|
+
/**
|
|
12
|
+
* Update viewport height if it changes
|
|
13
|
+
*/
|
|
14
|
+
updateViewportHeight(height: number): void;
|
|
15
|
+
/**
|
|
16
|
+
* Update item height if it changes
|
|
17
|
+
*/
|
|
18
|
+
updateItemHeight(height: number): void;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=WindowManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WindowManager.d.ts","sourceRoot":"","sources":["../../src/core/WindowManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,GAAE,MAAU;IAM9E;;OAEG;IACH,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY;IAmBtD;;OAEG;IACH,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI1C;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAGvC"}
|