From ca99ca838739f09e5014bdd5dcf407bcfed6bc08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Van=20der=20Auwermeulen?= Date: Wed, 26 Feb 2025 12:58:38 +0100 Subject: [PATCH 01/11] feat: coalesced event --- ios/RNCChangeEvent.h | 12 +++ ios/RNCChangeEvent.m | 87 +++++++++++++++++++ ios/RNCSafeAreaProvider.h | 6 ++ ios/RNCSafeAreaProvider.m | 68 ++++++++------- ios/RNCSafeAreaProviderManager.m | 2 +- .../project.pbxproj | 6 ++ src/SafeAreaContext.tsx | 2 + 7 files changed, 151 insertions(+), 32 deletions(-) create mode 100644 ios/RNCChangeEvent.h create mode 100644 ios/RNCChangeEvent.m diff --git a/ios/RNCChangeEvent.h b/ios/RNCChangeEvent.h new file mode 100644 index 00000000..ecaa81a2 --- /dev/null +++ b/ios/RNCChangeEvent.h @@ -0,0 +1,12 @@ +#import +#import + +@interface RNCChangeEvent : NSObject + +- (instancetype)initWithEventName:(NSString *)eventName + reactTag:(NSNumber *)reactTag + insets:(UIEdgeInsets)insets + frame:(CGRect)frame + coalescingKey:(uint16_t)coalescingKey NS_DESIGNATED_INITIALIZER; + +@end diff --git a/ios/RNCChangeEvent.m b/ios/RNCChangeEvent.m new file mode 100644 index 00000000..8a31da43 --- /dev/null +++ b/ios/RNCChangeEvent.m @@ -0,0 +1,87 @@ +#import "RNCChangeEvent.h" +#import + +@implementation RNCChangeEvent { + UIEdgeInsets _insets; + CGRect _frame; + uint16_t _coalescingKey; +} + +@synthesize eventName = _eventName; +@synthesize viewTag = _viewTag; + +- (instancetype)initWithEventName:(NSString *)eventName + reactTag:(NSNumber *)reactTag + insets:(UIEdgeInsets)insets + frame:(CGRect)frame + coalescingKey:(uint16_t)coalescingKey +{ + RCTAssertParam(reactTag); + + if ((self = [super init])) { + _eventName = [eventName copy]; + _viewTag = reactTag; + _frame = frame; + _insets = insets; + _coalescingKey = coalescingKey; + } + + return self; +} + +RCT_NOT_IMPLEMENTED(-(instancetype)init) + +- (uint16_t)coalescingKey +{ + return _coalescingKey; +} + +- (NSDictionary *)body +{ + NSDictionary *body = @{ + @"insets" : @{ + @"top" : @(_insets.top), + @"right" : @(_insets.right), + @"bottom" : @(_insets.bottom), + @"left" : @(_insets.left), + }, + @"frame" : @{ + @"x" : @(_frame.origin.x), + @"y" : @(_frame.origin.y), + @"width" : @(_frame.size.width), + @"height" : @(_frame.size.height), + }, + }; + + return body; +} + +- (BOOL)canCoalesce +{ + return YES; +} + +- (RNCChangeEvent *)coalesceWithEvent:(RNCChangeEvent *)newEvent +{ + return newEvent; +} + ++ (NSString *)moduleDotMethod +{ + return @"RCTEventEmitter.receiveEvent"; +} + +- (NSArray *)arguments +{ + return @[ self.viewTag, RCTNormalizeInputEventName(self.eventName), [self body] ]; +} + +/* +Not sure if this is needed as eventName is passed in arguments +- (NSString *)eventName +{ + return _eventName; +} +*/ + +@end diff --git a/ios/RNCSafeAreaProvider.h b/ios/RNCSafeAreaProvider.h index 317efbeb..7b2a6ca0 100644 --- a/ios/RNCSafeAreaProvider.h +++ b/ios/RNCSafeAreaProvider.h @@ -4,12 +4,18 @@ #import #endif +#import #import NS_ASSUME_NONNULL_BEGIN @interface RNCSafeAreaProvider : RCTView +- (instancetype)initWithEventDispatcher:(id)eventDispatcher NS_DESIGNATED_INITIALIZER; + +// NOTE: currently these event props are only declared so we can export the +// event names to JS - we don't call the blocks directly because scroll events +// need to be coalesced before sending, for performance reasons. @property (nonatomic, copy) RCTBubblingEventBlock onInsetsChange; @end diff --git a/ios/RNCSafeAreaProvider.m b/ios/RNCSafeAreaProvider.m index 0e82f904..5222e7bd 100644 --- a/ios/RNCSafeAreaProvider.m +++ b/ios/RNCSafeAreaProvider.m @@ -1,19 +1,33 @@ #import "RNCSafeAreaProvider.h" +#import #import #import +#import "RCTUIManagerObserverCoordinator.h" #import "RNCSafeAreaUtils.h" +#import "RNCChangeEvent.h" + +@interface RNCSafeAreaProvider () + +@end @implementation RNCSafeAreaProvider { + id _eventDispatcher; UIEdgeInsets _currentSafeAreaInsets; CGRect _currentFrame; BOOL _initialInsetsSent; + uint16_t _coalescingKey; } -- (instancetype)init +- (instancetype)initWithEventDispatcher:(id)eventDispatcher { - if ((self = [super init])) { -#if !TARGET_OS_TV && !TARGET_OS_OSX + RCTAssertParam(eventDispatcher); + + if ((self = [super initWithFrame:CGRectZero])) { +#if !TARGET_OS_TV + + _eventDispatcher = eventDispatcher; + [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(invalidateSafeAreaInsets) name:UIKeyboardDidShowNotification @@ -48,48 +62,31 @@ - (void)invalidateSafeAreaInsets return; } -#if TARGET_OS_IPHONE UIEdgeInsets safeAreaInsets = self.safeAreaInsets; -#elif TARGET_OS_OSX - NSEdgeInsets safeAreaInsets; - if (@available(macOS 11.0, *)) { - safeAreaInsets = self.safeAreaInsets; - } else { - safeAreaInsets = NSEdgeInsetsZero; - } -#endif CGRect frame = [self convertRect:self.bounds toView:RNCParentViewController(self).view]; if (_initialInsetsSent && -#if TARGET_OS_IPHONE UIEdgeInsetsEqualToEdgeInsetsWithThreshold(safeAreaInsets, _currentSafeAreaInsets, 1.0 / RCTScreenScale()) && -#elif TARGET_OS_OSX - NSEdgeInsetsEqualToEdgeInsetsWithThreshold(safeAreaInsets, _currentSafeAreaInsets, 1.0 / RCTScreenScale()) && -#endif CGRectEqualToRect(frame, _currentFrame)) { return; } - + _initialInsetsSent = YES; _currentSafeAreaInsets = safeAreaInsets; _currentFrame = frame; [NSNotificationCenter.defaultCenter postNotificationName:RNCSafeAreaDidChange object:self userInfo:nil]; - self.onInsetsChange(@{ - @"insets" : @{ - @"top" : @(safeAreaInsets.top), - @"right" : @(safeAreaInsets.right), - @"bottom" : @(safeAreaInsets.bottom), - @"left" : @(safeAreaInsets.left), - }, - @"frame" : @{ - @"x" : @(frame.origin.x), - @"y" : @(frame.origin.y), - @"width" : @(frame.size.width), - @"height" : @(frame.size.height), - }, - }); + // There's currently only 1 event name "change", so the _coalescingKey doesn't needs to be incremented + // Increment _coalescingKey if safeAreaInsets and frame are sent as separate events + RNCChangeEvent *changeEvent = [[RNCChangeEvent alloc] initWithEventName:@"onInsetsChange" + reactTag:self.reactTag + insets:safeAreaInsets + frame:frame + coalescingKey:_coalescingKey]; + + + [_eventDispatcher sendEvent:changeEvent]; } - (void)layoutSubviews @@ -99,4 +96,13 @@ - (void)layoutSubviews [self invalidateSafeAreaInsets]; } +- (void)dealloc +{ + [_eventDispatcher.bridge.uiManager.observerCoordinator removeObserver:self]; +} + + +RCT_NOT_IMPLEMENTED(-(instancetype)initWithFrame : (CGRect)frame) +RCT_NOT_IMPLEMENTED(-(instancetype)initWithCoder : (NSCoder *)aDecoder) + @end diff --git a/ios/RNCSafeAreaProviderManager.m b/ios/RNCSafeAreaProviderManager.m index 569ecb49..eeeb1b8a 100644 --- a/ios/RNCSafeAreaProviderManager.m +++ b/ios/RNCSafeAreaProviderManager.m @@ -14,7 +14,7 @@ - (UIView *)view - (NSView *)view #endif { - return [RNCSafeAreaProvider new]; + return [[RNCSafeAreaProvider alloc] initWithEventDispatcher:self.bridge.eventDispatcher]; } @end diff --git a/ios/RNSafeAreaContext.xcodeproj/project.pbxproj b/ios/RNSafeAreaContext.xcodeproj/project.pbxproj index 655adc17..e002de5b 100644 --- a/ios/RNSafeAreaContext.xcodeproj/project.pbxproj +++ b/ios/RNSafeAreaContext.xcodeproj/project.pbxproj @@ -19,6 +19,7 @@ 0C7844F027C02D03001807FB /* RNCSafeAreaProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C7844ED27C02D03001807FB /* RNCSafeAreaProvider.m */; }; AA53A9EE2A321C01009AB3B2 /* RNCSafeAreaViewEdgeModes.m in Sources */ = {isa = PBXBuildFile; fileRef = AA53A9ED2A321C01009AB3B2 /* RNCSafeAreaViewEdgeModes.m */; }; C923EDBC220C2C1A00D3100F /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C923EDBB220C2C1A00D3100F /* SystemConfiguration.framework */; }; + D697AA982D6F1D0A009C6433 /* RNCChangeEvent.m in Sources */ = {isa = PBXBuildFile; fileRef = D697AA972D6F1D08009C6433 /* RNCChangeEvent.m */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -59,6 +60,8 @@ AA53A9EC2A321C01009AB3B2 /* RNCSafeAreaViewEdgeModes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNCSafeAreaViewEdgeModes.h; sourceTree = ""; }; AA53A9ED2A321C01009AB3B2 /* RNCSafeAreaViewEdgeModes.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNCSafeAreaViewEdgeModes.m; sourceTree = ""; }; C923EDBB220C2C1A00D3100F /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + D697AA962D6F1CE5009C6433 /* RNCChangeEvent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNCChangeEvent.h; sourceTree = ""; }; + D697AA972D6F1D08009C6433 /* RNCChangeEvent.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNCChangeEvent.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -84,6 +87,8 @@ 58B511D21A9E6C8500147676 = { isa = PBXGroup; children = ( + D697AA972D6F1D08009C6433 /* RNCChangeEvent.m */, + D697AA962D6F1CE5009C6433 /* RNCChangeEvent.h */, AA53A9EC2A321C01009AB3B2 /* RNCSafeAreaViewEdgeModes.h */, AA53A9ED2A321C01009AB3B2 /* RNCSafeAreaViewEdgeModes.m */, 0C7844EE27C02D03001807FB /* Fabric */, @@ -183,6 +188,7 @@ 0C7844E827C02CEE001807FB /* RNCSafeAreaView.m in Sources */, 0C7844E627C02CEE001807FB /* RNCSafeAreaViewEdges.m in Sources */, 0C7844E527C02CEE001807FB /* RNCSafeAreaViewManager.m in Sources */, + D697AA982D6F1D0A009C6433 /* RNCChangeEvent.m in Sources */, 0C7844EF27C02D03001807FB /* RNCSafeAreaContext.mm in Sources */, 0C7844E127C02CEE001807FB /* RNCSafeAreaViewLocalData.m in Sources */, 0C7844E227C02CEE001807FB /* RNCSafeAreaViewMode.m in Sources */, diff --git a/src/SafeAreaContext.tsx b/src/SafeAreaContext.tsx index 87ad0553..4ea2ec76 100644 --- a/src/SafeAreaContext.tsx +++ b/src/SafeAreaContext.tsx @@ -58,6 +58,8 @@ export function SafeAreaProvider({ nativeEvent: { frame: nextFrame, insets: nextInsets }, } = event; + console.log('onInsetsChange', nextInsets); + setFrame((curFrame) => { if ( // Backwards compat with old native code that won't send frame. From 8a9060aa9d6e78db38d7767fb71b7e9b546d0dca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Van=20der=20Auwermeulen?= Date: Wed, 26 Feb 2025 13:16:50 +0100 Subject: [PATCH 02/11] fix: revert upgrade changes --- ios/RNCSafeAreaProvider.m | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/ios/RNCSafeAreaProvider.m b/ios/RNCSafeAreaProvider.m index 5222e7bd..8f03f622 100644 --- a/ios/RNCSafeAreaProvider.m +++ b/ios/RNCSafeAreaProvider.m @@ -62,14 +62,28 @@ - (void)invalidateSafeAreaInsets return; } - UIEdgeInsets safeAreaInsets = self.safeAreaInsets; + #if TARGET_OS_IPHONE + UIEdgeInsets safeAreaInsets = self.safeAreaInsets; + #elif TARGET_OS_OSX + NSEdgeInsets safeAreaInsets; + if (@available(macOS 11.0, *)) { + safeAreaInsets = self.safeAreaInsets; + } else { + safeAreaInsets = NSEdgeInsetsZero; + } + #endif + CGRect frame = [self convertRect:self.bounds toView:RNCParentViewController(self).view]; if (_initialInsetsSent && - UIEdgeInsetsEqualToEdgeInsetsWithThreshold(safeAreaInsets, _currentSafeAreaInsets, 1.0 / RCTScreenScale()) && - CGRectEqualToRect(frame, _currentFrame)) { - return; - } + #if TARGET_OS_IPHONE + UIEdgeInsetsEqualToEdgeInsetsWithThreshold(safeAreaInsets, _currentSafeAreaInsets, 1.0 / RCTScreenScale()) && + #elif TARGET_OS_OSX + NSEdgeInsetsEqualToEdgeInsetsWithThreshold(safeAreaInsets, _currentSafeAreaInsets, 1.0 / RCTScreenScale()) && + #endif + CGRectEqualToRect(frame, _currentFrame)) { + return; + } _initialInsetsSent = YES; _currentSafeAreaInsets = safeAreaInsets; From 2057ab34d3aa262b009e340d256eb6bac3d03812 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Van=20der=20Auwermeulen?= Date: Wed, 26 Feb 2025 13:20:34 +0100 Subject: [PATCH 03/11] fix: revert upgrade changes --- ios/RNCSafeAreaProvider.h | 2 +- ios/RNCSafeAreaProvider.m | 38 +++++++++++++++++++------------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/ios/RNCSafeAreaProvider.h b/ios/RNCSafeAreaProvider.h index 7b2a6ca0..5f05c593 100644 --- a/ios/RNCSafeAreaProvider.h +++ b/ios/RNCSafeAreaProvider.h @@ -14,7 +14,7 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initWithEventDispatcher:(id)eventDispatcher NS_DESIGNATED_INITIALIZER; // NOTE: currently these event props are only declared so we can export the -// event names to JS - we don't call the blocks directly because scroll events +// event names to JS - we don't call the blocks directly because events // need to be coalesced before sending, for performance reasons. @property (nonatomic, copy) RCTBubblingEventBlock onInsetsChange; diff --git a/ios/RNCSafeAreaProvider.m b/ios/RNCSafeAreaProvider.m index 8f03f622..8bc15fa4 100644 --- a/ios/RNCSafeAreaProvider.m +++ b/ios/RNCSafeAreaProvider.m @@ -24,7 +24,7 @@ - (instancetype)initWithEventDispatcher:(id)eventDis RCTAssertParam(eventDispatcher); if ((self = [super initWithFrame:CGRectZero])) { -#if !TARGET_OS_TV +#if !TARGET_OS_TV && !TARGET_OS_OSX _eventDispatcher = eventDispatcher; @@ -62,28 +62,28 @@ - (void)invalidateSafeAreaInsets return; } - #if TARGET_OS_IPHONE - UIEdgeInsets safeAreaInsets = self.safeAreaInsets; - #elif TARGET_OS_OSX - NSEdgeInsets safeAreaInsets; - if (@available(macOS 11.0, *)) { - safeAreaInsets = self.safeAreaInsets; - } else { - safeAreaInsets = NSEdgeInsetsZero; - } - #endif +#if TARGET_OS_IPHONE + UIEdgeInsets safeAreaInsets = self.safeAreaInsets; +#elif TARGET_OS_OSX + NSEdgeInsets safeAreaInsets; + if (@available(macOS 11.0, *)) { + safeAreaInsets = self.safeAreaInsets; + } else { + safeAreaInsets = NSEdgeInsetsZero; + } +#endif CGRect frame = [self convertRect:self.bounds toView:RNCParentViewController(self).view]; if (_initialInsetsSent && - #if TARGET_OS_IPHONE - UIEdgeInsetsEqualToEdgeInsetsWithThreshold(safeAreaInsets, _currentSafeAreaInsets, 1.0 / RCTScreenScale()) && - #elif TARGET_OS_OSX - NSEdgeInsetsEqualToEdgeInsetsWithThreshold(safeAreaInsets, _currentSafeAreaInsets, 1.0 / RCTScreenScale()) && - #endif - CGRectEqualToRect(frame, _currentFrame)) { - return; - } +#if TARGET_OS_IPHONE + UIEdgeInsetsEqualToEdgeInsetsWithThreshold(safeAreaInsets, _currentSafeAreaInsets, 1.0 / RCTScreenScale()) && +#elif TARGET_OS_OSX + NSEdgeInsetsEqualToEdgeInsetsWithThreshold(safeAreaInsets, _currentSafeAreaInsets, 1.0 / RCTScreenScale()) && +#endif + CGRectEqualToRect(frame, _currentFrame)) { + return; + } _initialInsetsSent = YES; _currentSafeAreaInsets = safeAreaInsets; From ca32bcbae8a38a203cb40094ce31e3dbe798b725 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Van=20der=20Auwermeulen?= Date: Wed, 26 Feb 2025 13:22:02 +0100 Subject: [PATCH 04/11] fix: typo --- ios/RNCSafeAreaProvider.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/RNCSafeAreaProvider.m b/ios/RNCSafeAreaProvider.m index 8bc15fa4..d26e56ce 100644 --- a/ios/RNCSafeAreaProvider.m +++ b/ios/RNCSafeAreaProvider.m @@ -91,7 +91,7 @@ - (void)invalidateSafeAreaInsets [NSNotificationCenter.defaultCenter postNotificationName:RNCSafeAreaDidChange object:self userInfo:nil]; - // There's currently only 1 event name "change", so the _coalescingKey doesn't needs to be incremented + // There's currently only 1 event name "onInsetsChange", so the _coalescingKey doesn't needs to be incremented // Increment _coalescingKey if safeAreaInsets and frame are sent as separate events RNCChangeEvent *changeEvent = [[RNCChangeEvent alloc] initWithEventName:@"onInsetsChange" reactTag:self.reactTag From c1a4ad3ff771267c95a9a3092ee81b7bc590f50c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Van=20der=20Auwermeulen=20Gr=C3=A9goire?= Date: Wed, 26 Feb 2025 13:38:35 +0100 Subject: [PATCH 05/11] Apply suggestions from code review Co-authored-by: Jacob Parker --- ios/RNCSafeAreaProvider.m | 1 - src/SafeAreaContext.tsx | 2 -- 2 files changed, 3 deletions(-) diff --git a/ios/RNCSafeAreaProvider.m b/ios/RNCSafeAreaProvider.m index d26e56ce..2c3d28e7 100644 --- a/ios/RNCSafeAreaProvider.m +++ b/ios/RNCSafeAreaProvider.m @@ -84,7 +84,6 @@ - (void)invalidateSafeAreaInsets CGRectEqualToRect(frame, _currentFrame)) { return; } - _initialInsetsSent = YES; _currentSafeAreaInsets = safeAreaInsets; _currentFrame = frame; diff --git a/src/SafeAreaContext.tsx b/src/SafeAreaContext.tsx index 4ea2ec76..87ad0553 100644 --- a/src/SafeAreaContext.tsx +++ b/src/SafeAreaContext.tsx @@ -58,8 +58,6 @@ export function SafeAreaProvider({ nativeEvent: { frame: nextFrame, insets: nextInsets }, } = event; - console.log('onInsetsChange', nextInsets); - setFrame((curFrame) => { if ( // Backwards compat with old native code that won't send frame. From 0143064fd746fc2f9bd7a1bdcc923bb3328f8aaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Van=20der=20Auwermeulen?= Date: Wed, 26 Feb 2025 13:45:14 +0100 Subject: [PATCH 06/11] fix: review --- ios/RNCChangeEvent.m | 8 -------- ios/RNCSafeAreaProvider.m | 22 +++++++++------------- 2 files changed, 9 insertions(+), 21 deletions(-) diff --git a/ios/RNCChangeEvent.m b/ios/RNCChangeEvent.m index 8a31da43..3b57014d 100644 --- a/ios/RNCChangeEvent.m +++ b/ios/RNCChangeEvent.m @@ -75,13 +75,5 @@ - (NSArray *)arguments { return @[ self.viewTag, RCTNormalizeInputEventName(self.eventName), [self body] ]; } - -/* -Not sure if this is needed as eventName is passed in arguments -- (NSString *)eventName -{ - return _eventName; -} -*/ @end diff --git a/ios/RNCSafeAreaProvider.m b/ios/RNCSafeAreaProvider.m index 2c3d28e7..4e3b3799 100644 --- a/ios/RNCSafeAreaProvider.m +++ b/ios/RNCSafeAreaProvider.m @@ -16,7 +16,6 @@ @implementation RNCSafeAreaProvider { UIEdgeInsets _currentSafeAreaInsets; CGRect _currentFrame; BOOL _initialInsetsSent; - uint16_t _coalescingKey; } - (instancetype)initWithEventDispatcher:(id)eventDispatcher @@ -89,14 +88,12 @@ - (void)invalidateSafeAreaInsets _currentFrame = frame; [NSNotificationCenter.defaultCenter postNotificationName:RNCSafeAreaDidChange object:self userInfo:nil]; - - // There's currently only 1 event name "onInsetsChange", so the _coalescingKey doesn't needs to be incremented - // Increment _coalescingKey if safeAreaInsets and frame are sent as separate events - RNCChangeEvent *changeEvent = [[RNCChangeEvent alloc] initWithEventName:@"onInsetsChange" - reactTag:self.reactTag - insets:safeAreaInsets - frame:frame - coalescingKey:_coalescingKey]; + + RNCChangeEvent *changeEvent = [[RNCChangeEvent alloc] initWithEventName:@"onInsetsChange" + reactTag:self.reactTag + insets:safeAreaInsets + frame:frame + coalescingKey:0]; [_eventDispatcher sendEvent:changeEvent]; @@ -109,13 +106,12 @@ - (void)layoutSubviews [self invalidateSafeAreaInsets]; } +RCT_NOT_IMPLEMENTED(-(instancetype)initWithFrame : (CGRect)frame) +RCT_NOT_IMPLEMENTED(-(instancetype)initWithCoder : (NSCoder *)aDecoder) + - (void)dealloc { [_eventDispatcher.bridge.uiManager.observerCoordinator removeObserver:self]; } - -RCT_NOT_IMPLEMENTED(-(instancetype)initWithFrame : (CGRect)frame) -RCT_NOT_IMPLEMENTED(-(instancetype)initWithCoder : (NSCoder *)aDecoder) - @end From 792774a6d0100c7b16467da121573e7c738afba3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Van=20der=20Auwermeulen=20Gr=C3=A9goire?= Date: Wed, 26 Feb 2025 13:53:50 +0100 Subject: [PATCH 07/11] Update ios/RNCSafeAreaProvider.m Co-authored-by: Jacob Parker --- ios/RNCSafeAreaProvider.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/RNCSafeAreaProvider.m b/ios/RNCSafeAreaProvider.m index 4e3b3799..413d8cf3 100644 --- a/ios/RNCSafeAreaProvider.m +++ b/ios/RNCSafeAreaProvider.m @@ -106,8 +106,8 @@ - (void)layoutSubviews [self invalidateSafeAreaInsets]; } -RCT_NOT_IMPLEMENTED(-(instancetype)initWithFrame : (CGRect)frame) -RCT_NOT_IMPLEMENTED(-(instancetype)initWithCoder : (NSCoder *)aDecoder) +RCT_NOT_IMPLEMENTED(-(instancetype)initWithFrame:(CGRect)frame) +RCT_NOT_IMPLEMENTED(-(instancetype)initWithCoder:(NSCoder *)aDecoder) - (void)dealloc { From c759b7110006b6a2e754fd0a054da438d54f3936 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Van=20der=20Auwermeulen?= Date: Wed, 26 Feb 2025 21:46:33 +0100 Subject: [PATCH 08/11] fix: format --- ios/RNCChangeEvent.m | 56 +++++++++++++++++++-------------------- ios/RNCSafeAreaProvider.m | 19 +++++++------ 2 files changed, 37 insertions(+), 38 deletions(-) diff --git a/ios/RNCChangeEvent.m b/ios/RNCChangeEvent.m index 3b57014d..92375613 100644 --- a/ios/RNCChangeEvent.m +++ b/ios/RNCChangeEvent.m @@ -2,9 +2,9 @@ #import @implementation RNCChangeEvent { - UIEdgeInsets _insets; - CGRect _frame; - uint16_t _coalescingKey; + UIEdgeInsets _insets; + CGRect _frame; + uint16_t _coalescingKey; } @synthesize eventName = _eventName; @@ -16,41 +16,41 @@ - (instancetype)initWithEventName:(NSString *)eventName frame:(CGRect)frame coalescingKey:(uint16_t)coalescingKey { - RCTAssertParam(reactTag); - - if ((self = [super init])) { - _eventName = [eventName copy]; - _viewTag = reactTag; - _frame = frame; - _insets = insets; - _coalescingKey = coalescingKey; - } - - return self; + RCTAssertParam(reactTag); + + if ((self = [super init])) { + _eventName = [eventName copy]; + _viewTag = reactTag; + _frame = frame; + _insets = insets; + _coalescingKey = coalescingKey; + } + + return self; } RCT_NOT_IMPLEMENTED(-(instancetype)init) - (uint16_t)coalescingKey { - return _coalescingKey; + return _coalescingKey; } - (NSDictionary *)body { NSDictionary *body = @{ - @"insets" : @{ - @"top" : @(_insets.top), - @"right" : @(_insets.right), - @"bottom" : @(_insets.bottom), - @"left" : @(_insets.left), - }, - @"frame" : @{ - @"x" : @(_frame.origin.x), - @"y" : @(_frame.origin.y), - @"width" : @(_frame.size.width), - @"height" : @(_frame.size.height), - }, + @"insets" : @{ + @"top" : @(_insets.top), + @"right" : @(_insets.right), + @"bottom" : @(_insets.bottom), + @"left" : @(_insets.left), + }, + @"frame" : @{ + @"x" : @(_frame.origin.x), + @"y" : @(_frame.origin.y), + @"width" : @(_frame.size.width), + @"height" : @(_frame.size.height), + }, }; return body; @@ -75,5 +75,5 @@ - (NSArray *)arguments { return @[ self.viewTag, RCTNormalizeInputEventName(self.eventName), [self body] ]; } - + @end diff --git a/ios/RNCSafeAreaProvider.m b/ios/RNCSafeAreaProvider.m index 4e3b3799..975d22ee 100644 --- a/ios/RNCSafeAreaProvider.m +++ b/ios/RNCSafeAreaProvider.m @@ -1,11 +1,11 @@ #import "RNCSafeAreaProvider.h" -#import #import +#import #import #import "RCTUIManagerObserverCoordinator.h" -#import "RNCSafeAreaUtils.h" #import "RNCChangeEvent.h" +#import "RNCSafeAreaUtils.h" @interface RNCSafeAreaProvider () @@ -20,11 +20,11 @@ @implementation RNCSafeAreaProvider { - (instancetype)initWithEventDispatcher:(id)eventDispatcher { - RCTAssertParam(eventDispatcher); - - if ((self = [super initWithFrame:CGRectZero])) { + RCTAssertParam(eventDispatcher); + + if ((self = [super initWithFrame:CGRectZero])) { #if !TARGET_OS_TV && !TARGET_OS_OSX - + _eventDispatcher = eventDispatcher; [NSNotificationCenter.defaultCenter addObserver:self @@ -71,7 +71,7 @@ - (void)invalidateSafeAreaInsets safeAreaInsets = NSEdgeInsetsZero; } #endif - + CGRect frame = [self convertRect:self.bounds toView:RNCParentViewController(self).view]; if (_initialInsetsSent && @@ -88,14 +88,13 @@ - (void)invalidateSafeAreaInsets _currentFrame = frame; [NSNotificationCenter.defaultCenter postNotificationName:RNCSafeAreaDidChange object:self userInfo:nil]; - + RNCChangeEvent *changeEvent = [[RNCChangeEvent alloc] initWithEventName:@"onInsetsChange" reactTag:self.reactTag insets:safeAreaInsets frame:frame coalescingKey:0]; - - + [_eventDispatcher sendEvent:changeEvent]; } From 54fe9d2db94a87dafcb212cb7cb798880df488d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Van=20der=20Auwermeulen?= Date: Wed, 26 Feb 2025 23:06:09 +0100 Subject: [PATCH 09/11] fix: format --- ios/RNCSafeAreaProvider.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/RNCSafeAreaProvider.m b/ios/RNCSafeAreaProvider.m index 7a1a207e..975d22ee 100644 --- a/ios/RNCSafeAreaProvider.m +++ b/ios/RNCSafeAreaProvider.m @@ -105,8 +105,8 @@ - (void)layoutSubviews [self invalidateSafeAreaInsets]; } -RCT_NOT_IMPLEMENTED(-(instancetype)initWithFrame:(CGRect)frame) -RCT_NOT_IMPLEMENTED(-(instancetype)initWithCoder:(NSCoder *)aDecoder) +RCT_NOT_IMPLEMENTED(-(instancetype)initWithFrame : (CGRect)frame) +RCT_NOT_IMPLEMENTED(-(instancetype)initWithCoder : (NSCoder *)aDecoder) - (void)dealloc { From dee3b8ac311a87d436749076f562fc206e04a8b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Van=20der=20Auwermeulen?= Date: Wed, 26 Feb 2025 23:08:33 +0100 Subject: [PATCH 10/11] fix: rename --- ios/{RNCChangeEvent.h => RNCOnInsetsChangeEvent.h} | 2 +- ios/{RNCChangeEvent.m => RNCOnInsetsChangeEvent.m} | 6 +++--- ios/RNCSafeAreaProvider.m | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) rename ios/{RNCChangeEvent.h => RNCOnInsetsChangeEvent.h} (87%) rename ios/{RNCChangeEvent.m => RNCOnInsetsChangeEvent.m} (90%) diff --git a/ios/RNCChangeEvent.h b/ios/RNCOnInsetsChangeEvent.h similarity index 87% rename from ios/RNCChangeEvent.h rename to ios/RNCOnInsetsChangeEvent.h index ecaa81a2..09184291 100644 --- a/ios/RNCChangeEvent.h +++ b/ios/RNCOnInsetsChangeEvent.h @@ -1,7 +1,7 @@ #import #import -@interface RNCChangeEvent : NSObject +@interface RNCOnInsetsChangeEvent : NSObject - (instancetype)initWithEventName:(NSString *)eventName reactTag:(NSNumber *)reactTag diff --git a/ios/RNCChangeEvent.m b/ios/RNCOnInsetsChangeEvent.m similarity index 90% rename from ios/RNCChangeEvent.m rename to ios/RNCOnInsetsChangeEvent.m index 92375613..1f973c72 100644 --- a/ios/RNCChangeEvent.m +++ b/ios/RNCOnInsetsChangeEvent.m @@ -1,7 +1,7 @@ -#import "RNCChangeEvent.h" +#import "RNCOnInsetsChangeEvent.h" #import -@implementation RNCChangeEvent { +@implementation RNCOnInsetsChangeEvent { UIEdgeInsets _insets; CGRect _frame; uint16_t _coalescingKey; @@ -61,7 +61,7 @@ - (BOOL)canCoalesce return YES; } -- (RNCChangeEvent *)coalesceWithEvent:(RNCChangeEvent *)newEvent +- (RNCOnInsetsChangeEvent *)coalesceWithEvent:(RNCOnInsetsChangeEvent *)newEvent { return newEvent; } diff --git a/ios/RNCSafeAreaProvider.m b/ios/RNCSafeAreaProvider.m index 975d22ee..31c97984 100644 --- a/ios/RNCSafeAreaProvider.m +++ b/ios/RNCSafeAreaProvider.m @@ -4,7 +4,7 @@ #import #import #import "RCTUIManagerObserverCoordinator.h" -#import "RNCChangeEvent.h" +#import "RNCOnInsetsChangeEvent.h" #import "RNCSafeAreaUtils.h" @interface RNCSafeAreaProvider () @@ -89,13 +89,13 @@ - (void)invalidateSafeAreaInsets [NSNotificationCenter.defaultCenter postNotificationName:RNCSafeAreaDidChange object:self userInfo:nil]; - RNCChangeEvent *changeEvent = [[RNCChangeEvent alloc] initWithEventName:@"onInsetsChange" + RNCOnInsetsChangeEvent *onInsetsChangeEvent = [[RNCOnInsetsChangeEvent alloc] initWithEventName:@"onInsetsChange" reactTag:self.reactTag insets:safeAreaInsets frame:frame coalescingKey:0]; - [_eventDispatcher sendEvent:changeEvent]; + [_eventDispatcher sendEvent:onInsetsChangeEvent]; } - (void)layoutSubviews From 0956abd357f50a8caa04b4b1c7680b137db0b6fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Van=20der=20Auwermeulen?= Date: Thu, 27 Feb 2025 16:20:34 +0100 Subject: [PATCH 11/11] fix: format --- ios/RNCSafeAreaProvider.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ios/RNCSafeAreaProvider.m b/ios/RNCSafeAreaProvider.m index 31c97984..b5b7bef3 100644 --- a/ios/RNCSafeAreaProvider.m +++ b/ios/RNCSafeAreaProvider.m @@ -90,10 +90,10 @@ - (void)invalidateSafeAreaInsets [NSNotificationCenter.defaultCenter postNotificationName:RNCSafeAreaDidChange object:self userInfo:nil]; RNCOnInsetsChangeEvent *onInsetsChangeEvent = [[RNCOnInsetsChangeEvent alloc] initWithEventName:@"onInsetsChange" - reactTag:self.reactTag - insets:safeAreaInsets - frame:frame - coalescingKey:0]; + reactTag:self.reactTag + insets:safeAreaInsets + frame:frame + coalescingKey:0]; [_eventDispatcher sendEvent:onInsetsChangeEvent]; }