@@ -14,42 +14,72 @@ export default class PreClip {
14
14
}
15
15
16
16
static prepareClip ( scroller : Scroller ) {
17
- const { buffer, state, state : { fetch, fetch : { direction } } } = scroller ;
18
- if ( ! buffer . size ) {
19
- scroller . logger . log ( `skipping clip [empty buffer]` ) ;
20
- return ;
21
- }
22
- if ( state . isInitialWorkflowCycle && ! state . scrollState . scroll ) {
23
- scroller . logger . log ( `skipping clip [initial cycle, no scroll]` ) ;
17
+ const { state : { fetch, fetch : { direction } } } = scroller ;
18
+ if ( PreClip . shouldNotClip ( scroller ) ) {
24
19
return ;
25
20
}
26
21
const firstIndex = < number > fetch . firstIndexBuffer ;
27
22
const lastIndex = < number > fetch . lastIndexBuffer ;
28
23
scroller . logger . log ( ( ) =>
29
24
`looking for ${ direction ? 'anti-' + direction + ' ' : '' } items ` +
30
25
`that are out of [${ firstIndex } ..${ lastIndex } ] range` ) ;
31
- if ( ! direction || direction === Direction . forward ) {
32
- if ( firstIndex - 1 >= buffer . absMinIndex ) {
33
- PreClip . prepareClipByDirection ( scroller , Direction . forward , firstIndex ) ;
34
- }
26
+ if ( PreClip . isBackward ( scroller , firstIndex ) ) {
27
+ PreClip . prepareClipByDirection ( scroller , Direction . backward , firstIndex ) ;
35
28
}
36
- if ( ! direction || direction === Direction . backward ) {
37
- if ( lastIndex + 1 <= buffer . absMaxIndex ) {
38
- PreClip . prepareClipByDirection ( scroller , Direction . backward , lastIndex ) ;
39
- }
29
+ if ( PreClip . isForward ( scroller , lastIndex ) ) {
30
+ PreClip . prepareClipByDirection ( scroller , Direction . forward , lastIndex ) ;
40
31
}
41
32
if ( ! scroller . state . clip . doClip ) {
42
33
scroller . logger . log ( `skipping clip [no items to clip]` ) ;
43
34
}
44
35
return ;
45
36
}
46
37
38
+ static shouldNotClip ( scroller : Scroller ) : boolean {
39
+ const { buffer, state } = scroller ;
40
+ if ( ! buffer . size ) {
41
+ scroller . logger . log ( `skipping clip [empty buffer]` ) ;
42
+ return true ;
43
+ }
44
+ if ( state . isInitialWorkflowCycle && ! state . scrollState . scroll ) {
45
+ scroller . logger . log ( `skipping clip [initial cycle, no scroll]` ) ;
46
+ return true ;
47
+ }
48
+ return false ;
49
+ }
50
+
51
+ static isBackward ( scroller : Scroller , firstIndex : number ) : boolean {
52
+ const { buffer, state : { clip, fetch } } = scroller ;
53
+ if ( clip . force ) {
54
+ return clip . forceBackward ;
55
+ }
56
+ if ( fetch . direction !== Direction . backward ) {
57
+ if ( firstIndex - 1 >= buffer . absMinIndex ) {
58
+ return true ;
59
+ }
60
+ }
61
+ return false ;
62
+ }
63
+
64
+ static isForward ( scroller : Scroller , lastIndex : number ) : boolean {
65
+ const { buffer, state : { clip, fetch } } = scroller ;
66
+ if ( clip . force ) {
67
+ return clip . forceForward ;
68
+ }
69
+ if ( fetch . direction !== Direction . forward ) {
70
+ if ( lastIndex + 1 <= buffer . absMaxIndex ) {
71
+ return true ;
72
+ }
73
+ }
74
+ return false ;
75
+ }
76
+
47
77
static prepareClipByDirection ( scroller : Scroller , direction : Direction , edgeIndex : number ) {
48
78
const forward = direction === Direction . forward ;
49
79
scroller . buffer . items . forEach ( item => {
50
80
if (
51
- ( forward && item . $index < edgeIndex ) ||
52
- ( ! forward && item . $index > edgeIndex )
81
+ ( ! forward && item . $index < edgeIndex ) ||
82
+ ( forward && item . $index > edgeIndex )
53
83
) {
54
84
item . toRemove = true ;
55
85
item . removeDirection = direction ;
0 commit comments