Skip to content

Commit 25e2887

Browse files
saitoxufacebook-github-bot
authored andcommitted
Flow strict ScrollResponder (facebook#22181)
Summary: Related to facebook#22100 Enhance Flow types for Libraries/Components/ScrollResponder.js Pull Request resolved: facebook#22181 Reviewed By: TheSavior Differential Revision: D13032699 Pulled By: RSNara fbshipit-source-id: ca0ce178a96008a71016d033ee1154ad807d6599
1 parent aeb87cb commit 25e2887

File tree

1 file changed

+31
-27
lines changed

1 file changed

+31
-27
lines changed

Libraries/Components/ScrollResponder.js

+31-27
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ const warning = require('fbjs/lib/warning');
2424

2525
const {ScrollViewManager} = require('NativeModules');
2626

27+
import type {PressEvent, ScrollEvent} from 'CoreEventTypes';
28+
import type {KeyboardEvent} from 'Keyboard';
2729
import type EmitterSubscription from 'EmitterSubscription';
2830

2931
/**
@@ -113,7 +115,6 @@ type State = {
113115
observedScrollSinceBecomingResponder: boolean,
114116
becameResponderWhileAnimating: boolean,
115117
};
116-
type Event = Object;
117118

118119
const ScrollResponderMixin = {
119120
_subscriptionKeyboardWillShow: (null: ?EmitterSubscription),
@@ -168,7 +169,9 @@ const ScrollResponderMixin = {
168169
* true.
169170
*
170171
*/
171-
scrollResponderHandleStartShouldSetResponder: function(e: Event): boolean {
172+
scrollResponderHandleStartShouldSetResponder: function(
173+
e: PressEvent,
174+
): boolean {
172175
const currentlyFocusedTextInput = TextInputState.currentlyFocusedField();
173176

174177
if (
@@ -193,7 +196,7 @@ const ScrollResponderMixin = {
193196
* Invoke this from an `onStartShouldSetResponderCapture` event.
194197
*/
195198
scrollResponderHandleStartShouldSetResponderCapture: function(
196-
e: Event,
199+
e: PressEvent,
197200
): boolean {
198201
// The scroll view should receive taps instead of its descendants if:
199202
// * it is already animating/decelerating
@@ -212,6 +215,7 @@ const ScrollResponderMixin = {
212215
if (
213216
keyboardNeverPersistTaps &&
214217
currentlyFocusedTextInput != null &&
218+
e.target &&
215219
!TextInputState.isTextInput(e.target)
216220
) {
217221
return true;
@@ -254,9 +258,9 @@ const ScrollResponderMixin = {
254258
/**
255259
* Invoke this from an `onTouchEnd` event.
256260
*
257-
* @param {SyntheticEvent} e Event.
261+
* @param {PressEvent} e Event.
258262
*/
259-
scrollResponderHandleTouchEnd: function(e: Event) {
263+
scrollResponderHandleTouchEnd: function(e: PressEvent) {
260264
const nativeEvent = e.nativeEvent;
261265
this.state.isTouching = nativeEvent.touches.length !== 0;
262266
this.props.onTouchEnd && this.props.onTouchEnd(e);
@@ -265,17 +269,17 @@ const ScrollResponderMixin = {
265269
/**
266270
* Invoke this from an `onTouchCancel` event.
267271
*
268-
* @param {SyntheticEvent} e Event.
272+
* @param {PressEvent} e Event.
269273
*/
270-
scrollResponderHandleTouchCancel: function(e: Event) {
274+
scrollResponderHandleTouchCancel: function(e: PressEvent) {
271275
this.state.isTouching = false;
272276
this.props.onTouchCancel && this.props.onTouchCancel(e);
273277
},
274278

275279
/**
276280
* Invoke this from an `onResponderRelease` event.
277281
*/
278-
scrollResponderHandleResponderRelease: function(e: Event) {
282+
scrollResponderHandleResponderRelease: function(e: PressEvent) {
279283
this.props.onResponderRelease && this.props.onResponderRelease(e);
280284

281285
// By default scroll views will unfocus a textField
@@ -295,15 +299,15 @@ const ScrollResponderMixin = {
295299
}
296300
},
297301

298-
scrollResponderHandleScroll: function(e: Event) {
302+
scrollResponderHandleScroll: function(e: ScrollEvent) {
299303
this.state.observedScrollSinceBecomingResponder = true;
300304
this.props.onScroll && this.props.onScroll(e);
301305
},
302306

303307
/**
304308
* Invoke this from an `onResponderGrant` event.
305309
*/
306-
scrollResponderHandleResponderGrant: function(e: Event) {
310+
scrollResponderHandleResponderGrant: function(e: ScrollEvent) {
307311
this.state.observedScrollSinceBecomingResponder = false;
308312
this.props.onResponderGrant && this.props.onResponderGrant(e);
309313
this.state.becameResponderWhileAnimating = this.scrollResponderIsAnimating();
@@ -316,15 +320,15 @@ const ScrollResponderMixin = {
316320
*
317321
* Invoke this from an `onScrollBeginDrag` event.
318322
*/
319-
scrollResponderHandleScrollBeginDrag: function(e: Event) {
323+
scrollResponderHandleScrollBeginDrag: function(e: ScrollEvent) {
320324
FrameRateLogger.beginScroll(); // TODO: track all scrolls after implementing onScrollEndAnimation
321325
this.props.onScrollBeginDrag && this.props.onScrollBeginDrag(e);
322326
},
323327

324328
/**
325329
* Invoke this from an `onScrollEndDrag` event.
326330
*/
327-
scrollResponderHandleScrollEndDrag: function(e: Event) {
331+
scrollResponderHandleScrollEndDrag: function(e: ScrollEvent) {
328332
const {velocity} = e.nativeEvent;
329333
// - If we are animating, then this is a "drag" that is stopping the scrollview and momentum end
330334
// will fire.
@@ -343,15 +347,15 @@ const ScrollResponderMixin = {
343347
/**
344348
* Invoke this from an `onMomentumScrollBegin` event.
345349
*/
346-
scrollResponderHandleMomentumScrollBegin: function(e: Event) {
350+
scrollResponderHandleMomentumScrollBegin: function(e: ScrollEvent) {
347351
this.state.lastMomentumScrollBeginTime = performanceNow();
348352
this.props.onMomentumScrollBegin && this.props.onMomentumScrollBegin(e);
349353
},
350354

351355
/**
352356
* Invoke this from an `onMomentumScrollEnd` event.
353357
*/
354-
scrollResponderHandleMomentumScrollEnd: function(e: Event) {
358+
scrollResponderHandleMomentumScrollEnd: function(e: ScrollEvent) {
355359
FrameRateLogger.endScroll();
356360
this.state.lastMomentumScrollEndTime = performanceNow();
357361
this.props.onMomentumScrollEnd && this.props.onMomentumScrollEnd(e);
@@ -366,9 +370,9 @@ const ScrollResponderMixin = {
366370
* responder). The `onResponderReject` won't fire in that case - it only
367371
* fires when a *current* responder rejects our request.
368372
*
369-
* @param {SyntheticEvent} e Touch Start event.
373+
* @param {PressEvent} e Touch Start event.
370374
*/
371-
scrollResponderHandleTouchStart: function(e: Event) {
375+
scrollResponderHandleTouchStart: function(e: PressEvent) {
372376
this.state.isTouching = true;
373377
this.props.onTouchStart && this.props.onTouchStart(e);
374378
},
@@ -382,9 +386,9 @@ const ScrollResponderMixin = {
382386
* responder). The `onResponderReject` won't fire in that case - it only
383387
* fires when a *current* responder rejects our request.
384388
*
385-
* @param {SyntheticEvent} e Touch Start event.
389+
* @param {PressEvent} e Touch Start event.
386390
*/
387-
scrollResponderHandleTouchMove: function(e: Event) {
391+
scrollResponderHandleTouchMove: function(e: PressEvent) {
388392
this.props.onTouchMove && this.props.onTouchMove(e);
389393
},
390394

@@ -409,7 +413,7 @@ const ScrollResponderMixin = {
409413
* Components can pass what node to use by defining a `getScrollableNode`
410414
* function otherwise `this` is used.
411415
*/
412-
scrollResponderGetScrollableNode: function(): any {
416+
scrollResponderGetScrollableNode: function(): ?number {
413417
return this.getScrollableNode
414418
? this.getScrollableNode()
415419
: ReactNative.findNodeHandle(this);
@@ -527,14 +531,14 @@ const ScrollResponderMixin = {
527531
* This method should be used as the callback to onFocus in a TextInputs'
528532
* parent view. Note that any module using this mixin needs to return
529533
* the parent view's ref in getScrollViewRef() in order to use this method.
530-
* @param {any} nodeHandle The TextInput node handle
534+
* @param {number} nodeHandle The TextInput node handle
531535
* @param {number} additionalOffset The scroll view's bottom "contentInset".
532536
* Default is 0.
533537
* @param {bool} preventNegativeScrolling Whether to allow pulling the content
534538
* down to make it meet the keyboard's top. Default is false.
535539
*/
536540
scrollResponderScrollNativeHandleToKeyboard: function(
537-
nodeHandle: any,
541+
nodeHandle: number,
538542
additionalOffset?: number,
539543
preventNegativeScrollOffset?: boolean,
540544
) {
@@ -584,8 +588,8 @@ const ScrollResponderMixin = {
584588
this.preventNegativeScrollOffset = false;
585589
},
586590

587-
scrollResponderTextInputFocusError: function(e: Event) {
588-
console.error('Error measuring text field: ', e);
591+
scrollResponderTextInputFocusError: function(msg: string) {
592+
console.error('Error measuring text field: ', msg);
589593
},
590594

591595
/**
@@ -667,17 +671,17 @@ const ScrollResponderMixin = {
667671
* relevant to you. (For example, only if you receive these callbacks after
668672
* you had explicitly focused a node etc).
669673
*/
670-
scrollResponderKeyboardWillShow: function(e: Event) {
674+
scrollResponderKeyboardWillShow: function(e: KeyboardEvent) {
671675
this.keyboardWillOpenTo = e;
672676
this.props.onKeyboardWillShow && this.props.onKeyboardWillShow(e);
673677
},
674678

675-
scrollResponderKeyboardWillHide: function(e: Event) {
679+
scrollResponderKeyboardWillHide: function(e: KeyboardEvent) {
676680
this.keyboardWillOpenTo = null;
677681
this.props.onKeyboardWillHide && this.props.onKeyboardWillHide(e);
678682
},
679683

680-
scrollResponderKeyboardDidShow: function(e: Event) {
684+
scrollResponderKeyboardDidShow: function(e: KeyboardEvent) {
681685
// TODO(7693961): The event for DidShow is not available on iOS yet.
682686
// Use the one from WillShow and do not assign.
683687
if (e) {
@@ -686,7 +690,7 @@ const ScrollResponderMixin = {
686690
this.props.onKeyboardDidShow && this.props.onKeyboardDidShow(e);
687691
},
688692

689-
scrollResponderKeyboardDidHide: function(e: Event) {
693+
scrollResponderKeyboardDidHide: function(e: KeyboardEvent) {
690694
this.keyboardWillOpenTo = null;
691695
this.props.onKeyboardDidHide && this.props.onKeyboardDidHide(e);
692696
},

0 commit comments

Comments
 (0)