diff --git a/packages/react-native/React/Base/RCTRootView.m b/packages/react-native/React/Base/RCTRootView.m index 9ac9afb245b84b..89dd5276873977 100644 --- a/packages/react-native/React/Base/RCTRootView.m +++ b/packages/react-native/React/Base/RCTRootView.m @@ -204,6 +204,13 @@ - (BOOL)canBecomeFirstResponder #endif // macOS] } +#if TARGET_OS_OSX // [macOS +- (void)viewDidEndLiveResize { + [super viewDidEndLiveResize]; + [self setNeedsLayout]; +} +#endif // macOS] + - (void)setLoadingView:(RCTUIView *)loadingView // [macOS] { _loadingView = loadingView; diff --git a/packages/react-native/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.mm b/packages/react-native/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.mm index 44d8390e2243f6..47f013eaaa65a6 100644 --- a/packages/react-native/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.mm +++ b/packages/react-native/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.mm @@ -139,6 +139,15 @@ - (void)disableActivityIndicatorAutoHide:(BOOL)disabled _autoHideDisabled = disabled; } +#pragma mark - NSView + +#if TARGET_OS_OSX // [macOS +- (void)viewDidEndLiveResize { + [super viewDidEndLiveResize]; + [self setNeedsLayout]; +} +#endif // macOS] + #pragma mark - isActivityIndicatorViewVisible - (void)setIsActivityIndicatorViewVisible:(BOOL)visible diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTEnhancedScrollView.h b/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTEnhancedScrollView.h index bc24d3fa3e20ab..3fdda39d243b06 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTEnhancedScrollView.h +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTEnhancedScrollView.h @@ -54,6 +54,12 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, assign) BOOL snapToEnd; @property (nonatomic, copy) NSArray *snapToOffsets; +#if TARGET_OS_OSX // [macOS +- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated; +- (void)zoomToRect:(CGRect)rect animated:(BOOL)animated; +- (void)flashScrollIndicators; +#endif // macOS] + /* * Makes `setContentOffset:` method no-op when given `block` is executed. * The block is being executed synchronously. diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTEnhancedScrollView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTEnhancedScrollView.mm index 4773f61b3db89d..ff410c0025c5f5 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTEnhancedScrollView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTEnhancedScrollView.mm @@ -59,7 +59,11 @@ - (instancetype)initWithFrame:(CGRect)frame [weakSelf setPrivateDelegate:delegate]; }]; [_delegateSplitter addDelegate:self]; -#endif // [macOS] +#else // [macOS + self.hasHorizontalScroller = YES; + self.hasVerticalScroller = YES; + self.autohidesScrollers = YES; +#endif // macOS] } return self; @@ -110,17 +114,84 @@ - (void)setContentOffset:(CGPoint)contentOffset if (_isSetContentOffsetDisabled) { return; } +#if !TARGET_OS_OSX // [macOS] super.contentOffset = CGPointMake( RCTSanitizeNaNValue(contentOffset.x, @"scrollView.contentOffset.x"), RCTSanitizeNaNValue(contentOffset.y, @"scrollView.contentOffset.y")); +#else // [macOS + if (!NSEqualPoints(contentOffset, self.documentVisibleRect.origin)) { + [self.contentView scrollToPoint:contentOffset]; + [self reflectScrolledClipView:self.contentView]; + } +#endif // macOS] } - (void)setFrame:(CGRect)frame { +#if !TARGET_OS_OSX // [macOS] [super setFrame:frame]; [self centerContentIfNeeded]; +#else // [macOS + // Preserving and revalidating `contentOffset`. + CGPoint originalOffset = self.contentOffset; + + [super setFrame:frame]; + + UIEdgeInsets contentInset = self.contentInset; + CGSize contentSize = self.contentSize; + + // If contentSize has not been measured yet we can't check bounds. + if (CGSizeEqualToSize(contentSize, CGSizeZero)) { + self.contentOffset = originalOffset; + } else { + CGSize boundsSize = self.bounds.size; + CGFloat xMaxOffset = contentSize.width - boundsSize.width + contentInset.right; + CGFloat yMaxOffset = contentSize.height - boundsSize.height + contentInset.bottom; + // Make sure offset doesn't exceed bounds. This can happen on screen rotation. + if ((originalOffset.x >= -contentInset.left) && (originalOffset.x <= xMaxOffset) && + (originalOffset.y >= -contentInset.top) && (originalOffset.y <= yMaxOffset)) { + return; + } + self.contentOffset = CGPointMake( + MAX(-contentInset.left, MIN(xMaxOffset, originalOffset.x)), + MAX(-contentInset.top, MIN(yMaxOffset, originalOffset.y))); + } +#endif // macOS] } +#if TARGET_OS_OSX // [macOS +- (NSSize)contentSize +{ + if (!self.documentView) { + return [super contentSize]; + } + + return self.documentView.frame.size; +} + +- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated +{ + if (animated) { + [NSAnimationContext beginGrouping]; + [[NSAnimationContext currentContext] setDuration:0.3]; + [[self.contentView animator] setBoundsOrigin:contentOffset]; + [NSAnimationContext endGrouping]; + } else { + self.contentOffset = contentOffset; + } +} + +- (void)zoomToRect:(CGRect)rect animated:(BOOL)animated +{ + [self magnifyToFitRect:rect]; +} + +- (void)flashScrollIndicators +{ + [self flashScrollers]; +} +#endif // macOS] + - (void)didAddSubview:(RCTPlatformView *)subview // [macOS] { [super didAddSubview:subview]; diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.h b/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.h index 2eb12b85e2a4f4..caaf12dd958453 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.h +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.h @@ -56,6 +56,10 @@ NS_ASSUME_NONNULL_BEGIN RCTGenericDelegateSplitter> *scrollViewDelegateSplitter; #endif // [macOS] +#if TARGET_OS_OSX // [macOS +@property (nonatomic, assign) UIEdgeInsets contentInset; +#endif // macOS] + @end /* diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm index ec8136bb75a9fd..1a9406ba501e6d 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm @@ -147,7 +147,7 @@ - (instancetype)initWithFrame:(CGRect)frame _containerView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [_scrollView setDocumentView:_containerView]; #endif // macOS] - + #if !TARGET_OS_OSX // [macOS] [self.scrollViewDelegateSplitter addDelegate:self]; #endif // [macOS] @@ -275,6 +275,19 @@ static inline UIViewAnimationOptions animationOptionsWithCurve(UIViewAnimationCu } #endif +#if TARGET_OS_OSX // [macOS +- (void)setContentInset:(UIEdgeInsets)contentInset +{ + if (UIEdgeInsetsEqualToEdgeInsets(contentInset, _contentInset)) { + return; + } + + _contentInset = contentInset; + _scrollView.contentInset = contentInset; + _scrollView.scrollIndicatorInsets = contentInset; +} +#endif // macOS] + #if !TARGET_OS_OSX // [macOS] - (RCTGenericDelegateSplitter> *)scrollViewDelegateSplitter { @@ -406,7 +419,11 @@ - (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared & MAP_SCROLL_VIEW_PROP(zoomScale); if (oldScrollViewProps.contentInset != newScrollViewProps.contentInset) { +#if !TARGET_OS_OSX // [macOS] _scrollView.contentInset = RCTUIEdgeInsetsFromEdgeInsets(newScrollViewProps.contentInset); +#else // [macOS + self.contentInset = RCTUIEdgeInsetsFromEdgeInsets(newScrollViewProps.contentInset); +#endif // macOS] } RCTEnhancedScrollView *scrollView = (RCTEnhancedScrollView *)_scrollView; @@ -450,7 +467,7 @@ - (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared & _shouldUpdateContentInsetAdjustmentBehavior = NO; } #endif // [macOS] - + MAP_SCROLL_VIEW_PROP(disableIntervalMomentum); MAP_SCROLL_VIEW_PROP(snapToInterval); @@ -636,6 +653,22 @@ - (void)prepareForRecycle _firstVisibleView = nil; } +#if TARGET_OS_OSX // [macOS +#pragma mark - NSScrollView scroll notification + +- (void)scrollViewDocumentViewBoundsDidChange:(__unused NSNotification *)notification +{ + RCTEnhancedScrollView *scrollView = _scrollView; + + if (scrollView.centerContent) { + // Update content centering through contentOffset setter + [scrollView setContentOffset:scrollView.contentOffset]; + } + + [self scrollViewDidScroll:scrollView]; +} +#endif // macOS] + #pragma mark - UIScrollViewDelegate #if !TARGET_OS_OSX // [macOS] @@ -775,9 +808,25 @@ - (void)didMoveToWindow [super didMoveToWindow]; #else // [macOS - (void)viewDidMoveToWindow // [macOS] +#endif // [macOS] { [super viewDidMoveToWindow]; -#endif // [macOS] + +#if TARGET_OS_OSX // [macOS + NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; + if (self.window == nil) { + // Unregister scrollview's clipview bounds change notifications + [defaultCenter removeObserver:self + name:NSViewBoundsDidChangeNotification + object:_scrollView.contentView]; + } else { + // Register for scrollview's clipview bounds change notifications so we can track scrolling + [defaultCenter addObserver:self + selector:@selector(scrollViewDocumentViewBoundsDidChange:) + name:NSViewBoundsDidChangeNotification + object:_scrollView.contentView]; // NSClipView + } +#endif // macOS] if (!self.window) { // The view is being removed, ensure that the scroll end event is dispatched @@ -861,6 +910,8 @@ - (void)flashScrollIndicators { #if !TARGET_OS_OSX // [macOS] [_scrollView flashScrollIndicators]; +#else // [macOS + [(RCTEnhancedScrollView *)_scrollView flashScrollers]; #endif // [macOS] } @@ -960,7 +1011,11 @@ - (void)scrollToOffset:(CGPoint)offset animated:(BOOL)animated [self _forceDispatchNextScrollEvent]; +#if !TARGET_OS_OSX // [macOS] [_scrollView setContentOffset:offset animated:animated]; +#else // [macOS + [(RCTEnhancedScrollView *)_scrollView setContentOffset:offset animated:animated]; +#endif // macOS] if (!animated) { // When not animated, the expected workflow in ``scrollViewDidEndScrollingAnimation`` after scrolling is not going @@ -973,6 +1028,8 @@ - (void)zoomToRect:(CGRect)rect animated:(BOOL)animated { #if !TARGET_OS_OSX // [macOS] [_scrollView zoomToRect:rect animated:animated]; +#else // [macOS + [(RCTEnhancedScrollView *)_scrollView zoomToRect:rect animated:animated]; #endif // [macOS] } diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm index af394b1535ddf7..3da1a00cf9547d 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm @@ -152,7 +152,7 @@ - (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection [self invalidateLayer]; } } -#else // [macOS SAAD +#else // [macOS - (void)viewDidChangeEffectiveAppearance { [super viewDidChangeEffectiveAppearance]; @@ -1562,7 +1562,6 @@ - (BOOL)didActivateAccessibilityCustomAction:(UIAccessibilityCustomAction *)acti } #if TARGET_OS_OSX // [macOS - - (void)handleCommand:(const NSString *)commandName args:(const NSArray *)args { if ([commandName isEqualToString:@"focus"]) { diff --git a/packages/react-native/React/Views/ScrollView/RCTScrollView.m b/packages/react-native/React/Views/ScrollView/RCTScrollView.m index 9d66522a198101..dacd6113eaffa0 100644 --- a/packages/react-native/React/Views/ScrollView/RCTScrollView.m +++ b/packages/react-native/React/Views/ScrollView/RCTScrollView.m @@ -328,6 +328,7 @@ @implementation RCTScrollView { BOOL _allowNextScrollNoMatterWhat; #if TARGET_OS_OSX // [macOS BOOL _notifyDidScroll; + BOOL _disableScrollEvents; NSPoint _lastScrollPosition; #endif // macOS] CGRect _lastClippedToRect; @@ -570,8 +571,28 @@ - (void)setRemoveClippedSubviews:(__unused BOOL)removeClippedSubviews - (void)setFrame:(CGRect)frame { +#if !TARGET_OS_OSX // [macOS] + [super setFrame:frame]; +#else // [macOS + /** + * Setting the frame on the scroll view will randomly generate between 0 and 4 scroll events. These events happen + * during the layout phase of the view which generates layout notifications that are sent through the bridge. + * Because the bridge is heavily used, the scroll events are throttled and reach the JS thread with a random delay. + * Because the scroll event stores the clip and content view size, delayed scroll events will submit stale layout + * information that can break virtual list implemenations. + * By disabling scroll events during the execution of the setFrame method and scheduling one notification on + * the next run loop, we can mitigate the delayed scroll event by sending it at a time where the bridge is not busy. + */ + _disableScrollEvents = YES; [super setFrame:frame]; + _disableScrollEvents = NO; + + if (self.window != nil && !self.window.inLiveResize) { + [self performSelector:@selector(scrollViewDocumentViewBoundsDidChange:) withObject:nil afterDelay:0]; + } +#endif // macOS] [self centerContentIfNeeded]; + } - (void)insertReactSubview:(RCTUIView *)view atIndex:(NSInteger)atIndex // [macOS] @@ -867,6 +888,10 @@ - (void)flashScrollIndicators #if TARGET_OS_OSX // [macOS - (void)scrollViewDocumentViewBoundsDidChange:(__unused NSNotification *)notification { + if (_disableScrollEvents) { + return; + } + if (_scrollView.centerContent) { // contentOffset setter dynamically centers content when _centerContent == YES [_scrollView setContentOffset:_scrollView.contentOffset]; diff --git a/packages/rn-tester/Podfile.lock b/packages/rn-tester/Podfile.lock index 0c498053a0f364..b179f689864e90 100644 --- a/packages/rn-tester/Podfile.lock +++ b/packages/rn-tester/Podfile.lock @@ -2053,82 +2053,82 @@ SPEC CHECKSUMS: boost: cea1d4f90a3a59537f3deb03ff5656489d7133dd DoubleConversion: d31b1eb37f6d6f456530c4fd9124b857d6889cab fast_float: 5596a99716f77fe44b617183d4db34777538174d - FBLazyVector: 0a3f4ff238f4a5a12df1ce799726fbae48b3219a + FBLazyVector: 44382081e96f46a71c738bce8397d51f86fc0cb4 fmt: 24e7591456deb60b4a77518f83d9a916ac84223f glog: 0b31c25149b9d350b2666c7d459229861a00ec07 - hermes-engine: cc8feeacabc5b95002c368a555a173cddafb29c5 + hermes-engine: 9b033746b84dd3782beba1ee78de2d8ce709e5e1 MyNativeView: 012965daf7594f221bfe8f48c3a6be88dc926ec7 NativeCxxModuleExample: d89bddc6be7c578088d4c441e1de365cca37d369 OCMock: 589f2c84dacb1f5aaf6e4cec1f292551fe748e74 OSSLibraryExample: d57a46a4520f0964e36b3ac349cb37404a469ae3 RCT-Folly: 957ce397c08be7a9a91bb9245e57e69fa5255ec5 RCTDeprecation: 3808e36294137f9ee5668f4df2e73dc079cd1dcf - RCTRequired: 5c10a42787b18fabbacda1669d333270f78dfed1 - RCTTypeSafety: 04629d6e8ee80c4ddb1bc2acb80b1ca88de284c9 - React: ee7f072e1e2db3fd4da25483b3cb6868964aa7ed - React-callinvoker: 94acfd04af532e289b9e992fad6f71b0a1fb752f - React-Core: 7b58428f7a2c1a685713e3e14387a8f98da88e03 - React-CoreModules: 5f97a14ece13839935df5ae9456db172f966c1f4 - React-cxxreact: d152f08b17a34ae1ec345029cdc24919828bda88 - React-debug: bd53bf62a49fe5858a569204c3df64dc0a3c0e6a - React-defaultsnativemodule: a59c04097aff0751a08745ef6aaa217ab1178be7 - React-domnativemodule: 403a11dd566425a55d3bf58a13127a2c12c2afc7 - React-Fabric: 0c8a6ce4745ccdc43aec6a664e496218d8bdfc33 - React-FabricComponents: 4af2a2865dc407f5c2e75faa2734ba389461e4b4 - React-FabricImage: 7ca716a0ed4dcf506fcdcd60986501c527cfcc6e - React-featureflags: 8a8f76aa906abe8a561c2e81569d159509a7b244 - React-featureflagsnativemodule: f9330ce11a0cb7e1b51e30cc261add31294d93c2 - React-graphics: aa9108bb694c9ddb04eb0cd8b9bd7c0c09de83a2 - React-hermes: a10ae5b0156d75c05f4c737336cb593b2b27a2df - React-idlecallbacksnativemodule: c9fe93ba4f421319ad4bcd0d7131e0d3c510cbfb - React-ImageManager: cfbe01dd1d75ed9aa33c09c66e3e3f20970f4981 - React-jserrorhandler: 099f5a111a9117e5cb7be4a31a151e2977ec20ef - React-jsi: f06232f271ddafb13d90bfecda92a84d29bb0d36 - React-jsiexecutor: 445b0458ddf8920c995d96af05bc8d66b7fc138a - React-jsinspector: af8da9536a4e2402d65c47e01a64118628f067b4 - React-jsinspectortracing: eef865f1f8db567faac91bb857a880f7eab7e2d0 - React-jsitooling: 397f96aed700fd416ff6fe16ed88f4fa45c64ba2 - React-jsitracing: b149f1f31dda23f0ba72151b0024964a76741fa7 - React-logger: 51cdb2d4cb36b78f9f154dda2fdb1e7dba204765 - React-Mapbuffer: bb17a086220da31233ca695abe63ca01dec40d82 - React-microtasksnativemodule: ac413e56d6d81b77b9a1aae7ff1aad8afb6050c5 - React-NativeModulesApple: db1a001d34e7f0e8b25dfefa2a2ce83b6a6442d9 - React-oscompat: 825c3b67ca607307fc7493101bee3ec6c18b2ca7 - React-perflogger: ad75d71af0ddce6ea06d6d47eae3151563a01b55 - React-performancetimeline: 53df2b097c87eab5bb14ed00cab95be9f82e2f64 - React-RCTActionSheet: a9fc70ec6783733305602ffb0cb9ab956221230e - React-RCTAnimation: cc7bff4261b79f6fbb2df431bf6c312690f6c40c - React-RCTAppDelegate: bd84d753358c4103b81d6fe33c1e64c844615516 - React-RCTBlob: 80c0a82e1b20f05416636841f0f13cbe28c6df6d - React-RCTFabric: dd0221952b4cfafbe1d548e59272a48f5d7b233a - React-RCTFBReactNativeSpec: c3b76c04af6b9842ce62db58c670a756a45bdee1 - React-RCTImage: f810320175a60490085043f6aa65f4e91c4fd42d - React-RCTLinking: 1a4ed8deb97f91b641bbe31c223a80d3bfa040b2 - React-RCTNetwork: bd30579e9d1b20708525428d6f1a44c1adfdcf5f - React-RCTPushNotification: 85664072a6ed949dbc244440a60be24f201eee2b - React-RCTRuntime: e7a1a5d3c48065d96e351f20b521c3e1e01cd55f - React-RCTSettings: 65a4df3015d7fd9c6efc455f0df9de8a48001b88 - React-RCTTest: 0ee2333eb05005b100ce25749e3b3dfca40908f7 - React-RCTText: d633a9c03fca2a1a228a0ede5e340169bb851618 - React-RCTVibration: 0deb664da65c4302963a8c2d6f23995059341fea - React-rendererconsistency: 00316a8639306ac717d62d2874b885088cde31d4 - React-renderercss: f11c56e70856232f2d34ab96df245a674a2ba769 - React-rendererdebug: 12d895f5fae069c25aa0c33a138ddd3f308fd8f2 - React-rncore: a0871316bff44288ba62c1374b6e9093717dbc89 - React-RuntimeApple: 29d74569f8f83a2e98b73a532d063250a5170347 - React-RuntimeCore: 54235f3ab77822160c01fa7ab543f3ea512e56e6 - React-runtimeexecutor: a3ea35a56f73642ff5c888869e3e5eecd842f8c9 - React-RuntimeHermes: 9f0c0fd0b045d2ee552ad96044be15e76a1b7485 - React-runtimescheduler: 5d60a6ef3abdba3b0f688eacd3a106a45f09c334 - React-timing: ba0ea02d49e288be015576fc217184a521f3508d - React-utils: 3101cddb3c50406b3949fe36e8fad34609dd561c - ReactAppDependencyProvider: 4d000089a4f20b7df5b5849581808301af186297 + RCTRequired: 8b5657cd3f0964db8c144c4671a33be6d11a3e1c + RCTTypeSafety: 1e5e62856d3f2d39585d33a6e32a9d8995d4e83a + React: 2a12fbbf1220579c018b7d8a47080222a26ed118 + React-callinvoker: 4cdcd40ec49bc3b8ccb0d239dad6ec64019895b5 + React-Core: 15cba5db651be7dee6f3f906370a59074c394b05 + React-CoreModules: 331da0c5cb4e1795f808b1f645b8939c4c4ea7e2 + React-cxxreact: 3b1767504528f1ab8f97226f9e7bebd016e7c404 + React-debug: 78e10ab02e783d3ba3f6491106aa23726dfd64a8 + React-defaultsnativemodule: b69289c57709740fbf7423abe85c963239e02f60 + React-domnativemodule: 28619057fa3e5669be50bcec1dd735be43951a42 + React-Fabric: 51a71bad6e998935a20c8583001e78a0e0b46c9f + React-FabricComponents: b10f2567e8e9ad9c422f08fba87b7f804f02a407 + React-FabricImage: 7b2fa6abf253bdb0f1b174d69ef6b4cc8304c2dc + React-featureflags: 4d2cdde342cccc574c2ac2481814b9642ff30a01 + React-featureflagsnativemodule: d5814d09c1f91266925f24b6999e2f9ee572c97f + React-graphics: d8dc955396ac81759dac5146166d8cc6326092a6 + React-hermes: cef4044d63ba6acd64e09c068743451aded166cd + React-idlecallbacksnativemodule: 45e771039892c0da1f9a8bb925d3c6fe4a237dc8 + React-ImageManager: 69f922728b6020d8d971cb36673ebc1f1c2728fa + React-jserrorhandler: 812c3bb0344675811da25a50129bc501c5ee8b0f + React-jsi: 88f4c91df2c3f03f4ac68964da6d5e1858470235 + React-jsiexecutor: 345c8c2db0be464f01dbb1ff47a9305cee456809 + React-jsinspector: 698e0859888fde3d062710dd04ffe61786246905 + React-jsinspectortracing: 4062130e33b904fe0f695284419a7e755e1351bc + React-jsitooling: eb67a4a94cb8823a2f2ae0c46e252be6a4bf3ca1 + React-jsitracing: 15463a241b918d86357bf8a797371c8ffbc3e90e + React-logger: a7a98e47561ac71ea3bdae8a91d56b460a6c4f12 + React-Mapbuffer: 0f0726a76db02dba9d33cb799159e20c6c598e92 + React-microtasksnativemodule: 1686a61660b3277b4ba232dbdcf67a31c264eb50 + React-NativeModulesApple: 0afd425a4c9e60f7e803871aabb3185edecf9c70 + React-oscompat: f2a3dbd55d56c1c8b1cfc4055e3471dae908ae5b + React-perflogger: a9a8a533a81346becd4edf9d463f7dabcf98515a + React-performancetimeline: b6116878825de4e1aacf153f399539708db100a9 + React-RCTActionSheet: 1e05f37ad70a37478796e3cbb235e9c138bbf78b + React-RCTAnimation: 1155e7c79c3b7aabae3dea0ad245c40b907c8b28 + React-RCTAppDelegate: 759341b414cb8b5c3f7422f90e2362a2671c7df0 + React-RCTBlob: 4bfdf2b6b31ea0fbe97849b3cf61d84c9c56a3bb + React-RCTFabric: 7c7029e174cb318c69f1665a448c6e2b5d05e91a + React-RCTFBReactNativeSpec: f3d5de17a3b3aae5de1ab9deff80dd097971a45a + React-RCTImage: cde888d415651273b6c90326dab0b5f85f4a8d19 + React-RCTLinking: e3c716617e2e82dcb49b40c79ba38dcc82d2c107 + React-RCTNetwork: 5fcbed0bf7c3952f192607b7856ba93c24dbf265 + React-RCTPushNotification: 7a7172a8de3f88cf5de570ae1b9bc58375b3964a + React-RCTRuntime: 6672a55b38bf2b6de9c42814e76b623dc5b561c3 + React-RCTSettings: 936d661cf58aed03be9fea4273a17dc986d1e6ab + React-RCTTest: a09285e3f1ec38d3093dec27a1bfeea4c47ce2c1 + React-RCTText: a237773566a7eee4f887565cf145b804d59c5918 + React-RCTVibration: 45cbd6cda93c93a160b38a3fb09d58ce9a1894cc + React-rendererconsistency: bad2b491a07a96a5c22ff2410db8d23c9a05ab94 + React-renderercss: 1f7bbba0c1fe5f2fdd1e2307efd44183513f2ab1 + React-rendererdebug: 9972e728b2cdda1924b8fa17df7a5e82f25958d2 + React-rncore: 203b29c2a357fc2a6c690d14f542f280e84327aa + React-RuntimeApple: bd6861731f57b6df5bb944830007a58313f2777e + React-RuntimeCore: 658c8603d48eb38996af4eb4d0372eaeef814f2b + React-runtimeexecutor: 6e9696710638bfc1d73613c1d179f01af8f15450 + React-RuntimeHermes: f27574e3867fb2cc761b1e4dc98eeb979f5aed47 + React-runtimescheduler: 066fc8b2007452bbcc74710253611535accb1c86 + React-timing: 65dc765cc132ae62d1a267187dc26ca6574efff9 + React-utils: 82b609f9143d5633a3746c07631f1a428b2c5895 + ReactAppDependencyProvider: 6c068adfe5c90fa82adc6b9c125426eab799f6a6 ReactCodegen: 0082198e27eef7ce13bf03680eb9d15bbde56601 - ReactCommon: ccca86fc30847bda1f64f6d8f84a596a4ce02f26 - ReactCommon-Samples: feac96a466176d8aa790a5ae4e6076d66f437ffc + ReactCommon: e064aec31bd703fa3b050461f9cb4d7baa0aa312 + ReactCommon-Samples: d788c435538070b736315e3fd3b68564f6bb5d05 ScreenshotManager: c96f07e207c96f5d91080e408aff95df63875dae SocketRocket: a1845ec01e17d55e3da5df40600892972afb45e1 - Yoga: 1cff0cfbf14d209e21b2f3b023de56f24b43b6fd + Yoga: efed9b3eddbe1c2adea2ceac6724eae220e12478 PODFILE CHECKSUM: 07eddbe098f0e50aff590a91207f692788a9fe4c