Skip to content

Commit d9c93ba

Browse files
committed
Init button wrapper shadow node
1 parent 6c99f4b commit d9c93ba

File tree

7 files changed

+195
-1
lines changed

7 files changed

+195
-1
lines changed

packages/react-native-gesture-handler/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,8 @@
137137
"ios": {
138138
"componentProvider": {
139139
"RNGestureHandlerButton": "RNGestureHandlerButtonComponentView",
140-
"RNGestureHandlerDetector": "RNGestureHandlerDetector"
140+
"RNGestureHandlerDetector": "RNGestureHandlerDetector",
141+
"RNGestureHandlerButtonWrapper": "RNGestureHandlerButtonWrapper"
141142
}
142143
}
143144
},

packages/react-native-gesture-handler/shared/shadowNodes/react/renderer/components/rngesturehandler_codegen/ComponentDescriptors.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@
1515
#include <react/renderer/components/rngesturehandler_codegen/ShadowNodes.h>
1616
#include <react/renderer/core/ConcreteComponentDescriptor.h>
1717

18+
#include <react/renderer/components/rngesturehandler_codegen/RNGestureHandlerButtonWrapperComponentDescriptor.h>
1819
#include <react/renderer/components/rngesturehandler_codegen/RNGestureHandlerDetectorComponentDescriptor.h>
1920

2021
namespace facebook::react {
2122

2223
using RNGestureHandlerButtonComponentDescriptor =
2324
ConcreteComponentDescriptor<RNGestureHandlerButtonShadowNode>;
25+
2426
using RNGestureHandlerRootViewComponentDescriptor =
2527
ConcreteComponentDescriptor<RNGestureHandlerRootViewShadowNode>;
2628

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
2+
/**
3+
* This code was generated by
4+
* [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
5+
*
6+
* Do not edit this file as changes may cause incorrect behavior and will be
7+
* lost once the code is regenerated.
8+
*
9+
* @generated by codegen project: GenerateComponentDescriptorH.js
10+
*/
11+
12+
#pragma once
13+
14+
#include <react/renderer/core/ConcreteComponentDescriptor.h>
15+
16+
#include "RNGestureHandlerButtonWrapperShadowNode.h"
17+
18+
namespace facebook::react {
19+
20+
class RNGestureHandlerButtonWrapperComponentDescriptor final
21+
: public ConcreteComponentDescriptor<
22+
RNGestureHandlerButtonWrapperShadowNode> {
23+
using ConcreteComponentDescriptor::ConcreteComponentDescriptor;
24+
void adopt(ShadowNode &shadowNode) const override {
25+
react_native_assert(
26+
dynamic_cast<RNGestureHandlerButtonWrapperShadowNode *>(&shadowNode));
27+
28+
ConcreteComponentDescriptor::adopt(shadowNode);
29+
}
30+
};
31+
32+
} // namespace facebook::react
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
2+
/**
3+
* This code was generated by
4+
* [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
5+
*
6+
* Do not edit this file as changes may cause incorrect behavior and will be
7+
* lost once the code is regenerated.
8+
*
9+
* @generated by codegen project: GenerateShadowNodeCpp.js
10+
*/
11+
12+
#include "RNGestureHandlerButtonWrapperShadowNode.h"
13+
14+
namespace facebook::react {
15+
16+
extern const char RNGestureHandlerButtonWrapperComponentName[] =
17+
"RNGestureHandlerButtonWrapper";
18+
19+
void RNGestureHandlerButtonWrapperShadowNode::initialize() {
20+
// Disable forcing view flattening
21+
ShadowNode::traits_.unset(ShadowNodeTraits::ForceFlattenView);
22+
23+
// When the button wrapper is cloned and has a child node, the child node
24+
// should be cloned as well to ensure it is mutable.
25+
const auto &children = getChildren();
26+
if (!children.empty()) {
27+
react_native_assert(
28+
children.size() == 1 &&
29+
"RNGestureHandlerButtonWrapper received more than one child");
30+
31+
const auto clonedChild = children[0]->clone({});
32+
replaceChild(*children[0], clonedChild);
33+
}
34+
}
35+
36+
void RNGestureHandlerButtonWrapperShadowNode::layout(
37+
LayoutContext layoutContext) {
38+
YogaLayoutableShadowNode::layout(layoutContext);
39+
// TODO: consider allowing more than one child and doing bounding box
40+
react_native_assert(getChildren().size() == 1);
41+
42+
auto child = std::static_pointer_cast<const YogaLayoutableShadowNode>(
43+
getChildren()[0]);
44+
45+
child->ensureUnsealed();
46+
auto mutableChild = std::const_pointer_cast<YogaLayoutableShadowNode>(child);
47+
48+
// TODO: figure out the correct way to setup metrics between button wrapper
49+
// and the child
50+
auto metrics = child->getLayoutMetrics();
51+
metrics.frame = child->getLayoutMetrics().frame;
52+
setLayoutMetrics(metrics);
53+
54+
auto childmetrics = child->getLayoutMetrics();
55+
childmetrics.frame.origin = Point{};
56+
mutableChild->setLayoutMetrics(childmetrics);
57+
}
58+
59+
} // namespace facebook::react
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
2+
/**
3+
* This code was generated by
4+
* [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
5+
*
6+
* Do not edit this file as changes may cause incorrect behavior and will be
7+
* lost once the code is regenerated.
8+
*
9+
* @generated by codegen project: GenerateShadowNodeH.js
10+
*/
11+
12+
#pragma once
13+
14+
#include <jsi/jsi.h>
15+
#include <react/renderer/components/rngesturehandler_codegen/EventEmitters.h>
16+
#include <react/renderer/components/rngesturehandler_codegen/Props.h>
17+
#include <react/renderer/components/view/ConcreteViewShadowNode.h>
18+
#include <react/renderer/core/LayoutContext.h>
19+
20+
#include "RNGestureHandlerButtonWrapperState.h"
21+
22+
namespace facebook::react {
23+
24+
JSI_EXPORT extern const char RNGestureHandlerButtonWrapperComponentName[];
25+
26+
/*
27+
* `ShadowNode` for <RNGestureHandlerButtonWrapper> component.
28+
*/
29+
class RNGestureHandlerButtonWrapperShadowNode final
30+
: public ConcreteViewShadowNode<
31+
RNGestureHandlerButtonWrapperComponentName,
32+
RNGestureHandlerButtonWrapperProps,
33+
RNGestureHandlerButtonWrapperEventEmitter,
34+
RNGestureHandlerButtonWrapperState> {
35+
public:
36+
RNGestureHandlerButtonWrapperShadowNode(
37+
const ShadowNodeFragment &fragment,
38+
const ShadowNodeFamily::Shared &family,
39+
ShadowNodeTraits traits)
40+
: ConcreteViewShadowNode(fragment, family, traits) {
41+
initialize();
42+
}
43+
44+
RNGestureHandlerButtonWrapperShadowNode(
45+
const ShadowNode &sourceShadowNode,
46+
const ShadowNodeFragment &fragment)
47+
: ConcreteViewShadowNode(sourceShadowNode, fragment) {
48+
initialize();
49+
}
50+
51+
void layout(LayoutContext layoutContext) override;
52+
53+
private:
54+
void initialize();
55+
};
56+
57+
} // namespace facebook::react
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/**
2+
* This code was generated by
3+
* [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
4+
*
5+
* Do not edit this file as changes may cause incorrect behavior and will be
6+
* lost once the code is regenerated.
7+
*
8+
* @generated by codegen project: GenerateStateH.js
9+
*/
10+
#pragma once
11+
12+
#ifdef ANDROID
13+
#include <folly/dynamic.h>
14+
#endif
15+
16+
namespace facebook::react {
17+
18+
class RNGestureHandlerButtonWrapperState {
19+
public:
20+
RNGestureHandlerButtonWrapperState() = default;
21+
22+
#ifdef ANDROID
23+
RNGestureHandlerButtonWrapperState(
24+
RNGestureHandlerButtonWrapperState const &previousState,
25+
folly::dynamic data){};
26+
folly::dynamic getDynamic() const {
27+
return {};
28+
};
29+
#endif
30+
};
31+
32+
} // namespace facebook::react
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent';
2+
import type { ViewProps } from 'react-native';
3+
4+
interface NativeProps extends ViewProps {}
5+
6+
export default codegenNativeComponent<NativeProps>(
7+
'RNGestureHandlerButtonWrapper',
8+
{
9+
interfaceOnly: true,
10+
}
11+
);

0 commit comments

Comments
 (0)