@@ -4,25 +4,13 @@ import raf from 'raf';
4
4
5
5
import {
6
6
shallowEqualScroll ,
7
- shallowEqualPrivateScroll ,
8
7
shallowEqualDimensions ,
9
8
browserSupportsPassiveEvents ,
10
9
simpleDebounce ,
11
10
debounceOnUpdate ,
12
11
} from './utils' ;
13
12
14
- import {
15
- IDimensions ,
16
- IPrivateScroll ,
17
- IScroll ,
18
- IViewport ,
19
- OnUpdateType ,
20
- } from './types' ;
21
-
22
- export const SCROLL_DIR_DOWN = Symbol ( 'SCROLL_DIR_DOWN' ) ;
23
- export const SCROLL_DIR_UP = Symbol ( 'SCROLL_DIR_UP' ) ;
24
- export const SCROLL_DIR_LEFT = Symbol ( 'SCROLL_DIR_LEFT' ) ;
25
- export const SCROLL_DIR_RIGHT = Symbol ( 'SCROLL_DIR_RIGHT' ) ;
13
+ import { IDimensions , IScroll , IViewport , OnUpdateType } from './types' ;
26
14
27
15
const getNodeScroll = ( elem = window ) => {
28
16
let { scrollX, scrollY } = elem ;
@@ -64,51 +52,39 @@ const getClientDimensions = (): IDimensions => {
64
52
} ;
65
53
} ;
66
54
67
- const getXDir = ( x : number , prev : IPrivateScroll ) => {
55
+ const isScrollingLeft = ( x : number , prev : IScroll ) => {
68
56
switch ( true ) {
69
57
case x < prev . x :
70
- return SCROLL_DIR_LEFT ;
58
+ return true ;
71
59
case x > prev . x :
72
- return SCROLL_DIR_RIGHT ;
60
+ return false ;
73
61
case x === prev . x :
74
- return prev . xDir ;
62
+ return prev . isScrollingLeft ;
75
63
default :
76
- throw new Error ( 'Could not calculate xDir ' ) ;
64
+ throw new Error ( 'Could not calculate isScrollingLeft ' ) ;
77
65
}
78
66
} ;
79
67
80
- const getYDir = ( y : number , prev : IPrivateScroll ) => {
68
+ const isScrollingUp = ( y : number , prev : IScroll ) => {
81
69
switch ( true ) {
82
70
case y < prev . y :
83
- return SCROLL_DIR_UP ;
71
+ return true ;
84
72
case y > prev . y :
85
- return SCROLL_DIR_DOWN ;
73
+ return false ;
86
74
case y === prev . y :
87
- return prev . yDir ;
75
+ return prev . isScrollingUp ;
88
76
default :
89
77
throw new Error ( 'Could not calculate yDir' ) ;
90
78
}
91
79
} ;
92
80
93
- const privateToPublicScroll = ( {
94
- yDir,
95
- xDir,
96
- ...scroll
97
- } : IPrivateScroll ) : IScroll => {
98
- return {
99
- ...scroll ,
100
- isScrollingUp : yDir === SCROLL_DIR_UP ,
101
- isScrollingDown : yDir === SCROLL_DIR_DOWN ,
102
- isScrollingLeft : xDir === SCROLL_DIR_LEFT ,
103
- isScrollingRight : xDir === SCROLL_DIR_RIGHT ,
104
- } ;
105
- } ;
106
-
107
- const createInitPrivateScrollState = ( ) => ( {
81
+ export const createInitScrollState = ( ) => ( {
108
82
x : 0 ,
109
83
y : 0 ,
110
- xDir : undefined ,
111
- yDir : undefined ,
84
+ isScrollingUp : false ,
85
+ isScrollingDown : false ,
86
+ isScrollingLeft : false ,
87
+ isScrollingRight : false ,
112
88
xTurn : 0 ,
113
89
yTurn : 0 ,
114
90
xDTurn : 0 ,
@@ -126,9 +102,6 @@ const createEmptyDimensionState = (): IDimensions => ({
126
102
documentHeight : 0 ,
127
103
} ) ;
128
104
129
- export const createInitScrollState = ( ) : IScroll =>
130
- privateToPublicScroll ( createInitPrivateScrollState ( ) ) ;
131
-
132
105
export const createInitDimensionsState = ( ) : IDimensions => {
133
106
if ( typeof window === 'undefined' ) {
134
107
return createEmptyDimensionState ( ) ;
@@ -142,9 +115,9 @@ interface IProps {
142
115
}
143
116
144
117
export default class ViewportCollector extends React . PureComponent < IProps > {
145
- private scrollState : IPrivateScroll ;
118
+ private scrollState : IScroll ;
146
119
private dimensionsState : IDimensions ;
147
- private lastSyncedScrollState : IPrivateScroll ;
120
+ private lastSyncedScrollState : IScroll ;
148
121
private lastSyncedDimensionsState : IDimensions ;
149
122
private tickId : NodeJS . Timer ;
150
123
private componentMightHaveUpdated : boolean ;
@@ -154,7 +127,7 @@ export default class ViewportCollector extends React.PureComponent<IProps> {
154
127
this . state = {
155
128
parentProviderExists : false ,
156
129
} ;
157
- this . scrollState = createInitPrivateScrollState ( ) ;
130
+ this . scrollState = createInitScrollState ( ) ;
158
131
this . dimensionsState = createInitDimensionsState ( ) ;
159
132
this . lastSyncedDimensionsState = { ...this . dimensionsState } ;
160
133
this . lastSyncedScrollState = { ...this . scrollState } ;
@@ -189,17 +162,22 @@ export default class ViewportCollector extends React.PureComponent<IProps> {
189
162
handleScroll = ( ) => {
190
163
const { x, y } = getNodeScroll ( ) ;
191
164
const {
192
- xDir : prevXDir ,
193
- yDir : prevYDir ,
165
+ isScrollingLeft : prevIsScrollingLeft ,
166
+ isScrollingUp : prevIsScrollingUp ,
194
167
xTurn : prevXTurn ,
195
168
yTurn : prevYTurn ,
196
169
} = this . scrollState ;
197
170
198
- this . scrollState . xDir = getXDir ( x , this . scrollState ) ;
199
- this . scrollState . yDir = getYDir ( y , this . scrollState ) ;
171
+ this . scrollState . isScrollingLeft = isScrollingLeft ( x , this . scrollState ) ;
172
+ this . scrollState . isScrollingRight = ! this . scrollState . isScrollingLeft ;
173
+
174
+ this . scrollState . isScrollingUp = isScrollingUp ( y , this . scrollState ) ;
175
+ this . scrollState . isScrollingDown = ! this . scrollState . isScrollingUp ;
200
176
201
- this . scrollState . xTurn = this . scrollState . xDir === prevXDir ? prevXTurn : x ;
202
- this . scrollState . yTurn = this . scrollState . yDir === prevYDir ? prevYTurn : y ;
177
+ this . scrollState . xTurn =
178
+ this . scrollState . isScrollingLeft === prevIsScrollingLeft ? prevXTurn : x ;
179
+ this . scrollState . yTurn =
180
+ this . scrollState . isScrollingUp === prevIsScrollingUp ? prevYTurn : y ;
203
181
204
182
this . scrollState . xDTurn = x - this . scrollState . xTurn ;
205
183
this . scrollState . yDTurn = y - this . scrollState . yTurn ;
@@ -217,17 +195,17 @@ export default class ViewportCollector extends React.PureComponent<IProps> {
217
195
} , 80 ) ;
218
196
219
197
getPublicScroll : ( ( scroll : IScroll ) => IScroll ) = memoize (
220
- ( scroll : IScroll ) : IScroll => scroll ,
198
+ ( scroll : IScroll ) : IScroll => ( { ... scroll } ) ,
221
199
shallowEqualScroll ,
222
200
) ;
223
201
224
202
getPublicDimensions : ( ( dimensions : IDimensions ) => IDimensions ) = memoize (
225
- ( dimensions : IDimensions ) : IDimensions => dimensions ,
203
+ ( dimensions : IDimensions ) : IDimensions => ( { ... dimensions } ) ,
226
204
shallowEqualDimensions ,
227
205
) ;
228
206
229
207
syncState = ( ) => {
230
- const scrollDidUpdate = ! shallowEqualPrivateScroll (
208
+ const scrollDidUpdate = ! shallowEqualScroll (
231
209
this . lastSyncedScrollState ,
232
210
this . scrollState ,
233
211
) ;
@@ -265,12 +243,8 @@ export default class ViewportCollector extends React.PureComponent<IProps> {
265
243
266
244
getPropsFromState ( ) : IViewport {
267
245
return {
268
- scroll : this . getPublicScroll (
269
- privateToPublicScroll ( this . lastSyncedScrollState ) ,
270
- ) ,
271
- dimensions : this . getPublicDimensions ( {
272
- ...this . lastSyncedDimensionsState ,
273
- } ) ,
246
+ scroll : this . getPublicScroll ( this . lastSyncedScrollState ) ,
247
+ dimensions : this . getPublicDimensions ( this . lastSyncedDimensionsState ) ,
274
248
} ;
275
249
}
276
250
0 commit comments