diff --git a/node_modules/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.mm b/node_modules/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.mm index b0d71dc..41b9a0e 100644 --- a/node_modules/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.mm +++ b/node_modules/react-native/Libraries/Text/TextInput/RCTBaseTextInputView.mm @@ -377,10 +377,6 @@ - (void)textInputDidBeginEditing self.backedTextInputView.attributedText = [NSAttributedString new]; } - if (_selectTextOnFocus) { - [self.backedTextInputView selectAll:nil]; - } - [_eventDispatcher sendTextEventWithType:RCTTextEventTypeFocus reactTag:self.reactTag text:[self.backedTextInputView.attributedText.string copy] @@ -611,6 +607,10 @@ - (UIView *)reactAccessibilityElement - (void)reactFocus { [self.backedTextInputView reactFocus]; + + if (_selectTextOnFocus) { + [self.backedTextInputView selectAll:nil]; + } } - (void)reactBlur diff --git a/node_modules/react-native/React/Fabric/Mounting/RCTMountingManager.mm b/node_modules/react-native/React/Fabric/Mounting/RCTMountingManager.mm index 0e2323f..c7c5b53 100644 --- a/node_modules/react-native/React/Fabric/Mounting/RCTMountingManager.mm +++ b/node_modules/react-native/React/Fabric/Mounting/RCTMountingManager.mm @@ -82,8 +82,8 @@ static void RCTPerformMountInstructions( RCTAssert(newChildShadowView.props, @"`newChildShadowView.props` must not be null."); - [newChildComponentView updateProps:newChildShadowView.props oldProps:nullptr]; [newChildComponentView updateEventEmitter:newChildShadowView.eventEmitter]; + [newChildComponentView updateProps:newChildShadowView.props oldProps:nullptr]; [newChildComponentView updateState:newChildShadowView.state oldState:nullptr]; [newChildComponentView updateLayoutMetrics:newChildShadowView.layoutMetrics oldLayoutMetrics:EmptyLayoutMetrics]; diff --git a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h index e9b330f..1ecdf0a 100644 --- a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h +++ b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h @@ -16,4 +16,6 @@ @property (nonatomic, copy) RCTDirectEventBlock onRefresh; @property (nonatomic, weak) UIScrollView *scrollView; +- (void)forwarderBeginRefreshing; + @end diff --git a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m index b09e653..f93cb46 100644 --- a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m +++ b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m @@ -198,9 +198,53 @@ - (void)refreshControlValueChanged [self setCurrentRefreshingState:super.refreshing]; _refreshingProgrammatically = NO; + if (@available(iOS 17.4, *)) { + if (_currentRefreshingState) { + UIImpactFeedbackGenerator *feedbackGenerator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleLight]; + [feedbackGenerator prepare]; + [feedbackGenerator impactOccurred]; + } + } + if (_onRefresh) { _onRefresh(nil); } } +/* + This method is used by Bluesky's ExpoScrollForwarder. This allows other React Native + libraries to perform a refresh of a scrollview and access the refresh control's onRefresh + function. + */ +- (void)forwarderBeginRefreshing +{ + _refreshingProgrammatically = NO; + + [self sizeToFit]; + + if (!self.scrollView) { + return; + } + + UIScrollView *scrollView = (UIScrollView *)self.scrollView; + + [UIView animateWithDuration:0.3 + delay:0 + options:UIViewAnimationOptionBeginFromCurrentState + animations:^(void) { + // Whenever we call this method, the scrollview will always be at a position of + // -130 or less. Scrolling back to -65 simulates the default behavior of RCTRefreshControl + [scrollView setContentOffset:CGPointMake(0, -65)]; + } + completion:^(__unused BOOL finished) { + [super beginRefreshing]; + [self setCurrentRefreshingState:super.refreshing]; + + if (self->_onRefresh) { + self->_onRefresh(nil); + } + } + ]; +} + @end