From 89e0a5b11554ddddc31212499fc48ab754dd7252 Mon Sep 17 00:00:00 2001 From: MrRefactor Date: Mon, 2 Dec 2024 13:39:01 +0100 Subject: [PATCH] refactor(iOS): Migrate RCTOnPageScrollEvent to swift --- example/ios/Podfile.lock | 2 +- ios/Events/OnPageScroll.swift | 46 ++++++++++++++ ios/Fabric/RNCPagerViewComponentView.mm | 9 ++- ios/RCTOnPageScrollEvent.h | 14 ----- ios/RCTOnPageScrollEvent.m | 60 ------------------- ios/RNCPagerView.m | 12 +++- ios/react-native-pager-view-Bridging-Header.h | 4 ++ react-native-pager-view.podspec | 2 +- 8 files changed, 68 insertions(+), 81 deletions(-) create mode 100644 ios/Events/OnPageScroll.swift delete mode 100644 ios/RCTOnPageScrollEvent.h delete mode 100644 ios/RCTOnPageScrollEvent.m create mode 100644 ios/react-native-pager-view-Bridging-Header.h diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index aa18cecd..05bbc0bb 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -2090,7 +2090,7 @@ SPEC CHECKSUMS: React-logger: 26155dc23db5c9038794db915f80bd2044512c2e React-Mapbuffer: ad1ba0205205a16dbff11b8ade6d1b3959451658 React-microtasksnativemodule: e771eb9eb6ace5884ee40a293a0e14a9d7a4343c - react-native-pager-view: 7f8b1f81aee3c953ea25851553e88b69a7c0413d + react-native-pager-view: bad41ab1a3d1391153c4a08bceae65328d244518 react-native-safe-area-context: 2500e4fe998caad50ad3bc51ec23ef951308569e React-nativeconfig: aeed6e2a8ac02b2df54476afcc7c663416c12bf7 React-NativeModulesApple: c5b7813da94136f50ef084fa1ac077332dcfc658 diff --git a/ios/Events/OnPageScroll.swift b/ios/Events/OnPageScroll.swift new file mode 100644 index 00000000..a0c2c46f --- /dev/null +++ b/ios/Events/OnPageScroll.swift @@ -0,0 +1,46 @@ +import Foundation +import React + +public protocol RCTEvent {} + +@objc public class RCTOnPageScroll: NSObject, RCTEvent { + private var position: NSNumber + private var offset: NSNumber + @objc public var viewTag: NSNumber + @objc public var coalescingKey: UInt16 + + @objc public var eventName: String { + return "onPageScroll" + } + + @objc public init(reactTag: NSNumber, position: NSNumber, offset: NSNumber, coalescingKey: UInt16) { + self.viewTag = reactTag + self.position = position + self.offset = offset + self.coalescingKey = coalescingKey + super.init() + } + + @objc public func canCoalesce() -> Bool { + return true + } + + public func coalesce(with newEvent: RCTEvent) -> RCTEvent { + return newEvent + } + + @objc public class func moduleDotMethod() -> String { + return "RCTEventEmitter.receiveEvent" + } + + @objc public func arguments() -> [Any] { + return [ + viewTag, + RCTNormalizeInputEventName(eventName) ?? eventName, + [ + "position": position, + "offset": offset + ] + ] + } +} diff --git a/ios/Fabric/RNCPagerViewComponentView.mm b/ios/Fabric/RNCPagerViewComponentView.mm index 652a5c12..ddd7593f 100644 --- a/ios/Fabric/RNCPagerViewComponentView.mm +++ b/ios/Fabric/RNCPagerViewComponentView.mm @@ -10,7 +10,12 @@ #import "RCTFabricComponentsPlugins.h" #import "React/RCTConversions.h" -#import "RCTOnPageScrollEvent.h" +#if __has_include("react_native_pager_view/react_native_pager_view-Swift.h") +#import "react_native_pager_view/react_native_pager_view-Swift.h" +#else +#import "react_native_pager_view-Swift.h" +#endif + using namespace facebook::react; @@ -374,7 +379,7 @@ - (void)scrollViewDidScroll:(UIScrollView *)scrollView { // This is temporary workaround to allow animations based on onPageScroll event // until Fabric implements proper NativeAnimationDriver, // see: https://github.com/facebook/react-native/blob/44f431b471c243c92284aa042d3807ba4d04af65/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm#L59 - NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:[[RCTOnPageScrollEvent alloc] initWithReactTag:[NSNumber numberWithInt:self.tag] position:@(position) offset:@(interpolatedOffset)], @"event", nil]; + NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:[[RCTOnPageScroll alloc] initWithReactTag:[NSNumber numberWithInt:self.tag] position:@(position) offset:@(interpolatedOffset) coalescingKey:0], @"event", nil]; [[NSNotificationCenter defaultCenter] postNotificationName:@"RCTNotifyEventDispatcherObserversOfEvent_DEPRECATED" object:nil userInfo:userInfo]; diff --git a/ios/RCTOnPageScrollEvent.h b/ios/RCTOnPageScrollEvent.h deleted file mode 100644 index b0d7d95c..00000000 --- a/ios/RCTOnPageScrollEvent.h +++ /dev/null @@ -1,14 +0,0 @@ -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface RCTOnPageScrollEvent : NSObject - -- (instancetype) initWithReactTag:(NSNumber *)reactTag - position:(NSNumber *)position - offset:(NSNumber *)offset; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ios/RCTOnPageScrollEvent.m b/ios/RCTOnPageScrollEvent.m deleted file mode 100644 index 2b370733..00000000 --- a/ios/RCTOnPageScrollEvent.m +++ /dev/null @@ -1,60 +0,0 @@ -#import -#import "RCTOnPageScrollEvent.h" - -@implementation RCTOnPageScrollEvent -{ - NSNumber* _position; - NSNumber* _offset; -} - -@synthesize viewTag = _viewTag; - -- (NSString *)eventName { - return @"onPageScroll"; -} - -- (instancetype) initWithReactTag:(NSNumber *)reactTag - position:(NSNumber *)position - offset:(NSNumber *)offset; -{ - RCTAssertParam(reactTag); - - if ((self = [super init])) { - _viewTag = reactTag; - _position = position; - _offset = offset; - } - return self; -} - -RCT_NOT_IMPLEMENTED(- (instancetype)init) -- (uint16_t)coalescingKey -{ - return 0; -} - - -- (BOOL)canCoalesce -{ - return YES; -} - -+ (NSString *)moduleDotMethod -{ - return @"RCTEventEmitter.receiveEvent"; -} - -- (NSArray *)arguments -{ - return @[self.viewTag, RCTNormalizeInputEventName(self.eventName), @{ - @"position": _position, - @"offset": _offset - }]; -} - -- (id)coalesceWithEvent:(id)newEvent; -{ - return newEvent; -} - -@end diff --git a/ios/RNCPagerView.m b/ios/RNCPagerView.m index 7d99becc..4c67dc8f 100644 --- a/ios/RNCPagerView.m +++ b/ios/RNCPagerView.m @@ -3,11 +3,17 @@ #import #import "UIViewController+CreateExtension.h" -#import "RCTOnPageScrollEvent.h" #import "RCTOnPageScrollStateChanged.h" #import "RCTOnPageSelected.h" #import +#if __has_include("react_native_pager_view/react_native_pager_view-Swift.h") +#import "react_native_pager_view/react_native_pager_view-Swift.h" +#else +#import "react_native_pager_view-Swift.h" +#endif + + @interface RNCPagerView () @property(nonatomic, assign) UIPanGestureRecognizer* panGestureRecognizer; @@ -342,7 +348,7 @@ - (void)pageViewController:(UIPageViewController *)pageViewController self.currentIndex = currentIndex; self.currentView = currentVC.view; [self.eventDispatcher sendEvent:[[RCTOnPageSelected alloc] initWithReactTag:self.reactTag position:@(currentIndex) coalescingKey:_coalescingKey++]]; - [self.eventDispatcher sendEvent:[[RCTOnPageScrollEvent alloc] initWithReactTag:self.reactTag position:@(currentIndex) offset:@(0.0)]]; + [self.eventDispatcher sendEvent:[[RCTOnPageScroll alloc] initWithReactTag:self.reactTag position:@(currentIndex) offset:@(0.0) coalescingKey:0]]; self.lastReportedIndex = currentIndex; } } @@ -453,7 +459,7 @@ - (void)scrollViewDidScroll:(UIScrollView *)scrollView { float interpolatedOffset = absoluteOffset * labs(_destinationIndex - _currentIndex); self.lastContentOffset = scrollView.contentOffset; - [self.eventDispatcher sendEvent:[[RCTOnPageScrollEvent alloc] initWithReactTag:self.reactTag position:@(position) offset:@(interpolatedOffset)]]; + [self.eventDispatcher sendEvent:[[RCTOnPageScroll alloc] initWithReactTag:self.reactTag position:@(position) offset:@(interpolatedOffset) coalescingKey:0]]; } - (NSString *)determineScrollDirection:(UIScrollView *)scrollView { diff --git a/ios/react-native-pager-view-Bridging-Header.h b/ios/react-native-pager-view-Bridging-Header.h new file mode 100644 index 00000000..b4a33181 --- /dev/null +++ b/ios/react-native-pager-view-Bridging-Header.h @@ -0,0 +1,4 @@ +#import +#import +#import +#import diff --git a/react-native-pager-view.podspec b/react-native-pager-view.podspec index 9b42aaee..b76ce49e 100644 --- a/react-native-pager-view.podspec +++ b/react-native-pager-view.podspec @@ -15,7 +15,7 @@ Pod::Spec.new do |s| s.platforms = { :ios => "10.0", :visionos => "1.0" } s.source = { :git => "https://github.com/callstack/react-native-pager-view.git", :tag => "#{s.version}" } - s.source_files = "ios/**/*.{h,m,mm}" + s.source_files = "ios/**/*.{h,m,mm,swift}" # install_modules_dependencies has been defined in RN 0.70 # This check ensure that the library can work on older versions of RN