@@ -4,10 +4,10 @@ import { Process, ProcessStatus, Direction } from '../interfaces/index';
4
4
export default class PreFetch {
5
5
6
6
static run ( scroller : Scroller , process : Process ) {
7
- const { fetch } = scroller . state ;
7
+ const { buffer , state : { fetch } } = scroller ;
8
8
scroller . state . preFetchPosition = scroller . viewport . scrollPosition ;
9
- fetch . minIndex = scroller . buffer . minIndex ;
10
- fetch . averageItemSize = scroller . buffer . averageSize || 0 ;
9
+ fetch . minIndex = buffer . minIndex ;
10
+ fetch . averageItemSize = buffer . averageSize || 0 ;
11
11
12
12
// calculate size before start index
13
13
PreFetch . setStartDelta ( scroller ) ;
@@ -18,6 +18,11 @@ export default class PreFetch {
18
18
// skip indexes that are in buffer
19
19
PreFetch . skipBufferedItems ( scroller ) ;
20
20
21
+ if ( scroller . settings . infinite ) {
22
+ // fill indexes to include buffer if no clip
23
+ PreFetch . checkBufferGaps ( scroller ) ;
24
+ }
25
+
21
26
// add indexes if there are too few items to fetch (clip padding)
22
27
PreFetch . checkFetchPackSize ( scroller ) ;
23
28
@@ -30,7 +35,7 @@ export default class PreFetch {
30
35
31
36
scroller . callWorkflow ( {
32
37
process : Process . preFetch ,
33
- status : scroller . state . fetch . shouldFetch ? ProcessStatus . next : ProcessStatus . done ,
38
+ status : fetch . shouldFetch ? ProcessStatus . next : ProcessStatus . done ,
34
39
payload : process
35
40
} ) ;
36
41
}
@@ -108,14 +113,14 @@ export default class PreFetch {
108
113
}
109
114
110
115
static setLastIndexBuffer ( scroller : Scroller , startPosition : number , endPosition : number ) {
111
- const { state, buffer, settings } = scroller ;
116
+ const { state, buffer, settings, state : { fetch } } = scroller ;
112
117
let lastIndex ;
113
118
if ( ! buffer . hasItemSize ) {
114
119
// just to fetch forward bufferSize items if neither averageItemSize nor itemSize are present
115
120
lastIndex = state . startIndex + settings . bufferSize - 1 ;
116
121
scroller . logger . log ( `forcing fetch forward direction [no item size]` ) ;
117
122
} else {
118
- let index = < number > state . fetch . firstIndexBuffer ;
123
+ let index = < number > fetch . firstIndexBuffer ;
119
124
let position = startPosition ;
120
125
lastIndex = index ;
121
126
while ( 1 ) {
@@ -129,11 +134,11 @@ export default class PreFetch {
129
134
}
130
135
}
131
136
}
132
- state . fetch . lastIndex = state . fetch . lastIndexBuffer = Math . min ( lastIndex , buffer . absMaxIndex ) ;
137
+ fetch . lastIndex = fetch . lastIndexBuffer = Math . min ( lastIndex , buffer . absMaxIndex ) ;
133
138
}
134
139
135
140
static skipBufferedItems ( scroller : Scroller ) {
136
- const buffer = scroller . buffer ;
141
+ const { buffer } = scroller ;
137
142
if ( ! buffer . size ) {
138
143
return ;
139
144
}
@@ -165,6 +170,26 @@ export default class PreFetch {
165
170
}
166
171
}
167
172
173
+ static checkBufferGaps ( scroller : Scroller ) {
174
+ const { buffer, state : { fetch } } = scroller ;
175
+ if ( ! buffer . size ) {
176
+ return ;
177
+ }
178
+ const fetchFirst = < number > fetch . firstIndex ;
179
+ const bufferLast = < number > buffer . lastIndex ;
180
+ if ( fetchFirst > bufferLast ) {
181
+ fetch . firstIndex = fetch . firstIndexBuffer = bufferLast + 1 ;
182
+ }
183
+ const bufferFirst = < number > buffer . firstIndex ;
184
+ const fetchLast = < number > fetch . lastIndex ;
185
+ if ( fetchLast < bufferFirst ) {
186
+ fetch . lastIndex = fetch . lastIndexBuffer = bufferFirst - 1 ;
187
+ }
188
+ if ( fetch . firstIndex !== fetchFirst || fetch . lastIndex !== fetchLast ) {
189
+ scroller . logger . fetch ( 'after Buffer filling (no clip case)' ) ;
190
+ }
191
+ }
192
+
168
193
static checkFetchPackSize ( scroller : Scroller ) {
169
194
const { buffer, state : { fetch } } = scroller ;
170
195
if ( ! fetch . shouldFetch ) {
0 commit comments