From d3d54e10687844ffce6283d07da93d29bbba4cc8 Mon Sep 17 00:00:00 2001 From: fabriziobertoglio1987 Date: Tue, 22 Mar 2022 17:27:21 +0800 Subject: [PATCH] draft solution to add errorMessage with onChangeText The final solution should add a new instance variable mErrorMessage in ReactTextUpdate https://github.com/fabriziobertoglio1987/react-native/blob/c5762a77a9e720e0129175afc38c7dcf23bea7bd/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextUpdate.java#L153 The method is called from https://github.com/facebook/react-native/blob/c5762a77a9e720e0129175afc38c7dcf23bea7bd/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java#L370 --- .../TextInput/AndroidTextInputNativeComponent.js | 1 + .../java/com/facebook/react/uimanager/ViewProps.java | 2 +- .../facebook/react/views/textinput/ReactEditText.java | 10 ++++++++++ .../react/views/textinput/ReactTextInputManager.java | 6 +++--- .../js/examples/TextInput/TextInputSharedExamples.js | 2 +- 5 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js b/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js index e896a77f810f16..a335dc62b055c0 100644 --- a/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js +++ b/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js @@ -698,6 +698,7 @@ export const __INTERNAL_VIEW_CONFIG: PartialViewConfig = { inlineImageLeft: true, editable: true, fontVariant: true, + android_errorMessage: true, borderBottomRightRadius: true, borderBottomColor: {process: require('../../StyleSheet/processColor')}, borderRadius: true, diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewProps.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewProps.java index c020abdde30129..58b88fa02ee1f1 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewProps.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewProps.java @@ -84,7 +84,7 @@ public class ViewProps { public static final String BACKGROUND_COLOR = "backgroundColor"; public static final String FOREGROUND_COLOR = "foregroundColor"; public static final String COLOR = "color"; - public static final String ERROR_MESSAGE = "errorMessage"; + public static final String ANDROID_ERROR_MESSAGE = "android_errorMessage"; public static final String FONT_SIZE = "fontSize"; public static final String FONT_WEIGHT = "fontWeight"; public static final String FONT_STYLE = "fontStyle"; diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java index 360de688d54849..8279896d4a78d7 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java @@ -105,6 +105,7 @@ public class ReactEditText extends AppCompatEditText private boolean mDetectScrollMovement = false; private boolean mOnKeyPress = false; private TextAttributes mTextAttributes; + private @Nullable String mErrorMessage; private boolean mTypefaceDirty = false; private @Nullable String mFontFamily = null; private int mFontWeight = UNSET; @@ -144,6 +145,7 @@ public ReactEditText(Context context) { mKeyListener = new InternalKeyListener(); mScrollWatcher = null; mTextAttributes = new TextAttributes(); + mErrorMessage = null; applyTextAttributes(); @@ -235,6 +237,11 @@ public boolean onKeyUp(int keyCode, KeyEvent event) { return super.onKeyUp(keyCode, event); } + public void setErrorMessage(String error) { + mErrorMessage = error; + setError(error); + } + @Override protected void onScrollChanged(int horiz, int vert, int oldHoriz, int oldVert) { super.onScrollChanged(horiz, vert, oldHoriz, oldVert); @@ -565,6 +572,9 @@ public void maybeSetText(ReactTextUpdate reactTextUpdate) { // try to update state if the wrapper is available. Temporarily disable // to prevent an infinite loop. getText().replace(0, length(), spannableStringBuilder); + if (mErrorMessage != null && getError() != mErrorMessage) { + setError(mErrorMessage); + } } mDisableTextDiffing = false; 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 3c04d1967cd52b..99543a4ce011a3 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 @@ -372,9 +372,9 @@ public void updateExtraData(ReactEditText view, Object extraData) { } } - @ReactProp(name = ViewProps.ERROR_MESSAGE) - public void setAndroidErrorMessage(ReactEditText view, String error) { - view.setError(error); + @ReactProp(name = ViewProps.ANDROID_ERROR_MESSAGE) + public void setErrorMessage(ReactEditText view, String error) { + view.setErrorMessage(error); } @ReactProp(name = ViewProps.FONT_SIZE, defaultFloat = ViewDefaults.FONT_SIZE_SP) diff --git a/packages/rn-tester/js/examples/TextInput/TextInputSharedExamples.js b/packages/rn-tester/js/examples/TextInput/TextInputSharedExamples.js index e12d9ac9eb40d4..3ba638d1eeac7d 100644 --- a/packages/rn-tester/js/examples/TextInput/TextInputSharedExamples.js +++ b/packages/rn-tester/js/examples/TextInput/TextInputSharedExamples.js @@ -483,7 +483,7 @@ function ErrorExample(): React.Node { Type error in the below TextInput to display an error message. setError('onBlur')} onEndEditing={() => setError('onEndEditing')} onChangeText={newText => {