Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,16 @@ - (void)boundsDidChange:(CGRect)newBounds
}

if (_state != nullptr) {
auto newState = ModalHostViewState{RCTSizeFromCGSize(newBounds.size)};
CGPoint viewportOffset = CGPointZero;
UIView *modalView = _viewController.view;
if (modalView && modalView.window) {
CGRect frameInWindow = [modalView convertRect:modalView.bounds toView:nil];
viewportOffset = frameInWindow.origin;
}
auto newState = ModalHostViewState{
RCTSizeFromCGSize(newBounds.size),
facebook::react::Point{(Float)viewportOffset.x, (Float)viewportOffset.y}
};
_state->updateState(std::move(newState));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,9 @@ namespace facebook::react {

extern const char ModalHostViewComponentName[] = "ModalHostView";

Transform ModalHostViewShadowNode::getTransform() const {
auto viewportOffset = getStateData().viewportOffset;
return Transform::Translate(viewportOffset.x, viewportOffset.y, 0);
}

} // namespace facebook::react
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ class ModalHostViewShadowNode final : public ConcreteViewShadowNode<
traits.set(ShadowNodeTraits::Trait::Unstable_uncullableView);
return traits;
}

Transform getTransform() const override;
};

} // namespace facebook::react
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ namespace facebook::react {
#ifdef RN_SERIALIZABLE_STATE
folly::dynamic ModalHostViewState::getDynamic() const {
return folly::dynamic::object("screenWidth", screenSize.width)(
"screenHeight", screenSize.height);
"screenHeight", screenSize.height)(
"viewportOffsetX", viewportOffset.x)(
"viewportOffsetY", viewportOffset.y);
}
#endif

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,21 @@ class ModalHostViewState final {

ModalHostViewState() : screenSize(ModalHostViewScreenSize()) {}
ModalHostViewState(Size screenSize_) : screenSize(screenSize_) {};
ModalHostViewState(Size screenSize_, Point viewportOffset_)
: screenSize(screenSize_), viewportOffset(viewportOffset_) {};

#ifdef RN_SERIALIZABLE_STATE
ModalHostViewState(const ModalHostViewState &previousState, folly::dynamic data)
: screenSize(
Size{.width = (Float)data["screenWidth"].getDouble(), .height = (Float)data["screenHeight"].getDouble()}) {
Size{.width = (Float)data["screenWidth"].getDouble(), .height = (Float)data["screenHeight"].getDouble()}),
viewportOffset(
Point{.x = data.count("viewportOffsetX") ? (Float)data["viewportOffsetX"].getDouble() : 0.0f,
.y = data.count("viewportOffsetY") ? (Float)data["viewportOffsetY"].getDouble() : 0.0f}) {
};
#endif

const Size screenSize{};
const Point viewportOffset{};

#ifdef RN_SERIALIZABLE_STATE
folly::dynamic getDynamic() const;
Expand Down
Loading