From 4d54b48167c99d0f3a8917e7637ffe3304c6bed6 Mon Sep 17 00:00:00 2001 From: Adam King Date: Wed, 20 Sep 2017 16:26:41 -0700 Subject: [PATCH] Fix onSubmitEditing dispatch behavior with blurOnSubmit/multiline combinations. Summary: Fixes https://github.com/facebook/react-native/issues/15863 on master. Behavior of `onSubmitEditing` is now consistent between iOS and Android. Tapping the submit button in a TextInput dispatches the event precisely when doing so does not make a newline (when blurOnSubmit is true or multiline is false). 1. Run this app on iOS and Android: ``` // flow import React, { Component } from 'react'; import { StyleSheet, TextInput, View } from 'react-native'; type State = { toggled: boolean }; type Props = { blurOnSubmit: boolean, multiline: boolean }; class ToggleColorInput extends Component { state: State = { toggled: false }; props: Props; toggle = () => { this.setState({ toggled: !this.state.toggled }); } render() { return ( ) } } export default class App extends Component<{}> { render() { return ( ); } } const styles = StyleSheet.create({ textInput: { height: 75, borderWidth: 1, borderColor: 'black' } }); ``` 2. You see four TextInputs, with each combination of the `blurOnSubmit` and `multiline` properties. For each TextInput, type some text and tap the submit button. 3. The TextInputs in this test will toggle background color when they emit an `onSubmitEditing` event. Verify the following behavior on each platform: * blurOnSubmit && isMultiline => Submit event emitted, blurred, no newline inserted * blurOnSubmit && !isMultiline => Submit event emitted, blurred * !blurOnSubmit && isMultiline => Submit event emitted, newline inserted * !blurOnSubmit && !isMultiline => Submit event emitted Closes https://github.com/facebook/react-native/pull/16040 Differential Revision: D5877401 Pulled By: shergin fbshipit-source-id: 741bcc06d8b69d7025f2cb42dd0bee4fa01cd88e --- .../textinput/ReactTextInputManager.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java index 4767db367..44849d3b0 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java @@ -737,23 +737,25 @@ public class ReactTextInputManager extends BaseViewManager Generate `submit` event; clear focus; prevent default behaviour (return true); - // * blurOnSubmit && !isMultiline => Generate `submit` event; clear focus; prevent default behaviour (return true); + // * blurOnSubmit && isMultiline => Clear focus; prevent default behaviour (return true); + // * blurOnSubmit && !isMultiline => Clear focus; prevent default behaviour (return true); // * !blurOnSubmit && isMultiline => Perform default behaviour (return false); // * !blurOnSubmit && !isMultiline => Prevent default behaviour (return true). + // Additionally we always generate a `submit` event. + + EventDispatcher eventDispatcher = + reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher(); + + eventDispatcher.dispatchEvent( + new ReactTextInputSubmitEditingEvent( + editText.getId(), + editText.getText().toString())); if (blurOnSubmit) { - EventDispatcher eventDispatcher = - reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher(); - - eventDispatcher.dispatchEvent( - new ReactTextInputSubmitEditingEvent( - editText.getId(), - editText.getText().toString())); - editText.clearFocus(); } + // Prevent default behavior except when we want it to insert a newline. return blurOnSubmit || !isMultiline; }