Skip to content

Commit acb4564

Browse files
zhongwuzwreact-native-bot
authored andcommitted
Fabric: Added ScrollEndDragEvent for scrollEndDrag event (#48319)
Summary: Fixes #42533 . ## Changelog: [IOS] [FIXED] - Fabric: Added ScrollEndDragEvent for scrollEndDrag event Pull Request resolved: #48319 Test Plan: Repro please see #42533 . Reviewed By: javache Differential Revision: D67517912 Pulled By: cipolleschi fbshipit-source-id: aa1caebfb690d09a207b3ebce382eceb520009e5
1 parent 9469ec7 commit acb4564

File tree

5 files changed

+77
-6
lines changed

5 files changed

+77
-6
lines changed

packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,17 @@ - (BOOL)_shouldDisableScrollInteraction
547547
return metrics;
548548
}
549549

550+
- (ScrollViewEventEmitter::EndDragMetrics)_scrollViewMetricsWithVelocity:(CGPoint)velocity
551+
andTargetContentOffset:(CGPoint)targetContentOffset
552+
{
553+
ScrollViewEventEmitter::EndDragMetrics metrics = [self _scrollViewMetrics];
554+
metrics.targetContentOffset.x = targetContentOffset.x;
555+
metrics.targetContentOffset.y = targetContentOffset.y;
556+
metrics.velocity.x = velocity.x;
557+
metrics.velocity.y = velocity.y;
558+
return metrics;
559+
}
560+
550561
- (void)_updateStateWithContentOffset
551562
{
552563
if (!_state) {
@@ -602,6 +613,14 @@ - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
602613
targetContentOffset->y = scrollView.contentOffset.y + travel * _endDraggingSensitivityMultiplier;
603614
}
604615
}
616+
617+
if (!_eventEmitter) {
618+
return;
619+
}
620+
621+
auto metrics = [self _scrollViewMetricsWithVelocity:velocity andTargetContentOffset:*targetContentOffset];
622+
623+
static_cast<const ScrollViewEventEmitter &>(*_eventEmitter).onScrollEndDrag(metrics);
605624
}
606625

607626
- (BOOL)touchesShouldCancelInContentView:(__unused UIView *)view
@@ -672,8 +691,6 @@ - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL
672691
return;
673692
}
674693

675-
static_cast<const ScrollViewEventEmitter &>(*_eventEmitter).onScrollEndDrag([self _scrollViewMetrics]);
676-
677694
[self _updateStateWithContentOffset];
678695

679696
if (!decelerate) {
@@ -770,7 +787,9 @@ - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(nullable UI
770787
return;
771788
}
772789

773-
static_cast<const ScrollViewEventEmitter &>(*_eventEmitter).onScrollEndDrag([self _scrollViewMetrics]);
790+
auto metrics = [self _scrollViewMetricsWithVelocity:{} andTargetContentOffset:{}];
791+
static_cast<const ScrollViewEventEmitter &>(*_eventEmitter).onScrollEndDrag(metrics);
792+
774793
[self _updateStateWithContentOffset];
775794
}
776795

packages/react-native/ReactCommon/react/renderer/components/scrollview/ScrollEvent.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,39 @@ EventPayloadType ScrollEvent::getType() const {
7676
return EventPayloadType::ScrollEvent;
7777
}
7878

79+
jsi::Value ScrollEndDragEvent::asJSIValue(jsi::Runtime& runtime) const {
80+
auto payload = ScrollEvent::asJSIValue(runtime).asObject(runtime);
81+
82+
{
83+
auto targetContentOffsetObj = jsi::Object(runtime);
84+
targetContentOffsetObj.setProperty(runtime, "x", targetContentOffset.x);
85+
targetContentOffsetObj.setProperty(runtime, "y", targetContentOffset.y);
86+
payload.setProperty(runtime, "targetContentOffset", targetContentOffsetObj);
87+
}
88+
89+
{
90+
auto velocityObj = jsi::Object(runtime);
91+
velocityObj.setProperty(runtime, "x", velocity.x);
92+
velocityObj.setProperty(runtime, "y", velocity.y);
93+
payload.setProperty(runtime, "velocity", velocityObj);
94+
}
95+
96+
return payload;
97+
}
98+
99+
folly::dynamic ScrollEndDragEvent::asDynamic() const {
100+
auto metrics = ScrollEvent::asDynamic();
101+
102+
auto targetContentOffsetObj = folly::dynamic::object(
103+
"x", targetContentOffset.x)("y", targetContentOffset.y);
104+
metrics["targetContentOffset"] = std::move(targetContentOffsetObj);
105+
106+
auto velocityObj = folly::dynamic::object("x", velocity.x)("y", velocity.y);
107+
metrics["velocity"] = std::move(velocityObj);
108+
109+
return metrics;
110+
};
111+
79112
#if RN_DEBUG_STRING_CONVERTIBLE
80113

81114
std::string getDebugName(const ScrollEvent& /*scrollEvent*/) {

packages/react-native/ReactCommon/react/renderer/components/scrollview/ScrollEvent.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,23 @@ struct ScrollEvent : public EventPayload {
3737
EventPayloadType getType() const override;
3838
};
3939

40+
struct ScrollEndDragEvent : public ScrollEvent {
41+
Point targetContentOffset;
42+
Point velocity;
43+
44+
ScrollEndDragEvent() = default;
45+
46+
ScrollEndDragEvent(const ScrollEvent& scrollEvent)
47+
: ScrollEvent(scrollEvent), targetContentOffset({}), velocity({}) {}
48+
49+
folly::dynamic asDynamic() const;
50+
51+
/*
52+
* EventPayload implementations
53+
*/
54+
jsi::Value asJSIValue(jsi::Runtime& runtime) const override;
55+
};
56+
4057
#if RN_DEBUG_STRING_CONVERTIBLE
4158

4259
std::string getDebugName(const ScrollEvent& scrollEvent);

packages/react-native/ReactCommon/react/renderer/components/scrollview/ScrollViewEventEmitter.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@ void ScrollViewEventEmitter::onScrollBeginDrag(
2525
}
2626

2727
void ScrollViewEventEmitter::onScrollEndDrag(
28-
const ScrollEvent& scrollEvent) const {
29-
dispatchScrollViewEvent("scrollEndDrag", scrollEvent);
28+
const ScrollEndDragEvent& scrollEvent) const {
29+
dispatchEvent(
30+
"scrollEndDrag", std::make_shared<ScrollEndDragEvent>(scrollEvent));
3031
}
3132

3233
void ScrollViewEventEmitter::onMomentumScrollBegin(

packages/react-native/ReactCommon/react/renderer/components/scrollview/ScrollViewEventEmitter.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,11 @@ class ScrollViewEventEmitter : public ViewEventEmitter {
2121
using ViewEventEmitter::ViewEventEmitter;
2222

2323
using Metrics = ScrollEvent;
24+
using EndDragMetrics = ScrollEndDragEvent;
2425

2526
void onScroll(const ScrollEvent& scrollEvent) const;
2627
void onScrollBeginDrag(const ScrollEvent& scrollEvent) const;
27-
void onScrollEndDrag(const ScrollEvent& scrollEvent) const;
28+
void onScrollEndDrag(const ScrollEndDragEvent& scrollEvent) const;
2829
void onMomentumScrollBegin(const ScrollEvent& scrollEvent) const;
2930
void onMomentumScrollEnd(const ScrollEvent& scrollEvent) const;
3031
void onScrollToTop(const ScrollEvent& scrollEvent) const;

0 commit comments

Comments
 (0)