ff731849b0
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: Eric Bailey <git@esb.lol>
169 lines
7.0 KiB
Diff
169 lines
7.0 KiB
Diff
diff --git a/React/Fabric/Mounting/ComponentViews/ScrollView/RCTPullToRefreshViewComponentView.h b/React/Fabric/Mounting/ComponentViews/ScrollView/RCTPullToRefreshViewComponentView.h
|
|
index 914a2494a57923fbf185644b7e2bb8aca8848e56..0deac55f22350f5e8377d8963fb1c2434bf6abfd 100644
|
|
--- a/React/Fabric/Mounting/ComponentViews/ScrollView/RCTPullToRefreshViewComponentView.h
|
|
+++ b/React/Fabric/Mounting/ComponentViews/ScrollView/RCTPullToRefreshViewComponentView.h
|
|
@@ -19,6 +19,8 @@ NS_ASSUME_NONNULL_BEGIN
|
|
*/
|
|
@interface RCTPullToRefreshViewComponentView : RCTViewComponentView <RCTCustomPullToRefreshViewProtocol>
|
|
|
|
+- (void)beginRefreshingProgrammatically;
|
|
+
|
|
@end
|
|
|
|
NS_ASSUME_NONNULL_END
|
|
diff --git a/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm b/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm
|
|
index 1494fd225aff1fa0429e917404d6b4ca5fc961c5..df643f5c844ad2e684de5161528eba17f4a188d0 100644
|
|
--- a/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm
|
|
+++ b/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm
|
|
@@ -1038,6 +1038,11 @@ - (void)_adjustForMaintainVisibleContentPosition
|
|
}
|
|
}
|
|
|
|
++ (BOOL)shouldBeRecycled
|
|
+{
|
|
+ return NO;
|
|
+}
|
|
+
|
|
@end
|
|
|
|
Class<RCTComponentViewProtocol> RCTScrollViewCls(void)
|
|
diff --git a/React/Views/RefreshControl/RCTRefreshControl.h b/React/Views/RefreshControl/RCTRefreshControl.h
|
|
index e9b330fa7c29c42653a3b0191d0f8a1b13b2d3de..ec5f58c887bfd949f1279ef1c31352e0b465e9ec 100644
|
|
--- a/React/Views/RefreshControl/RCTRefreshControl.h
|
|
+++ b/React/Views/RefreshControl/RCTRefreshControl.h
|
|
@@ -15,5 +15,8 @@
|
|
@property (nonatomic, copy) NSString *title;
|
|
@property (nonatomic, copy) RCTDirectEventBlock onRefresh;
|
|
@property (nonatomic, weak) UIScrollView *scrollView;
|
|
+@property (nonatomic, copy) UIColor *customTintColor;
|
|
+
|
|
+- (void)forwarderBeginRefreshing;
|
|
|
|
@end
|
|
diff --git a/React/Views/RefreshControl/RCTRefreshControl.m b/React/Views/RefreshControl/RCTRefreshControl.m
|
|
index 53bfd04703502d5b8e932c47a528bb03cd79d330..ff1b1ed5e060bcf0d91528c6d3c2c5c8acf24967 100644
|
|
--- a/React/Views/RefreshControl/RCTRefreshControl.m
|
|
+++ b/React/Views/RefreshControl/RCTRefreshControl.m
|
|
@@ -23,6 +23,7 @@ @implementation RCTRefreshControl {
|
|
UIColor *_titleColor;
|
|
CGFloat _progressViewOffset;
|
|
BOOL _hasMovedToWindow;
|
|
+ UIColor *_customTintColor;
|
|
}
|
|
|
|
- (instancetype)init
|
|
@@ -58,6 +59,12 @@ - (void)layoutSubviews
|
|
_isInitialRender = false;
|
|
}
|
|
|
|
+- (void)didMoveToSuperview
|
|
+{
|
|
+ [super didMoveToSuperview];
|
|
+ [self setTintColor:_customTintColor];
|
|
+}
|
|
+
|
|
- (void)didMoveToWindow
|
|
{
|
|
[super didMoveToWindow];
|
|
@@ -221,4 +228,50 @@ - (void)refreshControlValueChanged
|
|
}
|
|
}
|
|
|
|
+// Fix for https://github.com/facebook/react-native/issues/43388
|
|
+// A bug in iOS 17.4 causes the haptic to not play when refreshing if the tintColor
|
|
+// is set before the refresh control gets added to the scrollview. We'll call this
|
|
+// function whenever the superview changes. We'll also call it if the value of customTintColor
|
|
+// changes.
|
|
+- (void)setTintColor:(UIColor *)tintColor
|
|
+{
|
|
+ if ([self.superview isKindOfClass:[UIScrollView class]] && self.tintColor != tintColor) {
|
|
+ [super setTintColor:tintColor];
|
|
+ }
|
|
+}
|
|
+
|
|
+// 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
|
|
diff --git a/React/Views/RefreshControl/RCTRefreshControlManager.m b/React/Views/RefreshControl/RCTRefreshControlManager.m
|
|
index 40aaf9c51ebda9fedb1d1db2e9aacec84b4c39c8..1c60164b69762997b3369b46609a07768a06bad3 100644
|
|
--- a/React/Views/RefreshControl/RCTRefreshControlManager.m
|
|
+++ b/React/Views/RefreshControl/RCTRefreshControlManager.m
|
|
@@ -22,11 +22,12 @@ - (UIView *)view
|
|
|
|
RCT_EXPORT_VIEW_PROPERTY(onRefresh, RCTDirectEventBlock)
|
|
RCT_EXPORT_VIEW_PROPERTY(refreshing, BOOL)
|
|
-RCT_EXPORT_VIEW_PROPERTY(tintColor, UIColor)
|
|
RCT_EXPORT_VIEW_PROPERTY(title, NSString)
|
|
RCT_EXPORT_VIEW_PROPERTY(titleColor, UIColor)
|
|
RCT_EXPORT_VIEW_PROPERTY(progressViewOffset, CGFloat)
|
|
|
|
+RCT_REMAP_VIEW_PROPERTY(tintColor, customTintColor, UIColor)
|
|
+
|
|
RCT_EXPORT_METHOD(setNativeRefreshing : (nonnull NSNumber *)viewTag toRefreshing : (BOOL)refreshing)
|
|
{
|
|
[self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
|
diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/core/JavaTimerManager.kt b/ReactAndroid/src/main/java/com/facebook/react/modules/core/JavaTimerManager.kt
|
|
index 8b6571698fc5dd091a0d8980a33bb40295faf305..27c97bfeb6f13907c89f1d85f2bb8b8af7bdfb43 100644
|
|
--- a/ReactAndroid/src/main/java/com/facebook/react/modules/core/JavaTimerManager.kt
|
|
+++ b/ReactAndroid/src/main/java/com/facebook/react/modules/core/JavaTimerManager.kt
|
|
@@ -313,8 +313,9 @@ public open class JavaTimerManager(
|
|
// We also capture the idleCallbackRunnable to tentatively fix:
|
|
// https://github.com/facebook/react-native/issues/44842
|
|
currentIdleCallbackRunnable?.cancel()
|
|
- currentIdleCallbackRunnable = IdleCallbackRunnable(frameTimeNanos)
|
|
- reactApplicationContext.runOnJSQueueThread(currentIdleCallbackRunnable)
|
|
+ val idleCallbackRunnable = IdleCallbackRunnable(frameTimeNanos)
|
|
+ currentIdleCallbackRunnable = idleCallbackRunnable
|
|
+ reactApplicationContext.runOnJSQueueThread(idleCallbackRunnable)
|
|
reactChoreographer.postFrameCallback(ReactChoreographer.CallbackType.IDLE_EVENT, this)
|
|
}
|
|
}
|
|
diff --git a/third-party-podspecs/fmt.podspec b/third-party-podspecs/fmt.podspec
|
|
index 2f38990e226c13f483aaf1b986302d4094243814..9b02e481e290299be20a6f09c42056ff51695e9b 100644
|
|
--- a/third-party-podspecs/fmt.podspec
|
|
+++ b/third-party-podspecs/fmt.podspec
|
|
@@ -26,4 +26,11 @@ Pod::Spec.new do |spec|
|
|
spec.public_header_files = "include/fmt/*.h"
|
|
spec.header_mappings_dir = "include"
|
|
spec.source_files = ["include/fmt/*.h", "src/format.cc"]
|
|
+
|
|
+ # TODO: Remove after upgrading React Native past 0.83.x
|
|
+ # Fix fmt 11.0.2 consteval build error with Xcode 26.4 (facebook/react-native#55601)
|
|
+ # Fixed in RN 0.84+ which bumps fmt to a compatible version.
|
|
+ spec.prepare_command = <<~SCRIPT
|
|
+ perl -i -pe 's/^# define FMT_USE_CONSTEVAL 1$/# define FMT_USE_CONSTEVAL 0/' include/fmt/base.h
|
|
+ SCRIPT
|
|
end
|