Skip to content

Commit

Permalink
[0.63] Avoid eating clicks/taps into ScrollView when using physical k…
Browse files Browse the repository at this point in the history
…eyboard… (#668)

* Avoid eating clicks/taps into ScrollView when using physical keyboard (facebook#30374)

Summary:
This is an extension of facebook#29798 which was reverted due to cases where the soft keyboard could not be dismissed.

## Changelog

<!-- Help reviewers and the release process by writing your own changelog entry. For an example, see:
https://github.com/facebook/react-native/wiki/Changelog
-->

[General] [Fixed] - Avoid eating clicks/taps into ScrollView when using physical keyboard

Pull Request resolved: facebook#30374

Test Plan: Validated with iOS simulator that taps on default ScrollView will dismiss soft keyboard and be eaten if open, but taps are not eaten when emulating a connected physical keyboard.

Reviewed By: kacieb

Differential Revision: D24935077

Pulled By: lyahdav

fbshipit-source-id: 19d9cf64547e40a35f9363896e3abbdccb95b546

* [ado] Workaround homebrew openssl issue

actions/runner-images#1811 (comment)

* [RNTester] Update pods

Co-authored-by: Eloy Durán <[email protected]>
  • Loading branch information
NickGerleman and alloy authored Dec 8, 2020
1 parent 2794a7e commit 408d308
Show file tree
Hide file tree
Showing 3 changed files with 267 additions and 240 deletions.
3 changes: 3 additions & 0 deletions .ado/templates/apple-node-setup.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
# Task Group: Brew install node version
#
steps:
- script: 'brew uninstall [email protected] && rm -rf /usr/local/etc/openssl && rm -rf /usr/local/etc/[email protected]'
displayName: Fix Homebrew

- script: 'brew bundle'
displayName: 'brew bundle'

Expand Down
32 changes: 28 additions & 4 deletions Libraries/Components/ScrollResponder.js
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ const ScrollResponderMixin = {

if (
this.props.keyboardShouldPersistTaps === 'handled' &&
currentlyFocusedInput != null &&
this.scrollResponderKeyboardIsDismissible() &&
e.target !== currentlyFocusedInput
) {
return true;
Expand Down Expand Up @@ -224,7 +224,6 @@ const ScrollResponderMixin = {
// and a new touch starts with a non-textinput target (in which case the
// first tap should be sent to the scroll view and dismiss the keyboard,
// then the second tap goes to the actual interior view)
const currentlyFocusedTextInput = TextInputState.currentlyFocusedInput();
const {keyboardShouldPersistTaps} = this.props;
const keyboardNeverPersistTaps =
!keyboardShouldPersistTaps || keyboardShouldPersistTaps === 'never';
Expand All @@ -241,7 +240,7 @@ const ScrollResponderMixin = {

if (
keyboardNeverPersistTaps &&
currentlyFocusedTextInput != null &&
this.scrollResponderKeyboardIsDismissible() &&
e.target != null &&
!TextInputState.isTextInput(e.target)
) {
Expand All @@ -251,6 +250,31 @@ const ScrollResponderMixin = {
return false;
},

/**
* Do we consider there to be a dismissible soft-keyboard open?
*/
scrollResponderKeyboardIsDismissible: function(): boolean {
const currentlyFocusedInput = TextInputState.currentlyFocusedInput();

// We cannot dismiss the keyboard without an input to blur, even if a soft
// keyboard is open (e.g. when keyboard is open due to a native component
// not participating in TextInputState). It's also possible that the
// currently focused input isn't a TextInput (such as by calling ref.focus
// on a non-TextInput).
const hasFocusedTextInput =
currentlyFocusedInput != null &&
TextInputState.isTextInput(currentlyFocusedInput);

// Even if an input is focused, we may not have a keyboard to dismiss. E.g
// when using a physical keyboard. Ensure we have an event for an opened
// keyboard, except on Android where setting windowSoftInputMode to
// adjustNone leads to missing keyboard events.
const softKeyboardMayBeOpen =
this.keyboardWillOpenTo != null || Platform.OS === 'android';

return hasFocusedTextInput && softKeyboardMayBeOpen;
},

/**
* Invoke this from an `onResponderReject` event.
*
Expand Down Expand Up @@ -325,7 +349,7 @@ const ScrollResponderMixin = {
if (
this.props.keyboardShouldPersistTaps !== true &&
this.props.keyboardShouldPersistTaps !== 'always' &&
currentlyFocusedTextInput != null &&
this.scrollResponderKeyboardIsDismissible() &&
e.target !== currentlyFocusedTextInput &&
!this.state.observedScrollSinceBecomingResponder &&
!this.state.becameResponderWhileAnimating
Expand Down
Loading

0 comments on commit 408d308

Please sign in to comment.