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

Add support for React Native 0.71 #3745

Merged
merged 99 commits into from
Jan 3, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
5289bdf
Update react-native version to 0.70.5
piaskowyk Nov 7, 2022
a5894fc
Update Podfile.lock
piaskowyk Nov 7, 2022
9cbdc94
Update Podfile.lock for Fabric
piaskowyk Nov 7, 2022
58aba40
iOS works
tomekzaw Nov 7, 2022
e869e54
Android works
tomekzaw Nov 7, 2022
fe6f145
Merge branch 'main' into @tomekzaw/update-example-app-template
tomekzaw Nov 7, 2022
5f89158
Autolink other libraries
tomekzaw Nov 7, 2022
2ae53e6
More changes
tomekzaw Nov 7, 2022
555df06
Some more changes
tomekzaw Nov 7, 2022
1156012
Update Example app to 0.71.0-rc.0
tomekzaw Nov 8, 2022
fe18e29
Workarounds for Android
tomekzaw Nov 8, 2022
f7d578a
Merge branch 'main' into @tomekzaw/support-71-paper
tomekzaw Nov 8, 2022
ef80828
Update download_aar.sh
tomekzaw Nov 8, 2022
4863fd3
Bump react-native in package root
tomekzaw Nov 8, 2022
99c2821
Fix Layout Animations by overwriting `mUIImplementation` with `Reanim…
tomekzaw Nov 9, 2022
5f734d6
Fix getting app project
tomekzaw Nov 9, 2022
3f3e754
Use artifacts from maven-local.zip
tomekzaw Nov 10, 2022
f514473
Run Example app with Hermes enabled
tomekzaw Nov 10, 2022
61773f7
Use glog from prefab
tomekzaw Nov 10, 2022
821356f
Use fbjni from prefab
tomekzaw Nov 10, 2022
341589c
Use folly from prefab
tomekzaw Nov 10, 2022
11728c8
Use jsi from prefab
tomekzaw Nov 10, 2022
0b4190c
Remove boost
tomekzaw Nov 10, 2022
74b1d6d
Remove double-conversion
tomekzaw Nov 10, 2022
56355ba
Remove unnecessary header paths
tomekzaw Nov 10, 2022
238afa2
Set Folly flags
tomekzaw Nov 14, 2022
878f8f2
Set CMAKE_CXX_FLAGS
tomekzaw Nov 14, 2022
c3ea411
Use string append instead of set
tomekzaw Nov 14, 2022
5d1cbd5
Specify react-native version
tomekzaw Nov 14, 2022
c4b5547
Consume libhermes from prefab
tomekzaw Nov 14, 2022
8643a86
Update FabricExample template
tomekzaw Nov 14, 2022
4e97204
Adapt sources to 0.71
tomekzaw Nov 14, 2022
df4c53b
FabricExample iOS works
tomekzaw Nov 14, 2022
627ce67
Temporarily remove other third-party libs
tomekzaw Nov 14, 2022
41285b7
Use shared libraries for new architecture from prefabs
tomekzaw Nov 14, 2022
7555d8d
Merge branch 'main' into @tomekzaw/add-0.71-support
tomekzaw Nov 15, 2022
6e1715d
Bump react-native to 0.71.0-rc.2
tomekzaw Nov 25, 2022
f099cb3
Merge branch 'main' into @tomekzaw/add-0.71-support
tomekzaw Nov 25, 2022
8403b5a
Remove maven-local repo
tomekzaw Nov 25, 2022
378e718
Fix path
tomekzaw Nov 25, 2022
81095dc
Fix Jest (workaround)
tomekzaw Nov 25, 2022
bfe71af
Remove react-native-codegen from devDependencies
tomekzaw Nov 25, 2022
74e830b
Use react-native nightly (Fabric works, Paper doesn't)
tomekzaw Nov 25, 2022
f59b0f1
Consume all shared libraries from prefabs
tomekzaw Nov 30, 2022
d651a98
Bump Example to nightly
tomekzaw Nov 30, 2022
c13abb9
Use latest nightly
tomekzaw Nov 30, 2022
12560b7
Bump to 0.71.0-rc.3
tomekzaw Nov 30, 2022
091aac0
Use folly-flags.cmake
tomekzaw Dec 1, 2022
6ef7d3e
Bump to 0.0.0-20221203-2022-3e9141569
tomekzaw Dec 5, 2022
f5a10e2
JSC works
tomekzaw Dec 5, 2022
da5fc0e
Merge branch 'main' into @tomekzaw/add-0.71-support
tomekzaw Dec 5, 2022
e8a1f4f
Detect JS runtime
tomekzaw Dec 5, 2022
12addd5
Enable Hermes
tomekzaw Dec 5, 2022
5f813fc
Update build.gradle
tomekzaw Dec 8, 2022
4be8065
Update build.gradle
tomekzaw Dec 8, 2022
9071a9f
Add ifdefs in C++ code for older RN versions
tomekzaw Dec 8, 2022
1f597f6
Update build.gradle
tomekzaw Dec 8, 2022
92e61e1
Update CMakeLists.txt
tomekzaw Dec 8, 2022
e5c67f7
Update CMakeLists.txt
tomekzaw Dec 8, 2022
3b0ba58
Update CMakeLists.txt
tomekzaw Dec 8, 2022
317088e
Check React Native minor version when Fabric is enabled
tomekzaw Dec 8, 2022
cb774be
Use GradleException
tomekzaw Dec 8, 2022
d7ae8be
FabricExample works
tomekzaw Dec 8, 2022
07acb43
Update CMakeLists.txt
tomekzaw Dec 8, 2022
2934369
Fix Android crash in FabricExample in folly::destroy
tomekzaw Dec 9, 2022
005aa28
Keep it simple
tomekzaw Dec 9, 2022
88e2fec
Bump react-native to 0.0.0-20221212-2056-0f089ea2d
tomekzaw Dec 13, 2022
278afb9
Improve CMakeLists.txt
tomekzaw Dec 13, 2022
42807ed
Restore metro-inspector-proxy patch
tomekzaw Dec 13, 2022
ef08274
Move `-fstack-protector-all` from build.gradle to CMakeLists.txt
tomekzaw Dec 13, 2022
7d836e8
Bump react-native to 0.0.0-20221213-2027-455ca8cfa
tomekzaw Dec 14, 2022
bb111f2
Bump react-native to 0.71.0-rc.4
tomekzaw Dec 15, 2022
36262db
Bump react-native to 0.71.0-rc.5
tomekzaw Dec 20, 2022
a760d66
Use target_include_directories instead of target_link_libraries for n…
tomekzaw Dec 21, 2022
cfb761c
Add missing SystraceSection
tomekzaw Dec 21, 2022
13abf2d
Remove unnecessary react-native.config.js
tomekzaw Dec 21, 2022
04b0eee
Remove `UIManager_cloneNode` and `UIManager_appendChild`
tomekzaw Dec 21, 2022
9802487
Remove `UIManager_dispatchCommand`
tomekzaw Dec 21, 2022
70b6c81
Remove `UIManager_getRelativeLayoutMetrics`
tomekzaw Dec 21, 2022
0b1fbf0
Update `NativeReanimatedModule::dispatchCommand`
tomekzaw Dec 21, 2022
076f0a6
Remove `getUIManagerPublic`
tomekzaw Dec 21, 2022
8886d56
Rename `cloneNode` to `cloneNodeFromNewest`
tomekzaw Dec 21, 2022
7549b53
Align implementation of `ReanimatedUIManagerBinding` with `UIManagerB…
tomekzaw Dec 21, 2022
1db1036
Merge branch 'main' into @tomekzaw/add-0.71-support
tomekzaw Dec 28, 2022
e576ee8
Add Java patch
tomekzaw Dec 28, 2022
30e603c
Fix ReanimatedHermesRuntime.cpp
tomekzaw Dec 30, 2022
03509f3
Fix build.gradle
tomekzaw Dec 30, 2022
905bf57
Fix CMakeLists.txt
tomekzaw Dec 30, 2022
2b0eb9e
Consume React Native types directly from package
tomekzaw Dec 30, 2022
8798006
Bring back dependencies
tomekzaw Dec 30, 2022
95281e0
Rename utility functions
tomekzaw Dec 30, 2022
ea8922b
Rename systrace section
tomekzaw Dec 30, 2022
906dbeb
Eliminate code duplication
tomekzaw Dec 30, 2022
a9b4f41
Align Example app with template
tomekzaw Dec 30, 2022
4b0a997
Update Podfile.lock
tomekzaw Dec 30, 2022
374888e
Update yarn.lock
tomekzaw Dec 30, 2022
ac5be7d
Restore original App.tsx
tomekzaw Jan 3, 2023
e631e67
Remove unnecessary import
tomekzaw Jan 3, 2023
7cec411
Restore `isReanimatedExampleApp` flag in FabricExample
tomekzaw Jan 3, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 3 additions & 102 deletions Common/cpp/Fabric/FabricUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

#include "FabricUtils.h"

#include <react/renderer/debug/SystraceSection.h>
#include <react/renderer/uimanager/UIManagerBinding.h>

using namespace facebook::react;
Expand All @@ -22,110 +23,10 @@ RuntimeExecutor getRuntimeExecutorFromBinding(Binding *binding) {
}
#endif

inline static const UIManagerPublic *getUIManagerPublic(
const UIManager *uiManager) {
return reinterpret_cast<const UIManagerPublic *>(uiManager);
}

std::shared_ptr<const ContextContainer> getContextContainerFromUIManager(
const UIManager *uiManager) {
return getUIManagerPublic(uiManager)->contextContainer_;
}

inline static UIManagerDelegate *getDelegateFromUIManager(
const UIManager *uiManager) {
return getUIManagerPublic(uiManager)->delegate_;
}

void UIManager_dispatchCommand(
const std::shared_ptr<UIManager> &uiManager,
const ShadowNode::Shared &shadowNode,
std::string const &commandName,
folly::dynamic const &args) {
auto delegate_ = getDelegateFromUIManager(&*uiManager);

// copied from UIManager.cpp
if (delegate_) {
delegate_->uiManagerDidDispatchCommand(shadowNode, commandName, args);
}
}

LayoutMetrics UIManager_getRelativeLayoutMetrics(
const std::shared_ptr<UIManager> &uiManager,
ShadowNode const &shadowNode,
ShadowNode const *ancestorShadowNode,
LayoutableShadowNode::LayoutInspectingPolicy policy) {
// based on implementation from UIManager.cpp
const auto &shadowTreeRegistry = uiManager->getShadowTreeRegistry();

// We might store here an owning pointer to `ancestorShadowNode` to ensure
// that the node is not deallocated during method execution lifetime.
auto owningAncestorShadowNode = ShadowNode::Shared{};

if (!ancestorShadowNode) {
shadowTreeRegistry.visit(
shadowNode.getSurfaceId(), [&](ShadowTree const &shadowTree) {
owningAncestorShadowNode =
shadowTree.getCurrentRevision().rootShadowNode;
ancestorShadowNode = owningAncestorShadowNode.get();
});
} else {
// It is possible for JavaScript (or other callers) to have a reference
// to a previous version of ShadowNodes, but we enforce that
// metrics are only calculated on most recently committed versions.
owningAncestorShadowNode =
uiManager->getNewestCloneOfShadowNode(*ancestorShadowNode);
ancestorShadowNode = owningAncestorShadowNode.get();
}

auto layoutableAncestorShadowNode =
traitCast<LayoutableShadowNode const *>(ancestorShadowNode);

if (!layoutableAncestorShadowNode) {
return EmptyLayoutMetrics;
}

return LayoutableShadowNode::computeRelativeLayoutMetrics(
shadowNode.getFamily(), *layoutableAncestorShadowNode, policy);
}

ShadowNode::Shared UIManager_cloneNode(
const UIManager *uiManager,
const ShadowNode::Shared &shadowNode,
const ShadowNode::SharedListOfShared &children,
const RawProps *rawProps) {
auto delegate_ = getDelegateFromUIManager(uiManager);
auto contextContainer_ = getContextContainerFromUIManager(uiManager);

// copied from UIManager.cpp
PropsParserContext propsParserContext{
shadowNode->getFamily().getSurfaceId(), *contextContainer_.get()};

auto &componentDescriptor = shadowNode->getComponentDescriptor();
auto clonedShadowNode = componentDescriptor.cloneShadowNode(
*shadowNode,
{
/* .props = */
rawProps ? componentDescriptor.cloneProps(
propsParserContext, shadowNode->getProps(), *rawProps)
: ShadowNodeFragment::propsPlaceholder(),
/* .children = */ children,
});

if (delegate_) {
delegate_->uiManagerDidCloneShadowNode(
*shadowNode.get(), *clonedShadowNode);
}

return clonedShadowNode;
}

void UIManager_appendChild(
const ShadowNode::Shared &parentShadowNode,
const ShadowNode::Shared &childShadowNode) {
// copied from UIManager.cpp
auto &componentDescriptor = parentShadowNode->getComponentDescriptor();
componentDescriptor.appendChild(parentShadowNode, childShadowNode);
return reinterpret_cast<const UIManagerPublic *>(uiManager)
->contextContainer_;
}

} // namespace reanimated
Expand Down
27 changes: 3 additions & 24 deletions Common/cpp/Fabric/FabricUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,16 @@
#ifdef RCT_NEW_ARCH_ENABLED

#ifdef ANDROID
#include <Binding.h>
#include <fbjni/fbjni.h>
#include <react/fabric/Binding.h>
#endif
#include <react/renderer/uimanager/UIManager.h>

#include <memory>
#include <string>

using namespace facebook::react;
using namespace facebook;
using namespace react;

namespace reanimated {

Expand Down Expand Up @@ -52,28 +53,6 @@ RuntimeExecutor getRuntimeExecutorFromBinding(Binding *binding);
std::shared_ptr<const ContextContainer> getContextContainerFromUIManager(
const UIManager *uiManager);

void UIManager_dispatchCommand(
const std::shared_ptr<UIManager> &uiManager,
const ShadowNode::Shared &shadowNode,
std::string const &commandName,
folly::dynamic const &args);

LayoutMetrics UIManager_getRelativeLayoutMetrics(
const std::shared_ptr<UIManager> &uiManager,
ShadowNode const &shadowNode,
ShadowNode const *ancestorShadowNode,
LayoutableShadowNode::LayoutInspectingPolicy policy);

ShadowNode::Shared UIManager_cloneNode(
const UIManager *uiManager,
const ShadowNode::Shared &shadowNode,
const ShadowNode::SharedListOfShared &children = nullptr,
const RawProps *rawProps = nullptr);

void UIManager_appendChild(
const ShadowNode::Shared &parentShadowNode,
const ShadowNode::Shared &childShadowNode);

} // namespace reanimated

#endif // RCT_NEW_ARCH_ENABLED
91 changes: 54 additions & 37 deletions Common/cpp/Fabric/ReanimatedUIManagerBinding.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
#include "FabricUtils.h"
#include "NewestShadowNodesRegistry.h"

#include <react/renderer/debug/SystraceSection.h>

#include <utility>

using namespace facebook;
Expand Down Expand Up @@ -51,7 +53,7 @@ ReanimatedUIManagerBinding::ReanimatedUIManagerBinding(
RuntimeExecutor runtimeExecutor,
std::unique_ptr<EventHandler const> eventHandler,
std::shared_ptr<NewestShadowNodesRegistry> newestShadowNodesRegistry)
: UIManagerBinding(uiManager, runtimeExecutor),
: UIManagerBinding(uiManager),
uiManager_(std::move(uiManager)),
newestShadowNodesRegistry_(newestShadowNodesRegistry) {
if (eventHandler != nullptr) {
Expand All @@ -62,25 +64,44 @@ ReanimatedUIManagerBinding::ReanimatedUIManagerBinding(

ReanimatedUIManagerBinding::~ReanimatedUIManagerBinding() {}

static inline ShadowNode::Shared cloneNode(
static inline ShadowNode::Shared cloneNodeUsingNewest(
UIManager *uiManager,
NewestShadowNodesRegistry *newestShadowNodesRegistry,
const ShadowNode::Shared &shadowNode,
const ShadowNode::SharedListOfShared &children = nullptr,
const RawProps *rawProps = nullptr) {
ShadowNode const &shadowNode,
ShadowNode::SharedListOfShared const &children = nullptr,
RawProps const *rawProps = nullptr) {
{
auto lock = newestShadowNodesRegistry->createLock();
auto newest = newestShadowNodesRegistry->get(shadowNode->getTag());
auto newest = newestShadowNodesRegistry->get(shadowNode.getTag());
if (newest != nullptr) {
// ShadowNode managed by Reanimated, use newest ShadowNode from registry
auto clone = UIManager_cloneNode(uiManager, newest, children, rawProps);
auto clone = uiManager->cloneNode(*newest, children, rawProps);
newestShadowNodesRegistry->update(clone);
return clone;
}
} // release lock since we don't need registry anymore

// ShadowNode not managed by Reanimated (yet?)
return UIManager_cloneNode(uiManager, shadowNode, children, rawProps);
return uiManager->cloneNode(shadowNode, children, rawProps);
}

static inline void appendChildUsingNewest(
UIManager *uiManager,
NewestShadowNodesRegistry *newestShadowNodesRegistry,
const ShadowNode::Shared &parentShadowNode,
const ShadowNode::Shared &childShadowNode) {
{
auto lock = newestShadowNodesRegistry->createLock();
auto newestChildShadowNode =
newestShadowNodesRegistry->get(childShadowNode->getTag());
if (newestChildShadowNode != nullptr) {
uiManager->appendChild(parentShadowNode, newestChildShadowNode);
return;
}
} // release lock since we don't need registry anymore

// child ShadowNode not managed by Reanimated (yet?)
uiManager->appendChild(parentShadowNode, childShadowNode);
}

jsi::Value ReanimatedUIManagerBinding::get(
Expand All @@ -94,6 +115,7 @@ jsi::Value ReanimatedUIManagerBinding::get(

// based on implementation from UIManagerBinding.cpp
auto methodName = name.utf8(runtime);
SystraceSection s("ReanimatedUIManagerBinding::get", "name", methodName);
UIManager *uiManager = uiManager_.get();
NewestShadowNodesRegistry *newestShadowNodesRegistry =
newestShadowNodesRegistry_.get();
Expand All @@ -106,15 +128,15 @@ jsi::Value ReanimatedUIManagerBinding::get(
1,
[uiManager, newestShadowNodesRegistry](
jsi::Runtime &runtime,
jsi::Value const &thisValue,
jsi::Value const & /*thisValue*/,
jsi::Value const *arguments,
size_t count) noexcept -> jsi::Value {
size_t /*count*/) noexcept -> jsi::Value {
return valueFromShadowNode(
runtime,
cloneNode(
cloneNodeUsingNewest(
uiManager,
newestShadowNodesRegistry,
shadowNodeFromValue(runtime, arguments[0])));
*shadowNodeFromValue(runtime, arguments[0])));
});
}

Expand All @@ -126,15 +148,15 @@ jsi::Value ReanimatedUIManagerBinding::get(
1,
[uiManager, newestShadowNodesRegistry](
jsi::Runtime &runtime,
jsi::Value const &thisValue,
jsi::Value const & /*thisValue*/,
jsi::Value const *arguments,
size_t count) noexcept -> jsi::Value {
size_t /*count*/) noexcept -> jsi::Value {
return valueFromShadowNode(
runtime,
cloneNode(
cloneNodeUsingNewest(
uiManager,
newestShadowNodesRegistry,
shadowNodeFromValue(runtime, arguments[0]),
*shadowNodeFromValue(runtime, arguments[0]),
ShadowNode::emptySharedShadowNodeSharedList()));
});
}
Expand All @@ -147,16 +169,16 @@ jsi::Value ReanimatedUIManagerBinding::get(
2,
[uiManager, newestShadowNodesRegistry](
jsi::Runtime &runtime,
jsi::Value const &thisValue,
jsi::Value const & /*thisValue*/,
jsi::Value const *arguments,
size_t count) noexcept -> jsi::Value {
size_t /*count*/) noexcept -> jsi::Value {
auto const &rawProps = RawProps(runtime, arguments[1]);
return valueFromShadowNode(
runtime,
cloneNode(
cloneNodeUsingNewest(
uiManager,
newestShadowNodesRegistry,
shadowNodeFromValue(runtime, arguments[0]),
*shadowNodeFromValue(runtime, arguments[0]),
nullptr,
&rawProps));
});
Expand All @@ -170,16 +192,16 @@ jsi::Value ReanimatedUIManagerBinding::get(
2,
[uiManager, newestShadowNodesRegistry](
jsi::Runtime &runtime,
jsi::Value const &thisValue,
jsi::Value const & /*thisValue*/,
jsi::Value const *arguments,
size_t count) noexcept -> jsi::Value {
size_t /*count*/) noexcept -> jsi::Value {
auto const &rawProps = RawProps(runtime, arguments[1]);
return valueFromShadowNode(
runtime,
cloneNode(
cloneNodeUsingNewest(
uiManager,
newestShadowNodesRegistry,
shadowNodeFromValue(runtime, arguments[0]),
*shadowNodeFromValue(runtime, arguments[0]),
ShadowNode::emptySharedShadowNodeSharedList(),
&rawProps));
});
Expand All @@ -190,21 +212,16 @@ jsi::Value ReanimatedUIManagerBinding::get(
runtime,
name,
2,
[newestShadowNodesRegistry](
[uiManager, newestShadowNodesRegistry](
jsi::Runtime &runtime,
jsi::Value const &thisValue,
jsi::Value const & /*thisValue*/,
jsi::Value const *arguments,
size_t count) noexcept -> jsi::Value {
auto parent = shadowNodeFromValue(runtime, arguments[0]);
auto child = shadowNodeFromValue(runtime, arguments[1]);
{
auto lock = newestShadowNodesRegistry->createLock();
auto newest = newestShadowNodesRegistry->get(child->getTag());
if (newest != nullptr) {
child = newest;
}
}
UIManager_appendChild(parent, child);
size_t /*count*/) noexcept -> jsi::Value {
appendChildUsingNewest(
uiManager,
newestShadowNodesRegistry,
shadowNodeFromValue(runtime, arguments[0]),
shadowNodeFromValue(runtime, arguments[1]));
return jsi::Value::undefined();
});
}
Expand Down
14 changes: 5 additions & 9 deletions Common/cpp/NativeModules/NativeReanimatedModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -597,9 +597,7 @@ void NativeReanimatedModule::dispatchCommand(
ShadowNode::Shared shadowNode = shadowNodeFromValue(rt, shadowNodeValue);
std::string commandName = stringFromValue(rt, commandNameValue);
folly::dynamic args = commandArgsFromValue(rt, argsValue);

// TODO: use uiManager_->dispatchCommand once it's public
UIManager_dispatchCommand(uiManager_, shadowNode, commandName, args);
uiManager_->dispatchCommand(shadowNode, commandName, args);
}

jsi::Value NativeReanimatedModule::measure(
Expand All @@ -608,11 +606,8 @@ jsi::Value NativeReanimatedModule::measure(
// based on implementation from UIManagerBinding.cpp

auto shadowNode = shadowNodeFromValue(rt, shadowNodeValue);
// TODO: use uiManager_->getRelativeLayoutMetrics once it's public
// auto layoutMetrics = uiManager_->getRelativeLayoutMetrics(
// *shadowNode, nullptr, {/* .includeTransform = */ true});
auto layoutMetrics = UIManager_getRelativeLayoutMetrics(
uiManager_, *shadowNode, nullptr, {/* .includeTransform = */ true});
auto layoutMetrics = uiManager_->getRelativeLayoutMetrics(
*shadowNode, nullptr, {/* .includeTransform = */ true});

if (layoutMetrics == EmptyLayoutMetrics) {
// Originally, in this case React Native returns `{0, 0, 0, 0, 0, 0}`, most
Expand All @@ -626,7 +621,8 @@ jsi::Value NativeReanimatedModule::measure(

auto layoutableShadowNode =
traitCast<LayoutableShadowNode const *>(newestCloneOfShadowNode.get());
facebook::react::Point originRelativeToParent = layoutableShadowNode
facebook::react::Point originRelativeToParent =
layoutableShadowNode != nullptr
? layoutableShadowNode->getLayoutMetrics().frame.origin
: facebook::react::Point();

Expand Down
Loading