Files
react/packages/react-native-renderer/src/ReactNativeComponentTree.js
Rubén Norte 108aed083e Fix use of stale props in Fabric events (#26408)
## Summary

We had to revert the last React sync to React Native because we saw
issues with Responder events using stale event handlers instead of
recent versions.

I reviewed the merged PRs and realized the problem was in the refactor I
did in #26321. In that PR, we moved `currentProps` from `canonical`,
which is a singleton referenced by all versions of the same fiber, to
the fiber itself. This is causing the staleness we observed in events.

This PR does a partial revert of the refactor in #26321, bringing back
the `canonical` object but moving `publicInstance` to one of its fields,
instead of being the `canonical` object itself.

## How did you test this change?

Existing unit tests continue working (I didn't manage to get a repro
using the test renderer).
I manually tested this change in Meta infra and saw the problem was
fixed.
2023-03-17 11:27:49 +00:00

53 lines
1.3 KiB
JavaScript

/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
const instanceCache = new Map();
const instanceProps = new Map();
export function precacheFiberNode(hostInst, tag) {
instanceCache.set(tag, hostInst);
}
export function uncacheFiberNode(tag) {
instanceCache.delete(tag);
instanceProps.delete(tag);
}
function getInstanceFromTag(tag) {
return instanceCache.get(tag) || null;
}
function getTagFromInstance(inst) {
let nativeInstance = inst.stateNode;
let tag = nativeInstance._nativeTag;
if (tag === undefined && nativeInstance.canonical != null) {
// For compatibility with Fabric
tag = nativeInstance.canonical.nativeTag;
nativeInstance = nativeInstance.canonical.publicInstance;
}
if (!tag) {
throw new Error('All native instances should have a tag.');
}
return nativeInstance;
}
export {
getInstanceFromTag as getClosestInstanceFromNode,
getInstanceFromTag as getInstanceFromNode,
getTagFromInstance as getNodeFromInstance,
};
export function getFiberCurrentPropsFromNode(stateNode) {
return instanceProps.get(stateNode._nativeTag) || null;
}
export function updateFiberProps(tag, props) {
instanceProps.set(tag, props);
}