Skip to content

Commit 9931aeb

Browse files
coadometa-codesync[bot]
authored andcommitted
Add support for position props (#54752)
Summary: Pull Request resolved: #54752 Adds support for positional `left`, `top`, `right`, `bottom` props to the animation backend. ## Changelog: [GENERAL][ADDED] - Added support for positional `left`, `top`, `right`, `bottom` props to the animation backend. Reviewed By: zeyap Differential Revision: D88152233 fbshipit-source-id: 343295120575c3cf7b9424a329675292643b6f8e
1 parent cd4744c commit 9931aeb

5 files changed

Lines changed: 52 additions & 1 deletion

File tree

packages/react-native/ReactCommon/react/renderer/animationbackend/AnimatedPropSerializer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ void packAnimatedProp(
151151
case FLEX:
152152
case PADDING:
153153
case MARGIN:
154+
case POSITION:
154155
throw std::runtime_error("Tried to synchronously update layout props");
155156
}
156157
}

packages/react-native/ReactCommon/react/renderer/animationbackend/AnimatedProps.h

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ enum PropName {
1919
BORDER_RADII,
2020
MARGIN,
2121
PADDING,
22+
POSITION,
2223
FLEX,
2324
TRANSFORM,
2425
BACKGROUND_COLOR,
@@ -141,6 +142,38 @@ inline void cloneProp(BaseViewProps &viewProps, const AnimatedPropBase &animated
141142
break;
142143
}
143144

145+
case POSITION: {
146+
const auto &positions = get<CascadedRectangleEdges<yoga::StyleLength>>(animatedProp);
147+
if (positions.left.has_value()) {
148+
viewProps.yogaStyle.setPosition(yoga::Edge::Left, positions.left.value());
149+
}
150+
if (positions.top.has_value()) {
151+
viewProps.yogaStyle.setPosition(yoga::Edge::Top, positions.top.value());
152+
}
153+
if (positions.right.has_value()) {
154+
viewProps.yogaStyle.setPosition(yoga::Edge::Right, positions.right.value());
155+
}
156+
if (positions.bottom.has_value()) {
157+
viewProps.yogaStyle.setPosition(yoga::Edge::Bottom, positions.bottom.value());
158+
}
159+
if (positions.start.has_value()) {
160+
viewProps.yogaStyle.setPosition(yoga::Edge::Start, positions.start.value());
161+
}
162+
if (positions.end.has_value()) {
163+
viewProps.yogaStyle.setPosition(yoga::Edge::End, positions.end.value());
164+
}
165+
if (positions.horizontal.has_value()) {
166+
viewProps.yogaStyle.setPosition(yoga::Edge::Horizontal, positions.horizontal.value());
167+
}
168+
if (positions.vertical.has_value()) {
169+
viewProps.yogaStyle.setPosition(yoga::Edge::Vertical, positions.vertical.value());
170+
}
171+
if (positions.all.has_value()) {
172+
viewProps.yogaStyle.setPosition(yoga::Edge::All, positions.all.value());
173+
}
174+
break;
175+
}
176+
144177
case FLEX:
145178
viewProps.yogaStyle.setFlex(get<yoga::FloatOptional>(animatedProp));
146179
break;

packages/react-native/ReactCommon/react/renderer/animationbackend/AnimatedPropsBuilder.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ struct AnimatedPropsBuilder {
3939
{
4040
props.push_back(std::make_unique<AnimatedProp<CascadedRectangleEdges<yoga::StyleLength>>>(PADDING, value));
4141
}
42+
void setPosition(CascadedRectangleEdges<yoga::StyleLength> &value)
43+
{
44+
props.push_back(std::make_unique<AnimatedProp<CascadedRectangleEdges<yoga::StyleLength>>>(POSITION, value));
45+
}
4246
void setTransform(Transform &t)
4347
{
4448
props.push_back(std::make_unique<AnimatedProp<Transform>>(TRANSFORM, std::move(t)));

packages/react-native/ReactCommon/react/renderer/animationbackend/AnimatedPropsRegistry.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,18 @@ inline void updateProp(const PropName propName, BaseViewProps &viewProps, const
115115
viewProps.yogaStyle.setPadding(yoga::Edge::Horizontal, snapshot.props.yogaStyle.padding(yoga::Edge::Horizontal));
116116
viewProps.yogaStyle.setPadding(yoga::Edge::Vertical, snapshot.props.yogaStyle.padding(yoga::Edge::Vertical));
117117
break;
118+
119+
case POSITION:
120+
viewProps.yogaStyle.setPosition(yoga::Edge::Left, snapshot.props.yogaStyle.position(yoga::Edge::Left));
121+
viewProps.yogaStyle.setPosition(yoga::Edge::Right, snapshot.props.yogaStyle.position(yoga::Edge::Right));
122+
viewProps.yogaStyle.setPosition(yoga::Edge::Top, snapshot.props.yogaStyle.position(yoga::Edge::Top));
123+
viewProps.yogaStyle.setPosition(yoga::Edge::Bottom, snapshot.props.yogaStyle.position(yoga::Edge::Bottom));
124+
viewProps.yogaStyle.setPosition(yoga::Edge::Start, snapshot.props.yogaStyle.position(yoga::Edge::Start));
125+
viewProps.yogaStyle.setPosition(yoga::Edge::End, snapshot.props.yogaStyle.position(yoga::Edge::End));
126+
viewProps.yogaStyle.setPosition(
127+
yoga::Edge::Horizontal, snapshot.props.yogaStyle.position(yoga::Edge::Horizontal));
128+
viewProps.yogaStyle.setPosition(yoga::Edge::Vertical, snapshot.props.yogaStyle.position(yoga::Edge::Vertical));
129+
break;
118130
}
119131
}
120132

packages/react-native/ReactCommon/react/renderer/animationbackend/AnimationBackend.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ static inline bool mutationHasLayoutUpdates(
5555
// TODO: there should also be a check for the dynamic part
5656
if (animatedProp->propName == WIDTH || animatedProp->propName == HEIGHT ||
5757
animatedProp->propName == FLEX || animatedProp->propName == MARGIN ||
58-
animatedProp->propName == PADDING) {
58+
animatedProp->propName == PADDING ||
59+
animatedProp->propName == POSITION) {
5960
return true;
6061
}
6162
}

0 commit comments

Comments
 (0)