Summary:
Errors in form actions are now rethrown during render (#26689), so we
can handle them using an error boundary.
DiffTrain build for commit https://github.com/facebook/react/commit/967d46c76cf9f7f35cf659a6a47c9ad456c685a8.
Changelog: [Internal]
Reviewed By: poteto
Differential Revision: D45238297
fbshipit-source-id: e2db3d9a55671f9f72cf8966e75fe8010e708835
Summary:
This is stable and appears to build w/o problem. I don't see why we
should disallow it.
DiffTrain build for commit https://github.com/facebook/react/commit/5d7ebb4b784cb7e41e28653d89054cfe65637a93.
Changelog: [Internal]
Reviewed By: kassens
Differential Revision: D45238282
Pulled By: gaearon
fbshipit-source-id: c1189aaaf211349a0ad919eaca59dd8e8224e5ac
Summary:
This is the next step toward full support for async form actions.
Errors thrown inside form actions should cause the form to re-render and
throw the error so it can be captured by an error boundary. The behavior
is the same if the `<form />` had an internal useTransition hook, which
is pretty much exactly how we implement it, too.
The first time an action is called, the form's HostComponent is
"upgraded" to become stateful, by lazily mounting a list of hooks. The
rest of the implementation for function components can be shared.
Because the error handling behavior added in this commit is just using
useTransition under-the-hood, it also handles pending states, too.
However, this pending state can't be observed until we add a new hook
for that purpose. I'll add this next.
DiffTrain build for commit https://github.com/facebook/react/commit/fd3fb8e3c5d1c977f4bfa73d715143804c69d4b0.
Changelog: [Internal]
Reviewed By: poteto
Differential Revision: D45238266
Pulled By: kassens
fbshipit-source-id: 93fe8581172522f955278918bf97a0eb54daeeed
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37070
This diff fixes an issue where codegened native commands are not able to be triggered, as codegen adds command handling to the delegate. This also brings how receiveCommand is handled into parity with how setProperties is called on the delegate.
Changelog:
[Fixed][Android] - Modify ViewManager.receiveCommand to call into delegate
Reviewed By: javache
Differential Revision: D45236213
fbshipit-source-id: 78f232f288f0a9c5f444e680a9cc49dca1d6af9b
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/36949
This change is a second attempt at fixing URL encoding and escaping that was already tried [here](https://github.com/facebook/react-native/commit/2b4e1f5ece7d160935b19d4862af8706a44cee59).
We had to roll it back due to some internal tests failing as it looks like Jest is manipulating the URL somehow.
We manage to replicate the issue, which occur when we pre-decode a url even if it is not partially encoded (we were too aggrsssive).
This fix ensure that we pre-decode the urls only if they present some `%` characters.
The problem here was that the e2e tests sends some urls with some `%` symbol which does not belongs to an escape sequence. For example: `anna://launch?height=25%`.
The previous code (v1) was trying to unescape this case. V2 fixes this.
This change should also fix#28508 for good.
## Changelog:
[iOS][Fixed] - Properly escape URLs
Reviewed By: mdvacca
Differential Revision: D45078923
fbshipit-source-id: 010a5c173784f8341a1a08bcbd06a6ad14299c75
Summary:
Cleans up some of the changes to UseWebDefaults that were made in the interest of moving it outside of YGConfig. It still exists in YGConfig, but also exists on the node.
We also assert on null config, or when someone tries to change UseWebDefaults after creating a node (since right now YGStyle does not know the difference between unset vs set explicitly to what would normally be default).
Removes a peculiar constructor which was added to avoid config setting.
Reviewed By: rshest
Differential Revision: D45133644
fbshipit-source-id: 2b5e2baeb826653133df9b1175cf5c194e342e3e
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37074
I am exploring ways of cleaning up the React Native Jest `setup.js` logic so that we can enable Flow and make it easier to maintain.
This does a few things:
- Create a new Jest test to verify that mocking works as expected (i.e. `jest.mock(X)` and `import ... from 'X'` does the right thing).
- Move the mock implementation for `NativeExceptionsManager` into a `__mocks__` directory that Jest can find automatically.
- Add `flow strict` and fill out the missing implementation details of the `NativeExceptionsManager` mock.
Changelog:
[General][Added] - Added missing methods to `NativeExceptionsManager` mock in Jest
Reviewed By: fkgozali
Differential Revision: D45244175
fbshipit-source-id: 0f4c8f873f93304509b80a13ed52e96265d10a42
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37072
Deletes this call to `jest.setMock` for `ErrorUtils`. There is no such manual mock in `__mocks__` adjacent to `ErrorUtils` and this call does nothing.
Changelog:
[Internal]
Reviewed By: fkgozali
Differential Revision: D45234899
fbshipit-source-id: 51a41061761705e4f55120be0dbb77c6515e6a0a
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37046
Changes React Native's `jest/setup.js` so that globals (e.g. `__DEV__`, `performance`, `window`) are defined using `Object.defineProperties` instead of using object property assignment.
This makes the setup logic more resilient to Jest environments (e.g. [`jsdom`](https://github.com/jsdom/jsdom/blob/master/lib/jsdom/browser/Window.js#L422-L424)) where the globals are defined without a setter (i.e. `set` is undefined) or without `writable: true`, because object property assignment to such properties throws an error in strict mode.
Changelog:
[General][Changed] - Jest globals are now defined using `Object.defineProperties` instead of object property assignment
Reviewed By: motiz88
Differential Revision: D45202142
fbshipit-source-id: 5511e374ac6ba051ad0c224b902fb6f20960e9be
Summary:
[Codegen 102] This PR is subtask of umbrella https://github.com/facebook/react-native/issues/34872. It extracts the code to compute the `extendsProps` and the props properties in Flow in a `getProps() -> {extendsProps, props}` function into the same `index.js` file. This will help unifying the `buildComponentSchema` functions between Flow and TS so we can factor it out in a later step.
## Changelog:
[INTERNAL][CHANGED] - merge `getExtendsProps` & `getProps` fns into `getProps` fn - Flow.
Pull Request resolved: https://github.com/facebook/react-native/pull/36891
Test Plan: - `yarn flow && yarn test react-native-codegen` --> *should be green.*
Reviewed By: rshest
Differential Revision: D45044653
Pulled By: cipolleschi
fbshipit-source-id: 9fcdaef60dfbc3332d880b19c6e575d948d21986
Summary:
Throws and captures the overloading class as well as the component name to help us track.
[Android][Changed] - Added an exception, which will be removed shortly.
Reviewed By: cortinico
Differential Revision: D45185598
fbshipit-source-id: 222a38be12c0a41774c83b657a4e4134ce9c197f
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37004
Currently in RN Android when re-creating the context we don't unmount the underlying React application. This violates ViewManager and React hooks contracts, who are no longer able to properly unmount views, and instead the view hierarchy is forcefully torn down by Android UI. This differs from iOS, where we do unmount the application on reloads.
This is a trade-off with performance, as we'll keep the JS thread alive slightly longer to complete shutdown, but it's the right call for correctness. It also only mainly affects development, as recreating the context is rare in production.
Repro steps:
```
useEffect(() => {
console.log('Playground useEffect invoked');
return () => {
console.log('Playground useEffect destructor invoked');
};
}, []);
```
Validate that when reloading the application, the second console.log is printed.
Changelog: [Android][Changed] React trees will be unmounted when the application is reloaded
Reviewed By: luluwu2032
Differential Revision: D45145520
fbshipit-source-id: a4dcd2ff4a8fc14cb0f276a5ef9afe21d1104735
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37039
ReactInstance is not meant to be used outside of bridgless package, this diff reduces its visibility.
changelog: [internal] internal
Reviewed By: fkgozali
Differential Revision: D45197462
fbshipit-source-id: e2fa8ed145a05882d8f5384d4e4e17a3d6d984ac
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37042
BridgelessAtomicRef is only used in com.facebook.react.bridgeless, we reduce visibility to package only
changelog: [internal] internal
Reviewed By: NickGerleman
Differential Revision: D45192193
fbshipit-source-id: 12253a2a8acd3c2edd550650f5f04a0346694b3e
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37047
We're seeing scenarios where `onRequestPermissionsResult` is being invoked but the current activity does not implement `PermissionAwareActivity`. This should not crash the app.
Changelog:
[Android][Fixed] - Fix crash when Android requests permission with activity that does not implement `PermissionAwareActivity`
Reviewed By: mdvacca
Differential Revision: D45203319
fbshipit-source-id: 4a6eb67ad67ae5c731c27301967b837b1286ccbb
Summary:
In the TurboModule interop layer, several modules are appearing as null. It's unclear why. We landed a few module resolution simplification diffs, to *attempt* to mitigate the problem: D45131297. But we're not sure if those diffs will be 100% successful.
So, this diff inserts two logs into the TurboModule system, for scenarios we know could lead to TurboModules being null. The hope: this helps us understand the actual problem, in case our earlier fix attempt (i.e: D45131297) fails.
Notes:
- These logs are temporary.
- These logs will only run in the TurboModule interop's test group.
Changelog: [Internal]
Reviewed By: mdvacca
Differential Revision: D45197703
fbshipit-source-id: 4401a6111492444cc4b405c52183d02df94c3828
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37032
Before, calling into global.turboModuleProxy would kickstart the module creation algorithm, **even if the module wasn't registered.**
Now, if the module isn't registered, TurboModuleManager will just early return null.
NOTE: When an unregistered module is requested from Java via TurboModuleManager.getModule(moduleName), the module algorithm will **still** run.
This fixes a bug:
- global.**native**ModuleProxy will no longer kickstart **turbo** module creation.
- global.**turbo**ModuleProxy will no longer kickstart **legacy** module creation.
NOTE: This **might** improve fb4a performance **a bit**: The TurboModule creation algorithm is *probably* expensive to run. 44 NativeModules are loaded at startup by Fb4a; 8 of them aren't registered with the app: [pastry](https://www.internalfb.com/phabricator/paste/view/P701125588?lines=2%2C4%2C5%2C7%2C9%2C16%2C18%2C24). Those 8 NativeModule creates will now shortcircuit to null faster.
Changelog: [Internal]
Reviewed By: mdvacca
Differential Revision: D45195578
fbshipit-source-id: cb09bdc059b3651b02447b7c2e37ef3f4ca2f92b
Summary:
These getNative* TurboModuleRegistry APIs make the TurboModuleManager harder to understand. They should have never been introduced.
Let's remove them for added clarity.
Changelog: [Android][Removed] - Remove TurboModuleManager.getNativeModule,getNativeModules,hasNativeModule
Reviewed By: mdvacca
Differential Revision: D45158032
fbshipit-source-id: 6f904dfe43fe7b2c215070a19f474acceddbf2f8
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/36991
D15296732 added a byte to each YGNode exposed via private API, to stash random junk in. At the time, not adding to node size because of how fields ended up aligning. I'm not sure if this is still the case, but this is subject to change (e.g. adding a single extra flag).
There is a per-node "context" already that can store arbitrary data, and this reserved space isn't public, so this API is already a bit suspect.
The only place it is used is in instrumentation in fbandroid, enabled only in benchmarks, to store an enum to forward to QPL for what framework it thinks created the Yoga Node.
This is already broken for React Native (worked for Paper only), and afaict isn't used anywhere. But it also has little reason to be caching more information on the node (beyond maybe saving a couple memory accesses) since it derives this information from the node config already.
This removes the field.
Changelog:
[Internal]
Reviewed By: rshest
Differential Revision: D45137133
fbshipit-source-id: 75755b21102f7928b3ad947051c35b1a6566ef40
Summary:
changelog: [internal]
`_isUserTriggeredScrolling` must be NO when user interaction stops. This was not the case when user scrolled -> lifted finger but the scroll did not decelerate into position. The case with deceleration is handled in method `scrollViewDidEndDecelerating`.
Reviewed By: javache
Differential Revision: D45147325
fbshipit-source-id: 1b55dc708c4c7d6cffa917a822eb2b569b22dbb2
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37020
changelog: [internal]
if host view's position on screen changes, `RootShadowNode` has to be notified of this. Otherwise the state of UI is not correctly reflected in ShadowTree, leading to inconsistencies. For example, when trying to get views position in window, it won't be correct when hosting view isn't full screen.
Overriding `setFrame` only works for cases where it is hosting view's parent changing its position. But there are other cases where the position may change on the screen, like when hosting view's parent is moved by movable navigation bar. This does not affect frame of hosting view but it does change its position on the screen. To know about this event, we need to override `layoutSubviews`. `layoutSubviews` is called by UIKit whenever its internal flag `_needsLayout` is set to YES.
Reviewed By: javache
Differential Revision: D45122502
fbshipit-source-id: b7b1b08a8b3accffce7e3c71f7d19887caf6462f
Summary:
I'm adding a reference to our official template in the Needs: Repro label response
## Changelog:
[INTERNAL] - Update actOnLabel to include the official reproducer
Pull Request resolved: https://github.com/facebook/react-native/pull/37023
Test Plan: n/a
Reviewed By: mdvacca
Differential Revision: D45183426
Pulled By: cortinico
fbshipit-source-id: cd97981eda49ff7123f6beb05b6eb64b4899ded0
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/37018
Just bumping Gradle version to the latest stable.
This brings configuration caching as stable, which is quite of a big deal.
Changelog:
[Android] [Changed] - Gradle to 8.1
Reviewed By: yungsters
Differential Revision: D45177537
fbshipit-source-id: 6a47208b69d5591d299451e5a610cc3f5e9afe66
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/36905
In this diff I'm deprecating EventBeatManager constructor that receives a Context as a parameter.
bypass-github-export-checks
changelog: [Android][Deprecated] deprecating EventBeatManager constructor that receives a Context as a parameter.
Reviewed By: fkgozali
Differential Revision: D44759827
fbshipit-source-id: cb117c26af0a43fe245f8778a55dfbea756b3ce6
Summary:
X-link: https://github.com/facebook/yoga/pull/1250
Pull Request resolved: https://github.com/facebook/react-native/pull/36988
BitUtils functions in Yoga are like bit fields, with more steps, and more error prone (you need to work with explicit offsets which can be tricky for anything variable length). Replace usage with a bitfield struct. Eventually I'd like to remove the BitUtils functions in general.
Changelog: [Internal]
Reviewed By: rshest
Differential Revision: D45133645
fbshipit-source-id: aa1430df5e2fb71ed9d2a5f5b1a35429b71c7069