Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TextInput onChangeText called automatically for maxLength and multiline #36494

Closed
shrihari1999 opened this issue Mar 16, 2023 · 35 comments
Closed
Labels
Component: TextInput Related to the TextInput component. Impact: Regression Describes a behavior that used to work on a prior release, but stopped working recently. Issue: Author Provided Repro This issue can be reproduced in Snack or an attached project. Needs: Triage 🔍 Platform: iOS iOS applications.

Comments

@shrihari1999
Copy link

shrihari1999 commented Mar 16, 2023

Description

Consider a TextInput that has maxLength set and multiline true. When the text input's initial value's length is more than half the maxLength value, onChangeText is automatically called on render.

I am unable to reproduce this in a snack, happens on multiple iOS devices I've tried. No issue with android.

React Native Version

0.71.3

Output of npx react-native info

System:
OS: Linux 4.15 Ubuntu 16.04.7 LTS (Xenial Xerus)
CPU: (4) x64 Intel(R) Core(TM) i5-2320 CPU @ 3.00GHz
Memory: 3.66 GB / 7.76 GB
Shell: 4.3.48 - /bin/bash
Binaries:
Node: 16.17.0 - ~/.config/nvm/versions/node/v16.17.0/bin/node
Yarn: 1.22.19 - ~/.config/nvm/versions/node/v16.17.0/bin/yarn
npm: 8.15.0 - ~/.config/nvm/versions/node/v16.17.0/bin/npm
Watchman: 4.9.0 - /usr/local/bin/watchman
SDKs:
Android SDK:
API Levels: 28, 29, 30, 31
Build Tools: 28.0.3, 29.0.2, 29.0.3
System Images: android-27 | Google Play Intel x86 Atom
Android NDK: Not Found
IDEs:
Android Studio: Not Found
Languages:
Java: 1.8.0_251 - /home/shrihari/jdk1.8.0_251/bin/javac
npmPackages:
@react-native-community/cli: Not Found
react: 18.2.0 => 18.2.0
react-native: 0.71.3 => 0.71.3
npmGlobalPackages:
react-native: Not Found

Steps to reproduce

  1. Use a TextInput with maxLength={10} and multiline={true}
  2. Set the initial state of textinput's value to a string of length more than 5.
  3. Observe onChangeText is automatically called with wrong text parameter

Snack, code example, screenshot, or link to a repository

import React, { useState } from 'react'
import { SafeAreaView, TextInput } from 'react-native'

export default function EditProfileFieldScreen({ route }) {
    // const [fieldValue, setFieldValue] = useState('abcde') // works correctly
    const [fieldValue, setFieldValue] = useState('abcdef') // does not work correctly
    console.log('initial length', fieldValue.length)

    const handleTextChange = (text) => {
        console.log('text change called', text.length)
        setFieldValue(text)
    }


    return (
        <SafeAreaView style={{flex: 1, backgroundColor: 'white'}}>
            <TextInput
                value={fieldValue}
                onChangeText={handleTextChange}
                maxLength={10}
                multiline={true}
            />

        </SafeAreaView>
    )
}

I am using Expo SDK 48. I am also running the lastest version of Expo GO

@github-actions
Copy link

⚠️ Newer Version of React Native is Available!
ℹ️ You are on a supported minor version, but it looks like there's a newer patch available. Please upgrade to the highest patch for your minor or latest and verify if the issue persists (alternatively, create a new project and repro the issue in it). If it does not repro, please let us know so we can close out this issue. This helps us ensure we are looking at issues that still exist in the most recent releases.

@react-native-bot react-native-bot added Component: TextInput Related to the TextInput component. Platform: Linux Building on Linux. labels Mar 16, 2023
@Fb9027

This comment was marked as off-topic.

@shrihari1999
Copy link
Author

warning Newer Version of React Native is Available!
information_source You are on a supported minor version, but it looks like there's a newer patch available. Please upgrade to the highest patch for your minor or latest and verify if the issue persists (alternatively, create a new project and repro the issue in it). If it does not repro, please let us know so we can close out this issue. This helps us ensure we are looking at issues that still exist in the most recent releases.

I tried upgrading to the latest version (0.71.4). I can confirm that the issue still persists. Someone please help!

@SrikrishnaParthasarathy

Hello, has anyone found a solution? I'm having the same problem.

@remanation
Copy link

We also experience this. I would be really nice to get fixed.

@remanation
Copy link

I found out it was introduces in this commit: 112bfee
I tried to revert the changes locally and that fixed the issue. For now we will apply a patch in our repo the reverts the changes.
I'm not really sure why the changes cause the issue. @s77rt could you maybe have a look as it seems like you did the changes.

@shrihari1999
Copy link
Author

In case anyone doesn't want to change the source code, I did a dirty settimeout workaround, that basically shields the component from updating for the first 300ms.

Someone please fix this officially!!

@s77rt
Copy link
Contributor

s77rt commented Mar 23, 2023

@remanation I have been looking into this. I think that the bug existed for long but instead of having onChangeText fire it was onSelectionChange. In the new version (0.71) every time onSelectonChange is about to fire, we will first fire onChangeText (to switch the order).

So the real bug to investigate is: Why onSelectionChange fires at render on a multiline TextInput.
This is reproducible even on older versions (before the linked commit): https://snack.expo.dev/uy58XKz_S?platform=ios

@smhaltnsk
Copy link

smhaltnsk commented Mar 24, 2023

0.70.6 not have this bug, I upgraded to 0.71.4 and now I have this bug

@jzaleski
Copy link

Just spent this evening chasing down this issue, we're on 0.71.4, and then I stumbled across this issue. Bah. Appreciate you guys looking into this!

@jzaleski
Copy link

In case anyone doesn't want to change the source code, I did a dirty settimeout workaround, that basically shields the component from updating for the first 300ms.

Someone please fix this officially!!

As a temporary solution until the root-cause can be addressed I did the the same thing -- thanks for the recommendation @shrihari1999.

@shrihari1999
Copy link
Author

Quick update: Upgrading to 0.71.6 didn't fix it either

@rottabonus
Copy link

rottabonus commented Apr 9, 2023

In case anyone doesn't want to change the source code, I did a dirty settimeout workaround, that basically shields the component from updating for the first 300ms.
Someone please fix this officially!!

As a temporary solution until the root-cause can be addressed I did the the same thing -- thanks for the recommendation @shrihari1999.

Hi all, could one of you provide an example of this workaround?

EDIT:

I made myself it like this

type Props = {
  text: string;
  setText: React.Dispatch<React.SetStateAction<string>>;
  maxLength: number;
};

export default (props: Props) => {
//github.com/facebook/react-native/issues/36494
React.useEffect(() => {
    setTimeout(() => props.setText(props.text), 300);
  }, []);

  return (
      <TextInput
        value={props.text}
        onChangeText={props.setText}
        multiline
        maxLength={props.maxLength}
      />
  );
};

The problem with my approach is that the wrong value flashes on the input before the correct one is set.. =P

@shrihari1999
Copy link
Author

@rottabonus The point is to prevent onChangeText from affecting your state variables for 300ms. Try refactoring your code to this.

type Props = {
  text: string;
  setText: React.Dispatch<React.SetStateAction<string>>;
  maxLength: number;
};

export default (props: Props) => {
  const [onChangeShield, setOnChangeShield] = React.useState(true)
  //github.com/facebook/react-native/issues/36494
  React.useEffect(() => {
    if(onChangeShield){
        setTimeout(() => {
            setOnChangeShield(false)
        }, 300);
    }
  }, []);

  const handleTextChange = (text) => {
      if(onChangeShield){
          return
      }
      
      props.setText(text)
  }

  return (
      <TextInput
        value={props.text}
        onChangeText={handleTextChange}
        multiline
        maxLength={props.maxLength}
      />
  );
};

@rottabonus
Copy link

@rottabonus The point is to prevent onChangeText from affecting your state variables for 300ms. Try refactoring your code to this.

type Props = {
  text: string;
  setText: React.Dispatch<React.SetStateAction<string>>;
  maxLength: number;
};

export default (props: Props) => {
  const [onChangeShield, setOnChangeShield] = React.useState(true)
  //github.com/facebook/react-native/issues/36494
  React.useEffect(() => {
    if(onChangeShield){
        setTimeout(() => {
            setOnChangeShield(false)
        }, 300);
    }
  }, []);

  const handleTextChange = (text) => {
      if(onChangeShield){
          return
      }
      
      props.setText(text)
  }

  return (
      <TextInput
        value={props.text}
        onChangeText={handleTextChange}
        multiline
        maxLength={props.maxLength}
      />
  );
};

Thanks for the suggestion!

It works better than my implementation, but still there is a tiny flash - but one you almost cannot see.
That will have to do for now.. :p

Here is a small clip:

lolwut.mov

BTW the application is open sourced, so no worries of me showing something secret =)

renchap added a commit to renchap/react-native-36494-repro that referenced this issue Apr 13, 2023
@dmytrorykun
Copy link
Contributor

I can confirm that onChangeText (onSelectionChange before 112bfee) is called for every render of multiline TextInput.
@shrihari1999 do you confirm that maxLength and text length is relevant here? For me this issue happens regardless of text length.

@shrihari1999
Copy link
Author

Sorry @dmytrorykun. I'm not aware of the onSelectionChange/onChangeText saga.

For me, there is no problem on an iOS device if:
a) maxLength is not set
b) If initial state value length is less than half of maxLength.

I'm not sure if its relevant to the underlying problem. But, I can confirm that this is my observation on any physical iOS device.

@renchap
Copy link
Contributor

renchap commented Apr 13, 2023

FYI there is a simple repro repo here, based on RN 0.72.1-rc1: https://github.com/renchap/react-native-36494-repro

It reproduces the initially reported issue, where the text is (partially) duplicated with multiline + maxLength when the initial text is > maxLength /2. This is due to onChangeText (and onChange) being called multiple times on render with the duplicated text.

I did not try without maxLength

@kelset kelset added Impact: Regression Describes a behavior that used to work on a prior release, but stopped working recently. Platform: iOS iOS applications. and removed Platform: Linux Building on Linux. Newer Patch Available labels Apr 13, 2023
@renchap
Copy link
Contributor

renchap commented Apr 13, 2023

I added a second repro case in my repo linked above, without maxLength, and can confirm that onChangeText (and onChange) is called once when rendering the <TextInput multiline>, regardless of the size of the initial value. This does not happen without multiline.

So there are 2 parts of this bug:

  • Rendering a <TextInput multiline> component triggers a call to onChange and onChangeText on first render on iOS
  • If there is a maxLength on the component, onChange and onChangeText are called with the initial value duplicated in the event's text to fill it to the defined maxLength

@cortinico cortinico added the Issue: Author Provided Repro This issue can be reproduced in Snack or an attached project. label Apr 17, 2023
facebook-github-bot pushed a commit that referenced this issue Jul 4, 2023
… multiline=true on iOS (#37958)

Summary:
This fix fixes the TextInput issue in #37784 with onChangeText not working on iOS only.

## Changelog:

<!-- Help reviewers and the release process by writing your own changelog entry.

Pick one each for the category and type tags:

[ANDROID|GENERAL|IOS|INTERNAL] [BREAKING|ADDED|CHANGED|DEPRECATED|REMOVED|FIXED|SECURITY] - Message

For more details, see:
https://reactnative.dev/contributing/changelogs-in-pull-requests
-->

[IOS] [FIXED] - Fix onChangeText not firing when clearing the value of TextInput with multiline=true on iOS

Pull Request resolved: #37958

Test Plan:
1. Run the repro code given in the issue (#37784).
2. Verified that onChangeText works after pressing the submit button.
3. Run the repro code from the issue (#36494) that caused this issue.
4. Verified that issue (#36494) is not reoccurring.

Reviewed By: rshest

Differential Revision: D47185775

Pulled By: dmytrorykun

fbshipit-source-id: 1a1a6534d6bf8b5bb8cf1090734dd894bab43f82
Saadnajmi added a commit to microsoft/react-native-macos that referenced this issue Jul 6, 2023
* [LOCAL] update podlock post release to fix CI

* Fix measurement of uncontrolled TextInput after edit

Summary:
D42721684 (facebook@be69c8b) left a pretty bad bug when using Fabric for Android. I missed that in Fabric specifically, on edit we will cache the Spannable backing the EditText for use in future measurement.

Because we've stripped the sizing spans, Spannable measurement has incorrect font size, and the TextInput size will change (collapsing) after the first edit. This effectively breaks any uncontrolled TextInput which does not have explicit dimensions set.

Changelog:
[Android][Fixed] - Fix measurement of uncontrolled TextInput after edit

Reviewed By: sammy-SC

Differential Revision: D43158407

fbshipit-source-id: 51602eab06c9a50e2b60ef0ed87bdb4df025e51e

* Minimize EditText Spans 1/9: Fix precedence (facebook#36543)

Summary:
Pull Request resolved: facebook#36543

This is part of a series of changes to minimize the number of spans committed to EditText, as a mitigation for platform issues on Samsung devices. See this [GitHub thread]( facebook#35936 (comment)) for greater context on the platform behavior.

We cache the backing EditText span on text change to later measure. To measure outside of a TextInput we need to restore any spans we removed. Spans may overlap, so base attributes should be behind everything else.

The logic here for dealing with precedence is incorrect, and we should instead accomplish this by twiddling with the `SPAN_PRIORITY` bits.

Changelog:
[Android][Fixed] - Minimize Spans 1/N: Fix precedence

Reviewed By: javache

Differential Revision: D44240779

fbshipit-source-id: f731b353587888faad946b8cf1e868095cdeced3

* Minimize EditText Spans 2/9: Make stripAttributeEquivalentSpans generic (facebook#36546)

Summary:
Pull Request resolved: facebook#36546

This is part of a series of changes to minimize the number of spans committed to EditText, as a mitigation for platform issues on Samsung devices. See this [GitHub thread]( facebook#35936 (comment)) for greater context on the platform behavior.

This change generalizes `stripAttributeEquivalentSpans()` to allow plugging in different spans.

Changelog:
[Internal]

Reviewed By: rshest

Differential Revision: D44240781

fbshipit-source-id: 89005266020f216368e9ad9ce382699bd8db85a8

# Conflicts:
#	ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java

* Minimize EditText Spans 3/9: ReactBackgroundColorSpan (facebook#36547)

Summary:
Pull Request resolved: facebook#36547

This is part of a series of changes to minimize the number of spans committed to EditText, as a mitigation for platform issues on Samsung devices. See this [GitHub thread]( facebook#35936 (comment)) for greater context on the platform behavior.

This adds `ReactBackgroundColorSpan` to the list of spans eligible to be stripped.

Changelog:
[Android][Fixed] - Minimize Spans 3/N: ReactBackgroundColorSpan

Reviewed By: javache

Differential Revision: D44240782

fbshipit-source-id: 2ded1a1687a41cf6d5f83e89ffadd2d932089969

* Minimize EditText Spans 4/9: ReactForegroundColorSpan (facebook#36545)

Summary:
Pull Request resolved: facebook#36545

This is part of a series of changes to minimize the number of spans committed to EditText, as a mitigation for platform issues on Samsung devices. See this [GitHub thread]( facebook#35936 (comment)) for greater context on the platform behavior.

This adds ReactForegroundColorSpan to the list of spans eligible to be stripped.

Changelog:
[Android][Fixed] - Minimize Spans 4/N: ReactForegroundColorSpan

Reviewed By: javache

Differential Revision: D44240780

fbshipit-source-id: d86939cc2d7ed9116a4167026c7d48928fc51757

* Minimize EditText Spans 5/9: Strikethrough and Underline (facebook#36544)

Summary:
Pull Request resolved: facebook#36544

This is part of a series of changes to minimize the number of spans committed to EditText, as a mitigation for platform issues on Samsung devices. See this [GitHub thread]( facebook#35936 (comment)) for greater context on the platform behavior.

This change makes us apply strikethrough and underline as paint flags to the underlying EditText, instead of just the spans. We then opt ReactUnderlineSpan and ReactStrikethroughSpan into being strippable.

This does actually create visual behavior changes, where child text will inherit any underline or strikethrough of the root EditText (including if the child specifies `textDecorationLine: "none"`. The new behavior is consistent with both iOS and web though, so it seems like more of a bugfix than a regression.

Changelog:
[Android][Fixed] - Minimize Spans 5/N: Strikethrough and Underline

Reviewed By: rshest

Differential Revision: D44240778

fbshipit-source-id: d564dfc0121057a5e3b09bb71b8f5662e28be17e

* Minimize EditText Spans 6/9: letterSpacing (facebook#36548)

Summary:
Pull Request resolved: facebook#36548

This is part of a series of changes to minimize the number of spans committed to EditText, as a mitigation for platform issues on Samsung devices. See this [GitHub thread]( facebook#35936 (comment)) for greater context on the platform behavior.

This change lets us set `letterSpacing` on the EditText instead of using our custom span.

Changelog:
[Android][Fixed] - Minimize EditText Spans 6/N: letterSpacing

Reviewed By: rshest

Differential Revision: D44240777

fbshipit-source-id: 9bd10c3261257037d8cacf37971011aaa94d1a77

* Minimize EditText Spans 7/9: Avoid temp list (facebook#36576)

Summary:
Pull Request resolved: facebook#36576

This is part of a series of changes to minimize the number of spans committed to EditText, as a mitigation for platform issues on Samsung devices. See this [GitHub thread]( facebook#35936 (comment)) for greater context on the platform behavior.

This change addresses some minor CR feedback and removes the temporary list of spans in favor of applying them directly.

Changelog:
[Internal]

Reviewed By: javache

Differential Revision: D44295190

fbshipit-source-id: bd784e2c514301d45d0bacd8ee6de5c512fc565c

* Minimize EditText Spans 8/9: CustomStyleSpan (facebook#36577)

Summary:
Pull Request resolved: facebook#36577

This is part of a series of changes to minimize the number of spans committed to EditText, as a mitigation for platform issues on Samsung devices. See this [GitHub thread]( facebook#35936 (comment)) for greater context on the platform behavior.

This change allows us to strip CustomStyleSpan. We already set all but `fontVariant` on the underlying EditText, so we just need to route that through as well.

Note that because this span is non-parcelable, it is seemingly not subject to the buggy behavior on Samsung devices of infinitely cloning the spans, but non-parcelable spans have different issues on the devices (they disappear), so moving `fontVariant` to the top-level makes sense here.

Changelog:
[Android][Fixed] - Minimize EditText Spans 8/N: CustomStyleSpan

Reviewed By: javache

Differential Revision: D44297384

fbshipit-source-id: ed4c000e961dd456a2a8f4397e27c23a87defb6e

* Mimimize EditText Spans 9/9: Remove addSpansForMeasurement() (facebook#36575)

Summary:
Pull Request resolved: facebook#36575

This is part of a series of changes to minimize the number of spans committed to EditText, as a mitigation for platform issues on Samsung devices. See this [GitHub thread]( facebook#35936 (comment)) for greater context on the platform behavior.

D23670779 addedd a previous mechanism to add spans for measurement caching, like we needed to do as part of this change. It is called in more specific cases (e.g. when there is a text hint but no text), but it edits the live EditText spannable instead of the cache copy, and does not handle nested text at all.

We are already adding spans back to the input after this, behind everything else, and can replace it with the code we have been adding.

Changelog:
[Android][Fixed] - Mimimize EditText Spans 9/9: Remove `addSpansForMeasurement()`

Reviewed By: javache

Differential Revision: D44298159

fbshipit-source-id: 1af44a39de7550b7e66e45db9ebc3523ae9ff002

# Conflicts:
#	ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java

* Use RN Build Utils for Building Hermes Artifacts

Summary:
We moved Hermes some build utils from [Hermes repo](https://github.com/facebook/hermes/tree/main/utils) to [React Navtie repo](https://github.com/facebook/react-native/tree/main/sdks/hermes-engine/utils) a while ago to have more control over them. However some paths on the CI were not updated. We continued to use old build scripts for Hermes prebuilds. Some unfortunate side effects are:
- `HERMES_ENABLE_DEBUGGER` is [hardcoded to true](https://github.com/facebook/hermes/blob/main/utils/build-apple-framework.sh#L65). That makes Hermes much slower in Release configuration.
- BUILD_TYPE is [set to Release](https://github.com/facebook/hermes/blob/main/utils/build-apple-framework.sh#L10) instead of `MinSizeRel` which inreases Hermes binary size.

This diff copies these build utils from RN to Hermes source directory before we perform Hermes build.

Changelog
[Internal]

Reviewed By: cipolleschi

Differential Revision: D44066721

fbshipit-source-id: f45ad6a31fb01c10199f69cc7bbcbbc83b793d34

* Fix TextView alignment being reset on state updates

Summary: Changelog: [Android][Fixed] Resolved bug with Text components in new arch losing text alignment state.

Reviewed By: mdvacca

Differential Revision: D34108943

fbshipit-source-id: 3992e9406345be919b5e3595fc1f9e61cf67a699

# Conflicts:
#	ReactAndroid/src/main/java/com/facebook/react/views/text/TextAttributeProps.java
#	ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java

* [0.71.7] Bump version numbers

* Do not send extra onChangeText even wnen instantianting multiline TextView (facebook#36930)

Summary:
Pull Request resolved: facebook#36930

This diff fixes facebook#36494

Now this code matches its [Fabric counterpart](facebook@7b48899).

There is also one extra check that `_lastStringStateWasUpdatedWith != nil`. With that in place we don't send extra `onChangeText` event when `attributedText` is assigned for the first time on TextView construction.

Changelog: [IOS][Fixed] - Do not send extra onChangeText even wnen instantianting multiline TextView

Reviewed By: sammy-SC

Differential Revision: D45049135

fbshipit-source-id: 62fa281308b9d2e0a807d024f08d8a214bd99b5e

* Read Maven group from GROUP property (facebook#37204)

Summary:
The [React Native TV repo](https://github.com/react-native-tvos/react-native-tvos) shares most of the same Android code as the core repo. Beginning in 0.71, it needs to also publish Android Maven artifacts for the `react-android` and `hermes-android` libraries.

In order to avoid conflicts, it needs to publish the artifacts to a different group name. However, `react-native-gradle-plugin` uses a hardcoded group name (`com.facebook.react`).

Solution: read the group name from the existing `GROUP` property in `ReactAndroid/gradle.properties`.

## Changelog:

[Android] [Fixed] - read GROUP name in gradle-plugin dependency code

Pull Request resolved: facebook#37204

Test Plan:
- Android unit tests have been added for the new code and new method in `DependencyUtils.kt`.
- Existing tests should pass
- The new code defaults to the correct group (`com.facebook.react`) so no functional change is expected in the core repo.

Reviewed By: luluwu2032

Differential Revision: D45576700

Pulled By: cortinico

fbshipit-source-id: 6297ab515b4bdbb17024989c7d3035b0a2ded0ae

# Conflicts:
#	packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt

* bumped packages versions

#publish-packages-to-npm

* [LOCAL] bump RNGP to 0.71.18

* [LOCAL] update podlock

* [0.71.8] Bump version numbers

* fix(types): cross platform autoComplete for TextInput (facebook#36931)

Summary:
Since v0.71 the autoComplete prop on TextInput is available on iOS ([release notes](https://reactnative.dev/blog/2023/01/12/version-071#component-specific-behavior)). However, this change is not reflected in the types.

Original types PR here - DefinitelyTyped/DefinitelyTyped#65144 by chwallen

## Changelog:

[GENERAL] [FIXED] - Fix autoComplete type for TextInput

Pull Request resolved: facebook#36931

Test Plan: Setting the autoComplete prop on TextInput to `nickname`, `organization`, `organization-title`, or `url` should not result in typescript errors.

Reviewed By: NickGerleman

Differential Revision: D45052350

Pulled By: javache

fbshipit-source-id: 40993833b4ed14f91e3bf3521a264ea93517a0c9

* Allow string `transform` style in TypeScript (facebook#37569)

Summary:
Pull Request resolved: facebook#37569

Fixes facebook#37543

Missed as part of D39423409 (or maybe we didn't have TS types inline yet?)

Changelog:
[General][Fixed] - Allow string `transform` style in TypeScript

Reviewed By: cortinico

Differential Revision: D46161450

fbshipit-source-id: 24ee9e19365b7209ec0a2c8fb5a5d7ac78203f4d

* fix: [gradle-plugin] 3rd party lib dependency substitution (facebook#37445)

Summary:
For 3rd party libraries to work with a React Native fork (such as the TV repo) that uses a different Maven group for `react-android` and `hermes-android` artifacts, an additional dependency substitution is required.

## Changelog:

[Android][fixed] RNGP dependency substitutions for fork with different Maven group

Pull Request resolved: facebook#37445

Test Plan:
- Manual tested with an existing project
- Unit tests pass

Reviewed By: rshest, dmytrorykun

Differential Revision: D45948901

Pulled By: cortinico

fbshipit-source-id: 4151a1d3616172a92c68812c3a0034c98b330d67

* fix: fix virtualizedList scrollToEnd for 0 items (facebook#36067)

Summary:
Fixes facebook#36066

## Changelog

[GENERAL] [FIXED] - VirtualizedList scrollToEnd with no data

Pull Request resolved: facebook#36067

Test Plan: Run `yarn test VirtualizedList-test`

Reviewed By: jacdebug

Differential Revision: D43041763

Pulled By: javache

fbshipit-source-id: d4d5e871284708a89bf9911d82e9aa97d7625aca

* [LOCAL] bump hermes version post release

* Make CircleCI caches for hermesc be version dependent (facebook#37452)

Summary:
Pull Request resolved: facebook#37452

Fixes facebook#37428

We do have cache poisoning for hermesc on Windows and Linux due to reusing the same cache key among different
React Native version. This fixes it by specifying a cache key which is version dependent + it invalidates the
caches by defining a new key.

Changelog:
[Internal] [Fixed] - Make CircleCI caches for hermesc be version dependent

Reviewed By: cortinico

Differential Revision: D45909178

fbshipit-source-id: 830c87ae45739c7053342a68dac2ee7581945c1d

* [0.71.9] Bump version numbers

* bumped packages versions

#publish-packages-to-npm

* bump RNGP to 0.71.19

* [0.71.10] Bump version numbers

* [LOCAL] update podlock to fix CI

* Revert "fix: border width top/bottom not matching the border radius (facebook#34362)"

This reverts commit cd6a913.

* Fix invalid context cast in ReactRootView (facebook#36121)

Summary:
Hi 👋

I'm one of the  Expo contributors. When upgrading the Stripe dependency in Expo for SDK48 release on Android, we noticed the following error:
```java.lang.ClassCastException: android.view.ContextThemeWrapper cannot be cast to android.app.Activity```

With Kudo we narrowed it down to an underlying issue in the following cast in `ReactRootView` done during checking for keyboard events:
```((Activity) getContext())```

The `getContext()` is actually a `ContextThemeWrapper` for `ExperienceActivity`, so we should not cast it to an `Activity` directly - instead, we unwrap it using `getBaseContext()`.

Implementing the following fix into the Expo fork fixed the crash for us:
expo@0e2c9ca

## Changelog

[ANDROID] [FIXED] - Fixed crash occurring in certain native views when handling keyboard events.

<!-- Help reviewers and the release process by writing your own changelog entry.

Pick one each for the category and type tags:

[ANDROID|GENERAL|IOS|INTERNAL] [BREAKING|ADDED|CHANGED|DEPRECATED|REMOVED|FIXED|SECURITY] - Message

For more details, see:
https://reactnative.dev/contributing/changelogs-in-pull-requests
-->

Pull Request resolved: facebook#36121

Test Plan:
Tested manually by comparing two builds before and after this change. The main branch build crashes when the [Stripe 0.23.1](https://github.com/stripe/stripe-react-native) Card Element from the example app is mounted on screen. Applying the change fixed the issue.

Happy to make a more isolated reproduction if necessary.

 ---
Full stack trace:
```
         AndroidRuntime  D  Shutting down VM
                         E  FATAL EXCEPTION: main
                         E  Process: host.exp.exponent, PID: 8849
                         E  java.lang.ClassCastException: android.view.ContextThemeWrapper cannot be cast to android.app.Activity
                         E      at com.facebook.react.ReactRootView$CustomGlobalLayoutListener.checkForKeyboardEvents(ReactRootView.java:937)
                         E      at com.facebook.react.ReactRootView$CustomGlobalLayoutListener.onGlobalLayout(ReactRootView.java:913)
                         E      at android.view.ViewTreeObserver.dispatchOnGlobalLayout(ViewTreeObserver.java:1061)
                         E      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3352)
                         E      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2286)
                         E      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8948)
                         E      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1231)
                         E      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1239)
                         E      at android.view.Choreographer.doCallbacks(Choreographer.java:899)
                         E      at android.view.Choreographer.doFrame(Choreographer.java:832)
                         E      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1214)
                         E      at android.os.Handler.handleCallback(Handler.java:942)
                         E      at android.os.Handler.dispatchMessage(Handler.java:99)
                         E      at android.os.Looper.loopOnce(Looper.java:201)
                         E      at android.os.Looper.loop(Looper.java:288)
                         E      at android.app.ActivityThread.main(ActivityThread.java:7898)
                         E      at java.lang.reflect.Method.invoke(Native Method)
                         E      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
                         E      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
```

Reviewed By: cortinico

Differential Revision: D43186530

Pulled By: javache

fbshipit-source-id: 2143495f6b0c71f342eba6d5abb2bfa4a529fbdd

* Prevent crash in runAnimationStep on OnePlus and Oppo devices (facebook#37487)

Summary:
We've been encountering a crash in `runAnimationStep` with "Calculated frame index should never be lower than 0" facebook#35766 with OnePlus/Oppo devices as well, but don't have one on hand to test.

This just works around the issue: if the time is before the start time of an animation, we shouldn't do anything anyways, so we just log a message instead of throwing while in production. We still throw in debug mode though for easier debugging.

### Hypothesis of the root cause

Based on stacktrace in facebook#35766 (which is the same one we see)

Normally, this should happen

1. Choreographer.java constructs a FrameDisplayEventReceiver
2. FrameDisplayEventReceiver.onVSync gets called, which sets the `mTimestampNanos`
3. FrameDisplayEventReceiver.run gets called, which then eventually calls our `doFrame` callback with `mTimestampNanos`. This then causes `FrameBasedAnimationDriver.runAnimationStep` to be called with the same timestamp

I suspect what's happening on OnePlus devices is that the `onVSync` call either doesn't happen or happens rarely enough that the `mTimestampNanos` when `run` is called is sometime in the past

### Fix

1. Add logging so we get the parameters to debug more if we end up getting this error
2. In production, just ignore past times instead of throwing an Error

## Changelog:

Pick one each for the category and type tags:

[ANDROID] [FIXED] - Prevent crash on OnePlus/Oppo devices in runAnimationStep

Pull Request resolved: facebook#37487

Test Plan: Ran our app using patched version and verified no issues showed up when using it

Reviewed By: cipolleschi

Differential Revision: D46102968

Pulled By: cortinico

fbshipit-source-id: bcb36a0c2aed0afdb8e7e68b141a3db4eb02695a

* Use `Content-Location` header in bundle response as JS source URL (facebook#37501)

Summary:
Pull Request resolved: facebook#37501

This is the iOS side of the fix for facebook#36794.

That issue aside for the moment, the high-level idea here is to conceptually separate the bundle *request URL*, which represents a request for the *latest* bundle, from the *source URL* passed to JS engines, which should represent the code actually being executed. In future, we'd like to use this to refer to a point-in-time snapshot of the bundle, so that stack traces more often refer to the code that was actually run, even if it's since been updated on disk (actually implementing this isn't planned at the moment, but it helps describe the distinction).

Short term, this separation gives us a way to address the issue with JSC on iOS 16.4 by allowing Metro to provide the client with a [JSC-safe URL](react-native-community/discussions-and-proposals#646) to pass to the JS engine, even where the request URL isn't JSC-safe.

We'll deliver that URL to the client on HTTP bundle requests via the [`Content-Location`](https://www.rfc-editor.org/rfc/rfc9110#name-content-location) header, which is a published standard for communicating a location for the content provided in a successful response (typically used to provide a direct URL to an asset after content negotiation, but I think it fits here too).

For the long-term goal we should follow up with the same functionality on Android and out-of-tree platforms, but it's non-essential for anything other than iOS 16.4 at the moment.

For the issue fix to work end-to-end we'll also need to update Metro, but the two pieces are decoupled and non-breaking so it doesn't matter which lands first.

Changelog:
[iOS][Changed] Prefer `Content-Location` header in bundle response as JS source URL

Reviewed By: huntie

Differential Revision: D45950661

fbshipit-source-id: 170fcd63a098f81bdcba55ebde0cf3569dceb88d

* [LOCAL] Make 0.70 compatible with Xcode 15 (thanks to @AlexanderEggers for the commit in main)

* [LOCAL] Bump CLI to 10.2.4 and Metro to 0.73.10

* Add web compat unit tests and fixes (facebook#35316)

Summary:
Adds compat with W3C logical CSS properties. See facebook#34425

This is a replacement for reverted facebook#34590, which can no longer be imported internally.

[General][Added] - Added CSS logical properties.

Pull Request resolved: facebook#35316

Test Plan: Unit test snapshots.

Reviewed By: NickGerleman

Differential Revision: D41230978

Pulled By: necolas

fbshipit-source-id: 40e93d0d697f0cb28390480ce2b4bcbce18da70a

* resolve some merge conflicts

* fix tests

* [0.71.11] Bump version numbers

* [LOCAL] update podlock for CI

* fix(ios): fix `pod install --project-directory=ios` failing (facebook#37993)

* Prevent LogBox from crashing on long messages (facebook#38005)

Summary:
Pull Request resolved: facebook#38005

Fixes facebook#32093 by guarding the expensive `BABEL_CODE_FRAME_ERROR_FORMAT` regex with a cheaper initial scan. (Longer term, we should reduce our reliance on string parsing and propagate more structured errors.)

Changelog: [General][Fixed] Prevent LogBox from crashing on very long messages

Reviewed By: GijsWeterings

Differential Revision: D46892454

fbshipit-source-id: 3afadcdd75969c2589bbb06f47d1c4c1c2690abd

# Conflicts:
#	Libraries/LogBox/Data/parseLogBoxLog.js
#	packages/react-native/package.json

* [0.71.12] Bump version numbers

---------

Co-authored-by: Lorenzo Sciandra <lsciandra@microsoft.com>
Co-authored-by: Nick Gerleman <ngerlem@meta.com>
Co-authored-by: Lorenzo Sciandra <notkelset@kelset.dev>
Co-authored-by: Dmitry Rykun <dmitryrykun@meta.com>
Co-authored-by: Pieter De Baets <pieterdb@meta.com>
Co-authored-by: Distiller <distiller@static.38.39.184.131.cyberlynk.net>
Co-authored-by: Douglas Lowder <douglowder@mac.com>
Co-authored-by: Distiller <distiller@static.38.39.183.111.cyberlynk.net>
Co-authored-by: Kyle Roach <kroach.work@gmail.com>
Co-authored-by: Julien Brayere <julien.brayere@obitrain.com>
Co-authored-by: Riccardo Cipolleschi <cipolleschi@meta.com>
Co-authored-by: Distiller <distiller@static.38.39.184.95.cyberlynk.net>
Co-authored-by: Distiller <distiller@static.38.23.39.177.cyberlynk.net>
Co-authored-by: aleqsio <amikucki@scratch.fi>
Co-authored-by: Harry Yu <harry@wanderlog.com>
Co-authored-by: Rob Hogan <robhogan@meta.com>
Co-authored-by: Nicolas Gallagher <necolas@fb.com>
Co-authored-by: Alexander Eggers <alex.eggers@myzeller.com>
Co-authored-by: Distiller <distiller@static.38.23.38.34.cyberlynk.net>
Co-authored-by: Tommy Nguyen <4123478+tido64@users.noreply.github.com>
Co-authored-by: Moti Zilberman <moti@meta.com>
Co-authored-by: Distiller <distiller@static.38.39.185.107.cyberlynk.net>
kelset pushed a commit that referenced this issue Jul 10, 2023
… multiline=true on iOS (#37958)

Summary:
This fix fixes the TextInput issue in #37784 with onChangeText not working on iOS only.

## Changelog:

<!-- Help reviewers and the release process by writing your own changelog entry.

Pick one each for the category and type tags:

[ANDROID|GENERAL|IOS|INTERNAL] [BREAKING|ADDED|CHANGED|DEPRECATED|REMOVED|FIXED|SECURITY] - Message

For more details, see:
https://reactnative.dev/contributing/changelogs-in-pull-requests
-->

[IOS] [FIXED] - Fix onChangeText not firing when clearing the value of TextInput with multiline=true on iOS

Pull Request resolved: #37958

Test Plan:
1. Run the repro code given in the issue (#37784).
2. Verified that onChangeText works after pressing the submit button.
3. Run the repro code from the issue (#36494) that caused this issue.
4. Verified that issue (#36494) is not reoccurring.

Reviewed By: rshest

Differential Revision: D47185775

Pulled By: dmytrorykun

fbshipit-source-id: 1a1a6534d6bf8b5bb8cf1090734dd894bab43f82
Kudo pushed a commit to expo/react-native that referenced this issue Jul 11, 2023
… multiline=true on iOS (facebook#37958)

Summary:
This fix fixes the TextInput issue in facebook#37784 with onChangeText not working on iOS only.

## Changelog:

<!-- Help reviewers and the release process by writing your own changelog entry.

Pick one each for the category and type tags:

[ANDROID|GENERAL|IOS|INTERNAL] [BREAKING|ADDED|CHANGED|DEPRECATED|REMOVED|FIXED|SECURITY] - Message

For more details, see:
https://reactnative.dev/contributing/changelogs-in-pull-requests
-->

[IOS] [FIXED] - Fix onChangeText not firing when clearing the value of TextInput with multiline=true on iOS

Pull Request resolved: facebook#37958

Test Plan:
1. Run the repro code given in the issue (facebook#37784).
2. Verified that onChangeText works after pressing the submit button.
3. Run the repro code from the issue (facebook#36494) that caused this issue.
4. Verified that issue (facebook#36494) is not reoccurring.

Reviewed By: rshest

Differential Revision: D47185775

Pulled By: dmytrorykun

fbshipit-source-id: 1a1a6534d6bf8b5bb8cf1090734dd894bab43f82
@ataravati
Copy link

Has this already been released? I can still see the issue on Expo 48, React Native 0.71.8.

@ataravati
Copy link

Has this already been released? I can still see the issue on Expo 48, React Native 0.71.8.

Never mind! I just saw that it is listed as one of the changes in React Native 0.72:

https://github.com/facebook/react-native/blob/main/CHANGELOG.md#ios-specific-9

@alexkhazzam
Copy link

just encountered this problem yesterday. Took me a while to figure out what was going on. A simple but dirty solution is to use the useRef hook. Set the initial hook to 0. in the onChangeText method, check to see if the useRef value is 0; if it is, do not execute the callback, otherwise execute the callback. From then on, keep incrementing the useRef value. This will persist across state changes

@tarikfp
Copy link

tarikfp commented Aug 12, 2023

Experiencing this issue in react-native@0.72.3. It is related to the multilineprop itself rather than maxLength. When text input has multiline set to true, onChangeText callback invokes itself on the next batch/render. When you set multiline to false, the bug disappears, meaning onChangeText triggers only when we are actually setting the value.

Created basic snack example below, expo version 48, rn version 0.71.x:

https://snack.expo.dev/@tarikfp/textinput-onchangetext-bug-multiline

@zcdev02
Copy link

zcdev02 commented Aug 15, 2023

I confirm the issue. Indeed, when using multiline, OnChangeText starts to fire a large number of times. Disabling this setting resolves the issue. 0.72.3 react. this happens in a modal window on ios

@douglasjunior
Copy link

douglasjunior commented Aug 15, 2023

Experiencing this issue in react-native@0.72.3. It is related to the multilineprop itself rather than maxLength. When text input has multiline set to true, onChangeText callback invokes itself on the next batch/render. When you set multiline to false, the bug disappears, meaning onChangeText triggers only when we are actually setting the value.

Created basic snack example below:

https://snack.expo.dev/@tarikfp/textinput-onchangetext-bug-multiline

Snack uses Expo 48 which should use RN 0.71.7 or something like that, not 0.72.

What I have experienced here in my tests is when multiline=true applying masks to the value:

In all the cases, the onChangeText works fine when you don't change value programmatically, but if you do:

version description
<= 0.71.7 ⚠️ Changing value call onChangeText, then if you change value again the onChangeText will be called once more, creating an infinity loop. If you don't change value on every onChangeText, then will be fine.
>= 0.71.8 && <= 0.71.12 🚨 changing value call onChangeText, then if you change value again the onChangeText will not be called, but if you type some new char the onChangeText will not be fired in the first time.
>= 0.72.0 ⚠️ Same as RN <= 0.71.7

Something curious that I would like to comment is that since I started working with RN in 2016 we have some kind of problem with multiline inputs, it seems to be a chronic problem with this component.

fortmarek pushed a commit that referenced this issue Aug 17, 2023
… multiline=true on iOS (#37958)

Summary:
This fix fixes the TextInput issue in #37784 with onChangeText not working on iOS only.

## Changelog:

<!-- Help reviewers and the release process by writing your own changelog entry.

Pick one each for the category and type tags:

[ANDROID|GENERAL|IOS|INTERNAL] [BREAKING|ADDED|CHANGED|DEPRECATED|REMOVED|FIXED|SECURITY] - Message

For more details, see:
https://reactnative.dev/contributing/changelogs-in-pull-requests
-->

[IOS] [FIXED] - Fix onChangeText not firing when clearing the value of TextInput with multiline=true on iOS

Pull Request resolved: #37958

Test Plan:
1. Run the repro code given in the issue (#37784).
2. Verified that onChangeText works after pressing the submit button.
3. Run the repro code from the issue (#36494) that caused this issue.
4. Verified that issue (#36494) is not reoccurring.

Reviewed By: rshest

Differential Revision: D47185775

Pulled By: dmytrorykun

fbshipit-source-id: 1a1a6534d6bf8b5bb8cf1090734dd894bab43f82
@nicolasdevienne
Copy link

I confirm the issue. Indeed, when using multiline, OnChangeText starts to fire a large number of times. Disabling this setting resolves the issue. 0.72.3 react. this happens in a modal window on ios

same with version 0.72.4

Saadnajmi added a commit to microsoft/react-native-macos that referenced this issue Aug 23, 2023
* [LOCAL] update podlock post release to fix CI

* Fix measurement of uncontrolled TextInput after edit

Summary:
D42721684 (facebook@be69c8b) left a pretty bad bug when using Fabric for Android. I missed that in Fabric specifically, on edit we will cache the Spannable backing the EditText for use in future measurement.

Because we've stripped the sizing spans, Spannable measurement has incorrect font size, and the TextInput size will change (collapsing) after the first edit. This effectively breaks any uncontrolled TextInput which does not have explicit dimensions set.

Changelog:
[Android][Fixed] - Fix measurement of uncontrolled TextInput after edit

Reviewed By: sammy-SC

Differential Revision: D43158407

fbshipit-source-id: 51602eab06c9a50e2b60ef0ed87bdb4df025e51e

* Minimize EditText Spans 1/9: Fix precedence (facebook#36543)

Summary:
Pull Request resolved: facebook#36543

This is part of a series of changes to minimize the number of spans committed to EditText, as a mitigation for platform issues on Samsung devices. See this [GitHub thread]( facebook#35936 (comment)) for greater context on the platform behavior.

We cache the backing EditText span on text change to later measure. To measure outside of a TextInput we need to restore any spans we removed. Spans may overlap, so base attributes should be behind everything else.

The logic here for dealing with precedence is incorrect, and we should instead accomplish this by twiddling with the `SPAN_PRIORITY` bits.

Changelog:
[Android][Fixed] - Minimize Spans 1/N: Fix precedence

Reviewed By: javache

Differential Revision: D44240779

fbshipit-source-id: f731b353587888faad946b8cf1e868095cdeced3

* Minimize EditText Spans 2/9: Make stripAttributeEquivalentSpans generic (facebook#36546)

Summary:
Pull Request resolved: facebook#36546

This is part of a series of changes to minimize the number of spans committed to EditText, as a mitigation for platform issues on Samsung devices. See this [GitHub thread]( facebook#35936 (comment)) for greater context on the platform behavior.

This change generalizes `stripAttributeEquivalentSpans()` to allow plugging in different spans.

Changelog:
[Internal]

Reviewed By: rshest

Differential Revision: D44240781

fbshipit-source-id: 89005266020f216368e9ad9ce382699bd8db85a8

# Conflicts:
#	ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java

* Minimize EditText Spans 3/9: ReactBackgroundColorSpan (facebook#36547)

Summary:
Pull Request resolved: facebook#36547

This is part of a series of changes to minimize the number of spans committed to EditText, as a mitigation for platform issues on Samsung devices. See this [GitHub thread]( facebook#35936 (comment)) for greater context on the platform behavior.

This adds `ReactBackgroundColorSpan` to the list of spans eligible to be stripped.

Changelog:
[Android][Fixed] - Minimize Spans 3/N: ReactBackgroundColorSpan

Reviewed By: javache

Differential Revision: D44240782

fbshipit-source-id: 2ded1a1687a41cf6d5f83e89ffadd2d932089969

* Minimize EditText Spans 4/9: ReactForegroundColorSpan (facebook#36545)

Summary:
Pull Request resolved: facebook#36545

This is part of a series of changes to minimize the number of spans committed to EditText, as a mitigation for platform issues on Samsung devices. See this [GitHub thread]( facebook#35936 (comment)) for greater context on the platform behavior.

This adds ReactForegroundColorSpan to the list of spans eligible to be stripped.

Changelog:
[Android][Fixed] - Minimize Spans 4/N: ReactForegroundColorSpan

Reviewed By: javache

Differential Revision: D44240780

fbshipit-source-id: d86939cc2d7ed9116a4167026c7d48928fc51757

* Minimize EditText Spans 5/9: Strikethrough and Underline (facebook#36544)

Summary:
Pull Request resolved: facebook#36544

This is part of a series of changes to minimize the number of spans committed to EditText, as a mitigation for platform issues on Samsung devices. See this [GitHub thread]( facebook#35936 (comment)) for greater context on the platform behavior.

This change makes us apply strikethrough and underline as paint flags to the underlying EditText, instead of just the spans. We then opt ReactUnderlineSpan and ReactStrikethroughSpan into being strippable.

This does actually create visual behavior changes, where child text will inherit any underline or strikethrough of the root EditText (including if the child specifies `textDecorationLine: "none"`. The new behavior is consistent with both iOS and web though, so it seems like more of a bugfix than a regression.

Changelog:
[Android][Fixed] - Minimize Spans 5/N: Strikethrough and Underline

Reviewed By: rshest

Differential Revision: D44240778

fbshipit-source-id: d564dfc0121057a5e3b09bb71b8f5662e28be17e

* Minimize EditText Spans 6/9: letterSpacing (facebook#36548)

Summary:
Pull Request resolved: facebook#36548

This is part of a series of changes to minimize the number of spans committed to EditText, as a mitigation for platform issues on Samsung devices. See this [GitHub thread]( facebook#35936 (comment)) for greater context on the platform behavior.

This change lets us set `letterSpacing` on the EditText instead of using our custom span.

Changelog:
[Android][Fixed] - Minimize EditText Spans 6/N: letterSpacing

Reviewed By: rshest

Differential Revision: D44240777

fbshipit-source-id: 9bd10c3261257037d8cacf37971011aaa94d1a77

* Minimize EditText Spans 7/9: Avoid temp list (facebook#36576)

Summary:
Pull Request resolved: facebook#36576

This is part of a series of changes to minimize the number of spans committed to EditText, as a mitigation for platform issues on Samsung devices. See this [GitHub thread]( facebook#35936 (comment)) for greater context on the platform behavior.

This change addresses some minor CR feedback and removes the temporary list of spans in favor of applying them directly.

Changelog:
[Internal]

Reviewed By: javache

Differential Revision: D44295190

fbshipit-source-id: bd784e2c514301d45d0bacd8ee6de5c512fc565c

* Minimize EditText Spans 8/9: CustomStyleSpan (facebook#36577)

Summary:
Pull Request resolved: facebook#36577

This is part of a series of changes to minimize the number of spans committed to EditText, as a mitigation for platform issues on Samsung devices. See this [GitHub thread]( facebook#35936 (comment)) for greater context on the platform behavior.

This change allows us to strip CustomStyleSpan. We already set all but `fontVariant` on the underlying EditText, so we just need to route that through as well.

Note that because this span is non-parcelable, it is seemingly not subject to the buggy behavior on Samsung devices of infinitely cloning the spans, but non-parcelable spans have different issues on the devices (they disappear), so moving `fontVariant` to the top-level makes sense here.

Changelog:
[Android][Fixed] - Minimize EditText Spans 8/N: CustomStyleSpan

Reviewed By: javache

Differential Revision: D44297384

fbshipit-source-id: ed4c000e961dd456a2a8f4397e27c23a87defb6e

* Mimimize EditText Spans 9/9: Remove addSpansForMeasurement() (facebook#36575)

Summary:
Pull Request resolved: facebook#36575

This is part of a series of changes to minimize the number of spans committed to EditText, as a mitigation for platform issues on Samsung devices. See this [GitHub thread]( facebook#35936 (comment)) for greater context on the platform behavior.

D23670779 addedd a previous mechanism to add spans for measurement caching, like we needed to do as part of this change. It is called in more specific cases (e.g. when there is a text hint but no text), but it edits the live EditText spannable instead of the cache copy, and does not handle nested text at all.

We are already adding spans back to the input after this, behind everything else, and can replace it with the code we have been adding.

Changelog:
[Android][Fixed] - Mimimize EditText Spans 9/9: Remove `addSpansForMeasurement()`

Reviewed By: javache

Differential Revision: D44298159

fbshipit-source-id: 1af44a39de7550b7e66e45db9ebc3523ae9ff002

# Conflicts:
#	ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java

* Use RN Build Utils for Building Hermes Artifacts

Summary:
We moved Hermes some build utils from [Hermes repo](https://github.com/facebook/hermes/tree/main/utils) to [React Navtie repo](https://github.com/facebook/react-native/tree/main/sdks/hermes-engine/utils) a while ago to have more control over them. However some paths on the CI were not updated. We continued to use old build scripts for Hermes prebuilds. Some unfortunate side effects are:
- `HERMES_ENABLE_DEBUGGER` is [hardcoded to true](https://github.com/facebook/hermes/blob/main/utils/build-apple-framework.sh#L65). That makes Hermes much slower in Release configuration.
- BUILD_TYPE is [set to Release](https://github.com/facebook/hermes/blob/main/utils/build-apple-framework.sh#L10) instead of `MinSizeRel` which inreases Hermes binary size.

This diff copies these build utils from RN to Hermes source directory before we perform Hermes build.

Changelog
[Internal]

Reviewed By: cipolleschi

Differential Revision: D44066721

fbshipit-source-id: f45ad6a31fb01c10199f69cc7bbcbbc83b793d34

* Fix TextView alignment being reset on state updates

Summary: Changelog: [Android][Fixed] Resolved bug with Text components in new arch losing text alignment state.

Reviewed By: mdvacca

Differential Revision: D34108943

fbshipit-source-id: 3992e9406345be919b5e3595fc1f9e61cf67a699

# Conflicts:
#	ReactAndroid/src/main/java/com/facebook/react/views/text/TextAttributeProps.java
#	ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java

* [0.71.7] Bump version numbers

* Do not send extra onChangeText even wnen instantianting multiline TextView (facebook#36930)

Summary:
Pull Request resolved: facebook#36930

This diff fixes facebook#36494

Now this code matches its [Fabric counterpart](facebook@7b48899).

There is also one extra check that `_lastStringStateWasUpdatedWith != nil`. With that in place we don't send extra `onChangeText` event when `attributedText` is assigned for the first time on TextView construction.

Changelog: [IOS][Fixed] - Do not send extra onChangeText even wnen instantianting multiline TextView

Reviewed By: sammy-SC

Differential Revision: D45049135

fbshipit-source-id: 62fa281308b9d2e0a807d024f08d8a214bd99b5e

* Read Maven group from GROUP property (facebook#37204)

Summary:
The [React Native TV repo](https://github.com/react-native-tvos/react-native-tvos) shares most of the same Android code as the core repo. Beginning in 0.71, it needs to also publish Android Maven artifacts for the `react-android` and `hermes-android` libraries.

In order to avoid conflicts, it needs to publish the artifacts to a different group name. However, `react-native-gradle-plugin` uses a hardcoded group name (`com.facebook.react`).

Solution: read the group name from the existing `GROUP` property in `ReactAndroid/gradle.properties`.

## Changelog:

[Android] [Fixed] - read GROUP name in gradle-plugin dependency code

Pull Request resolved: facebook#37204

Test Plan:
- Android unit tests have been added for the new code and new method in `DependencyUtils.kt`.
- Existing tests should pass
- The new code defaults to the correct group (`com.facebook.react`) so no functional change is expected in the core repo.

Reviewed By: luluwu2032

Differential Revision: D45576700

Pulled By: cortinico

fbshipit-source-id: 6297ab515b4bdbb17024989c7d3035b0a2ded0ae

# Conflicts:
#	packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt

* bumped packages versions

#publish-packages-to-npm

* [LOCAL] bump RNGP to 0.71.18

* [LOCAL] update podlock

* [0.71.8] Bump version numbers

* fix(types): cross platform autoComplete for TextInput (facebook#36931)

Summary:
Since v0.71 the autoComplete prop on TextInput is available on iOS ([release notes](https://reactnative.dev/blog/2023/01/12/version-071#component-specific-behavior)). However, this change is not reflected in the types.

Original types PR here - DefinitelyTyped/DefinitelyTyped#65144 by chwallen

## Changelog:

[GENERAL] [FIXED] - Fix autoComplete type for TextInput

Pull Request resolved: facebook#36931

Test Plan: Setting the autoComplete prop on TextInput to `nickname`, `organization`, `organization-title`, or `url` should not result in typescript errors.

Reviewed By: NickGerleman

Differential Revision: D45052350

Pulled By: javache

fbshipit-source-id: 40993833b4ed14f91e3bf3521a264ea93517a0c9

* Allow string `transform` style in TypeScript (facebook#37569)

Summary:
Pull Request resolved: facebook#37569

Fixes facebook#37543

Missed as part of D39423409 (or maybe we didn't have TS types inline yet?)

Changelog:
[General][Fixed] - Allow string `transform` style in TypeScript

Reviewed By: cortinico

Differential Revision: D46161450

fbshipit-source-id: 24ee9e19365b7209ec0a2c8fb5a5d7ac78203f4d

* fix: [gradle-plugin] 3rd party lib dependency substitution (facebook#37445)

Summary:
For 3rd party libraries to work with a React Native fork (such as the TV repo) that uses a different Maven group for `react-android` and `hermes-android` artifacts, an additional dependency substitution is required.

## Changelog:

[Android][fixed] RNGP dependency substitutions for fork with different Maven group

Pull Request resolved: facebook#37445

Test Plan:
- Manual tested with an existing project
- Unit tests pass

Reviewed By: rshest, dmytrorykun

Differential Revision: D45948901

Pulled By: cortinico

fbshipit-source-id: 4151a1d3616172a92c68812c3a0034c98b330d67

* fix: fix virtualizedList scrollToEnd for 0 items (facebook#36067)

Summary:
Fixes facebook#36066

## Changelog

[GENERAL] [FIXED] - VirtualizedList scrollToEnd with no data

Pull Request resolved: facebook#36067

Test Plan: Run `yarn test VirtualizedList-test`

Reviewed By: jacdebug

Differential Revision: D43041763

Pulled By: javache

fbshipit-source-id: d4d5e871284708a89bf9911d82e9aa97d7625aca

* [LOCAL] bump hermes version post release

* Make CircleCI caches for hermesc be version dependent (facebook#37452)

Summary:
Pull Request resolved: facebook#37452

Fixes facebook#37428

We do have cache poisoning for hermesc on Windows and Linux due to reusing the same cache key among different
React Native version. This fixes it by specifying a cache key which is version dependent + it invalidates the
caches by defining a new key.

Changelog:
[Internal] [Fixed] - Make CircleCI caches for hermesc be version dependent

Reviewed By: cortinico

Differential Revision: D45909178

fbshipit-source-id: 830c87ae45739c7053342a68dac2ee7581945c1d

* [0.71.9] Bump version numbers

* bumped packages versions

#publish-packages-to-npm

* bump RNGP to 0.71.19

* [0.71.10] Bump version numbers

* [LOCAL] update podlock to fix CI

* Revert "fix: border width top/bottom not matching the border radius (facebook#34362)"

This reverts commit cd6a913.

* Fix invalid context cast in ReactRootView (facebook#36121)

Summary:
Hi 👋

I'm one of the  Expo contributors. When upgrading the Stripe dependency in Expo for SDK48 release on Android, we noticed the following error:
```java.lang.ClassCastException: android.view.ContextThemeWrapper cannot be cast to android.app.Activity```

With Kudo we narrowed it down to an underlying issue in the following cast in `ReactRootView` done during checking for keyboard events:
```((Activity) getContext())```

The `getContext()` is actually a `ContextThemeWrapper` for `ExperienceActivity`, so we should not cast it to an `Activity` directly - instead, we unwrap it using `getBaseContext()`.

Implementing the following fix into the Expo fork fixed the crash for us:
expo@0e2c9ca

## Changelog

[ANDROID] [FIXED] - Fixed crash occurring in certain native views when handling keyboard events.

<!-- Help reviewers and the release process by writing your own changelog entry.

Pick one each for the category and type tags:

[ANDROID|GENERAL|IOS|INTERNAL] [BREAKING|ADDED|CHANGED|DEPRECATED|REMOVED|FIXED|SECURITY] - Message

For more details, see:
https://reactnative.dev/contributing/changelogs-in-pull-requests
-->

Pull Request resolved: facebook#36121

Test Plan:
Tested manually by comparing two builds before and after this change. The main branch build crashes when the [Stripe 0.23.1](https://github.com/stripe/stripe-react-native) Card Element from the example app is mounted on screen. Applying the change fixed the issue.

Happy to make a more isolated reproduction if necessary.

 ---
Full stack trace:
```
         AndroidRuntime  D  Shutting down VM
                         E  FATAL EXCEPTION: main
                         E  Process: host.exp.exponent, PID: 8849
                         E  java.lang.ClassCastException: android.view.ContextThemeWrapper cannot be cast to android.app.Activity
                         E      at com.facebook.react.ReactRootView$CustomGlobalLayoutListener.checkForKeyboardEvents(ReactRootView.java:937)
                         E      at com.facebook.react.ReactRootView$CustomGlobalLayoutListener.onGlobalLayout(ReactRootView.java:913)
                         E      at android.view.ViewTreeObserver.dispatchOnGlobalLayout(ViewTreeObserver.java:1061)
                         E      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3352)
                         E      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2286)
                         E      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8948)
                         E      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1231)
                         E      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1239)
                         E      at android.view.Choreographer.doCallbacks(Choreographer.java:899)
                         E      at android.view.Choreographer.doFrame(Choreographer.java:832)
                         E      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1214)
                         E      at android.os.Handler.handleCallback(Handler.java:942)
                         E      at android.os.Handler.dispatchMessage(Handler.java:99)
                         E      at android.os.Looper.loopOnce(Looper.java:201)
                         E      at android.os.Looper.loop(Looper.java:288)
                         E      at android.app.ActivityThread.main(ActivityThread.java:7898)
                         E      at java.lang.reflect.Method.invoke(Native Method)
                         E      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
                         E      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
```

Reviewed By: cortinico

Differential Revision: D43186530

Pulled By: javache

fbshipit-source-id: 2143495f6b0c71f342eba6d5abb2bfa4a529fbdd

* Prevent crash in runAnimationStep on OnePlus and Oppo devices (facebook#37487)

Summary:
We've been encountering a crash in `runAnimationStep` with "Calculated frame index should never be lower than 0" facebook#35766 with OnePlus/Oppo devices as well, but don't have one on hand to test.

This just works around the issue: if the time is before the start time of an animation, we shouldn't do anything anyways, so we just log a message instead of throwing while in production. We still throw in debug mode though for easier debugging.

### Hypothesis of the root cause

Based on stacktrace in facebook#35766 (which is the same one we see)

Normally, this should happen

1. Choreographer.java constructs a FrameDisplayEventReceiver
2. FrameDisplayEventReceiver.onVSync gets called, which sets the `mTimestampNanos`
3. FrameDisplayEventReceiver.run gets called, which then eventually calls our `doFrame` callback with `mTimestampNanos`. This then causes `FrameBasedAnimationDriver.runAnimationStep` to be called with the same timestamp

I suspect what's happening on OnePlus devices is that the `onVSync` call either doesn't happen or happens rarely enough that the `mTimestampNanos` when `run` is called is sometime in the past

### Fix

1. Add logging so we get the parameters to debug more if we end up getting this error
2. In production, just ignore past times instead of throwing an Error

## Changelog:

Pick one each for the category and type tags:

[ANDROID] [FIXED] - Prevent crash on OnePlus/Oppo devices in runAnimationStep

Pull Request resolved: facebook#37487

Test Plan: Ran our app using patched version and verified no issues showed up when using it

Reviewed By: cipolleschi

Differential Revision: D46102968

Pulled By: cortinico

fbshipit-source-id: bcb36a0c2aed0afdb8e7e68b141a3db4eb02695a

* Use `Content-Location` header in bundle response as JS source URL (facebook#37501)

Summary:
Pull Request resolved: facebook#37501

This is the iOS side of the fix for facebook#36794.

That issue aside for the moment, the high-level idea here is to conceptually separate the bundle *request URL*, which represents a request for the *latest* bundle, from the *source URL* passed to JS engines, which should represent the code actually being executed. In future, we'd like to use this to refer to a point-in-time snapshot of the bundle, so that stack traces more often refer to the code that was actually run, even if it's since been updated on disk (actually implementing this isn't planned at the moment, but it helps describe the distinction).

Short term, this separation gives us a way to address the issue with JSC on iOS 16.4 by allowing Metro to provide the client with a [JSC-safe URL](react-native-community/discussions-and-proposals#646) to pass to the JS engine, even where the request URL isn't JSC-safe.

We'll deliver that URL to the client on HTTP bundle requests via the [`Content-Location`](https://www.rfc-editor.org/rfc/rfc9110#name-content-location) header, which is a published standard for communicating a location for the content provided in a successful response (typically used to provide a direct URL to an asset after content negotiation, but I think it fits here too).

For the long-term goal we should follow up with the same functionality on Android and out-of-tree platforms, but it's non-essential for anything other than iOS 16.4 at the moment.

For the issue fix to work end-to-end we'll also need to update Metro, but the two pieces are decoupled and non-breaking so it doesn't matter which lands first.

Changelog:
[iOS][Changed] Prefer `Content-Location` header in bundle response as JS source URL

Reviewed By: huntie

Differential Revision: D45950661

fbshipit-source-id: 170fcd63a098f81bdcba55ebde0cf3569dceb88d

* [LOCAL] Make 0.70 compatible with Xcode 15 (thanks to @AlexanderEggers for the commit in main)

* [LOCAL] Bump CLI to 10.2.4 and Metro to 0.73.10

* Add web compat unit tests and fixes (facebook#35316)

Summary:
Adds compat with W3C logical CSS properties. See facebook#34425

This is a replacement for reverted facebook#34590, which can no longer be imported internally.

[General][Added] - Added CSS logical properties.

Pull Request resolved: facebook#35316

Test Plan: Unit test snapshots.

Reviewed By: NickGerleman

Differential Revision: D41230978

Pulled By: necolas

fbshipit-source-id: 40e93d0d697f0cb28390480ce2b4bcbce18da70a

* resolve some merge conflicts

* fix tests

* [0.71.11] Bump version numbers

* [LOCAL] update podlock for CI

* fix(ios): fix `pod install --project-directory=ios` failing (facebook#37993)

* Prevent LogBox from crashing on long messages (facebook#38005)

Summary:
Pull Request resolved: facebook#38005

Fixes facebook#32093 by guarding the expensive `BABEL_CODE_FRAME_ERROR_FORMAT` regex with a cheaper initial scan. (Longer term, we should reduce our reliance on string parsing and propagate more structured errors.)

Changelog: [General][Fixed] Prevent LogBox from crashing on very long messages

Reviewed By: GijsWeterings

Differential Revision: D46892454

fbshipit-source-id: 3afadcdd75969c2589bbb06f47d1c4c1c2690abd

# Conflicts:
#	Libraries/LogBox/Data/parseLogBoxLog.js
#	packages/react-native/package.json

* [0.71.12] Bump version numbers

* [LOCAL] Bump podfile.lock

* [LOCAL] Download artifacts from CI to speed up testing (facebook#37971) (facebook#38612)

Co-authored-by: Riccardo Cipolleschi <cipolleschi@fb.com>
resolved: facebook#37971

* fix: mount devtools overlay only if react devtools are connected (facebook#38784)

* Allow RCTBundleURLProvider to request an inline source map (facebook#37878) (facebook#38995)

Summary:
See: http://blog.nparashuram.com/2019/10/debugging-react-native-ios-apps-with.html
When using direct debugging with JavaScriptCore, Safari Web Inspector doesn't pick up the source map over the network. Instead, as far as I can tell, it expects you to pass the source URL at the time you load your bundle:  https://developer.apple.com/documentation/javascriptcore/jscontext/1451384-evaluatescript?language=objc . This leads to a very sub-par developer experience debugging the JSbundle directly. It will however, pick up an inline source map. Therefore, let's add a way to have React Native tell metro to request an inline source map.

I did this by modifying `RCTBundleURLProvider` to have a new query parameter for `inlineSourceMap`, and set to true by default for JSC.

[IOS] [ADDED] - Added support to inline the source map via RCTBundleURLProvider

Pull Request resolved: facebook#37878

Test Plan:
I can put a breakpoint in RNTester, via Safari Web Inspector, in human readable code :D

<img width="1728" alt="Screenshot 2023-06-14 at 4 09 03 AM" src="https://github.com/facebook/react-native/assets/6722175/055277fa-d887-4566-9dc6-3ea07a1a60b0">

Reviewed By: motiz88

Differential Revision: D46855418

Pulled By: huntie

fbshipit-source-id: 2134cdbcd0a3e81052d26ed75f83601ae4ddecfe

* chore(releases): improve bump oss script to allow less human errors (facebook#38666) (facebook#38890)

Summary:
One of the limitations of the existing flow for the release crew is that they need to manually remember to publish all the other packages in the monorepo ahead of a new patch release - this PR modifies the logic for the bump-oss-version script (and makes it available via yarn) so that it will not run if:
* there are git changes lying around
* if some of the packages need a new release

it required a bit of refactoring to extract some portions of the logic from the bump-all-package-versions script, but I think the end result is pretty decent.

## Changelog:

<!-- Help reviewers and the release process by writing your own changelog entry.

Pick one each for the category and type tags:

For more details, see:
https://reactnative.dev/contributing/changelogs-in-pull-requests
-->

[INTERNAL] [CHANGED] - improve bump oss script to allow less human errors

Pull Request resolved: facebook#38666

Test Plan:
* checkout this branch
* comment L54 of bump-oss-version.js (to remove the check on the branch name)
* run `yarn bump-all-updated-packages`, verify that it works and that it detects that some packages have unreleased code
* run `yarn bump-oss-version -t asd -v asd` (the "fake" parameters are needed to pass the yargs check), verify that it will throw an error because it finds a package that has unreleased code

Reviewed By: mdvacca

Differential Revision: D48156963

Pulled By: cortinico

fbshipit-source-id: 2473ad5a84578c5236c905fd9aa9a88113fe8d22

# Conflicts:
#	scripts/publish-npm.js

re-add the file

nit

# Conflicts:
#	package.json

* Add scripts and pipeline to poll for maven (facebook#38980) (facebook#39039)

* Fix onChangeText not firing when clearing the value of TextInput with multiline=true on iOS (facebook#37958)

Summary:
This fix fixes the TextInput issue in facebook#37784 with onChangeText not working on iOS only.

## Changelog:

<!-- Help reviewers and the release process by writing your own changelog entry.

Pick one each for the category and type tags:

[ANDROID|GENERAL|IOS|INTERNAL] [BREAKING|ADDED|CHANGED|DEPRECATED|REMOVED|FIXED|SECURITY] - Message

For more details, see:
https://reactnative.dev/contributing/changelogs-in-pull-requests
-->

[IOS] [FIXED] - Fix onChangeText not firing when clearing the value of TextInput with multiline=true on iOS

Pull Request resolved: facebook#37958

Test Plan:
1. Run the repro code given in the issue (facebook#37784).
2. Verified that onChangeText works after pressing the submit button.
3. Run the repro code from the issue (facebook#36494) that caused this issue.
4. Verified that issue (facebook#36494) is not reoccurring.

Reviewed By: rshest

Differential Revision: D47185775

Pulled By: dmytrorykun

fbshipit-source-id: 1a1a6534d6bf8b5bb8cf1090734dd894bab43f82

* For targeting SDK 34 - Added RECEIVER_EXPORTED/RECEIVER_NOT_EXPORTED flag support in DevSupportManagerBase (facebook#38256)

Summary:
Pull Request resolved: facebook#38256

Add RECEIVER_EXPORTED/RECEIVER_NOT_EXPORTED flag support to DevSupportManagerBase for Android 14 change. See
https://developer.android.com/about/versions/14/behavior-changes-14#runtime-receivers-exported for details.

Without this fix, app crashes during launch because of :
```SecurityException: {package name here}: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts```

Changelog:
[Targeting SDK 34] Added RECEIVER_EXPORTED/RECEIVER_NOT_EXPORTED flag support in DevSupportManagerBase

Reviewed By: javache

Differential Revision: D47313501

fbshipit-source-id: 12e8299559d08b4ff87b4bdabb0a29d27763c698

* [LOCAL] skip un-semver packages in 71 branch

* Revert "[LOCAL] skip un-semver packages in 71 branch"

This reverts commit a90485a.

* [LOCAL] augment forEachPackage to accept optional excludes and add for the bump and trigger release script

* [0.71.13] Bump version numbers

* Re-enable direct debugging with JSC on iOS 16.4+ (facebook#37914)

Summary:
Pull Request resolved: facebook#37914

Restores facebook#37874 (reverted earlier today), with fix for `JSCRuntime.cpp` build on Android.

Changelog: None

Reviewed By: cortinico

Differential Revision: D46762984

fbshipit-source-id: 6d56f81b9d0c928887860993b2b729ed96c0734c

* Guard `JSGlobalContextSetInspectable` behind a compile time check for Xcode 14.3+ (facebook#39037)

Summary:
An earlier [change](facebook@8b1bf05) I made (that huntie resubmitted) only works on Xcode 14.3+ (See more info [here](react-native-community/discussions-and-proposals#687)). This change adds the appropriate compiler checks so that the change is compatible with Xcode 14.2 and earlier, and therefore cherry-pickable to 0.71 and 0.72.

The check works by checking if iOS 16.4+ is defined, which is the closest proxy I could find for "Is this Xcode 14.3".

## Changelog:

[IOS] [CHANGED] - Guard `JSGlobalContextSetInspectable` behind a compile time check for Xcode 14.3+

Pull Request resolved: facebook#39037

Test Plan: I can't actually test on Xcode 14.2 (it won't launch on my MacBook 😢), but I made a similar [PR](#1848) in React Native macOS, whose CI checks run against Xcode 14.2 and I'm getting passing checks there.

Reviewed By: huntie

Differential Revision: D48414196

Pulled By: NickGerleman

fbshipit-source-id: ba10a6505dd11d982cc56c02bf9f7dcdc104bbec

* Fix some issues

---------

Co-authored-by: Lorenzo Sciandra <lsciandra@microsoft.com>
Co-authored-by: Nick Gerleman <ngerlem@meta.com>
Co-authored-by: Lorenzo Sciandra <notkelset@kelset.dev>
Co-authored-by: Dmitry Rykun <dmitryrykun@meta.com>
Co-authored-by: Pieter De Baets <pieterdb@meta.com>
Co-authored-by: Distiller <distiller@static.38.39.184.131.cyberlynk.net>
Co-authored-by: Douglas Lowder <douglowder@mac.com>
Co-authored-by: Distiller <distiller@static.38.39.183.111.cyberlynk.net>
Co-authored-by: Kyle Roach <kroach.work@gmail.com>
Co-authored-by: Julien Brayere <julien.brayere@obitrain.com>
Co-authored-by: Riccardo Cipolleschi <cipolleschi@meta.com>
Co-authored-by: Distiller <distiller@static.38.39.184.95.cyberlynk.net>
Co-authored-by: Distiller <distiller@static.38.23.39.177.cyberlynk.net>
Co-authored-by: aleqsio <amikucki@scratch.fi>
Co-authored-by: Harry Yu <harry@wanderlog.com>
Co-authored-by: Rob Hogan <robhogan@meta.com>
Co-authored-by: Nicolas Gallagher <necolas@fb.com>
Co-authored-by: Alexander Eggers <alex.eggers@myzeller.com>
Co-authored-by: Distiller <distiller@static.38.23.38.34.cyberlynk.net>
Co-authored-by: Tommy Nguyen <4123478+tido64@users.noreply.github.com>
Co-authored-by: Moti Zilberman <moti@meta.com>
Co-authored-by: Distiller <distiller@static.38.39.185.107.cyberlynk.net>
Co-authored-by: Riccardo Cipolleschi <riccardo.cipolleschi@gmail.com>
Co-authored-by: Riccardo Cipolleschi <cipolleschi@fb.com>
Co-authored-by: Ruslan Lesiutin <rdlesyutin@gmail.com>
Co-authored-by: Koichi Nagaoka <emmeleia@me.com>
Co-authored-by: Kun Wang <kun@meta.com>
Co-authored-by: Distiller <distiller@static.38.39.183.18.cyberlynk.net>
Co-authored-by: Alex Hunt <alexeh@meta.com>
@sergey-shablenko
Copy link

Found a workaround, just in case anyone needs it
You can use

<TextInput 
  multiline
  numberOfLines={numberOfLines}
  defaultValue={value}
  onEndEditing={(e) => onChangeText(e.nativeEvent.text)}
/>

may not fit everyone, but at least does not go into infinite loop

@douglasjunior
Copy link

Updating the behavior mentioned here: #36494 (comment)

version description
<= 0.71.7 ⚠️ Changing value call onChangeText, then if you change value again the onChangeText will be called once more, creating an infinity loop. If you don't change value on every onChangeText, then will be fine.
>= 0.71.8 && <= 0.71.12 🚨 Changing value call onChangeText, then if you change value again the onChangeText will not be called, but if you type some new char the onChangeText will not be fired in the first time.
= 0.71.13 (latest) ⚠️ Same as RN <= 0.71.7
>= 0.72.0 ⚠️ Same as RN <= 0.71.7

douglowder pushed a commit to react-native-tvos/react-native-tvos that referenced this issue Aug 28, 2023
… multiline=true on iOS (#37958)

Summary:
This fix fixes the TextInput issue in facebook/react-native#37784 with onChangeText not working on iOS only.

## Changelog:

<!-- Help reviewers and the release process by writing your own changelog entry.

Pick one each for the category and type tags:

[ANDROID|GENERAL|IOS|INTERNAL] [BREAKING|ADDED|CHANGED|DEPRECATED|REMOVED|FIXED|SECURITY] - Message

For more details, see:
https://reactnative.dev/contributing/changelogs-in-pull-requests
-->

[IOS] [FIXED] - Fix onChangeText not firing when clearing the value of TextInput with multiline=true on iOS

Pull Request resolved: facebook/react-native#37958

Test Plan:
1. Run the repro code given in the issue (facebook/react-native#37784).
2. Verified that onChangeText works after pressing the submit button.
3. Run the repro code from the issue (facebook/react-native#36494) that caused this issue.
4. Verified that issue (facebook/react-native#36494) is not reoccurring.

Reviewed By: rshest

Differential Revision: D47185775

Pulled By: dmytrorykun

fbshipit-source-id: 1a1a6534d6bf8b5bb8cf1090734dd894bab43f82
@josef256
Copy link

josef256 commented Sep 3, 2023

same issue on IOS with multiline set to true
on rn 0.72.3
edit : as a workaround using defaultValue instead of value seems to fix it

<TextInput 
defaultValue={value}
/>

@ukcasso
Copy link

ukcasso commented Sep 25, 2023

If you use a pre-release version RN, it is for temporary use.
You try this example code.
Fix automatically occur text, also can paste text.

import { Platform, TextInput } from 'react-native';
const [value, setValue] = useState(props.value || '');
const maxLength = 100;

<TextInput
  onChangeText={(newText) => {
    if (Platform.OS === 'ios' &&
        value &&
        maxLength &&
        value.length > (maxLength / 2) &&
        newText.length - value.length >= maxLength - value.length) {
      return;
    }
    
    setValue(newText);
  }}
  value={value}
  maxLength={maxLength}
  multiline
/>

@matheusbaumgart
Copy link

Still an issue on 0.73.2

High5Apps added a commit to High5Apps/organize-rn that referenced this issue Apr 17, 2024
- Previously had an issue on iOS with multiline text input and maxLength < 1/2 of text length, which would partially duplicate the value string, but it was fixed by upgrading RN in the previous commit
  - facebook/react-native#36494
@jackylu0124
Copy link

just encountered this problem yesterday. Took me a while to figure out what was going on. A simple but dirty solution is to use the useRef hook. Set the initial hook to 0. in the onChangeText method, check to see if the useRef value is 0; if it is, do not execute the callback, otherwise execute the callback. From then on, keep incrementing the useRef value. This will persist across state changes

Could you please provide a reference of your alternative solution? In my case, not only is onChangeText being called repeatedly, but its value is also changed. For example, in my case, I have maxLength={8} and if I type "Abcde" and then programmtically set the state to empty string and navigate to another screen; and then coming back to the screen and programmatically setting the state to "Abcde" again, the text input then incorrectly renders the string "AbcAbcde". I have encountered very similar behavior to this issue: #44566

Thanks for your help in advance!

@mohammad-goldast
Copy link

mohammad-goldast commented Dec 1, 2024

Still have the issue on React-Native 0.76.

onContentSizeChange called automatically and infinite times. The issue is related to multiline prop, when I remove the prop, everything goes well.

<TextInput
  defaultValue={journalData.content}
  ref={contentInputRef}
  style={[styles.contentInput, {height: contentInputHeight}]}
  value={journalData.content}
  onContentSizeChange={(event) => {
    console.log(event.nativeEvent.contentSize.height);
    setContentInputHeight(event.nativeEvent.contentSize.height + 40);
  }}
  onChangeText={(content) => setJournalData((prev) => ({...prev, content}))}
  onFocus={() => {
    if (journalData.title?.length === 0) {
      titleInputRef.current?.focus();
    } else {
      focusedInput.current = 'content';
    }
  }}
  scrollEnabled={false}
  returnKeyType="next"
  underlineColorAndroid="transparent"
  onSelectionChange={({nativeEvent}) => {
    selectionState.current = nativeEvent.selection;
  }}
  autoCorrect
  multiline
/>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Component: TextInput Related to the TextInput component. Impact: Regression Describes a behavior that used to work on a prior release, but stopped working recently. Issue: Author Provided Repro This issue can be reproduced in Snack or an attached project. Needs: Triage 🔍 Platform: iOS iOS applications.
Projects
None yet
Development

Successfully merging a pull request may close this issue.