@amazon-devices/react-native-safe-area-context 2.0.9000000000 → 8.0.9000000000-rn-83
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -302
- package/SystemBundles/{85c8d24b7f717b77a2deb00e32cc2aaa293a5a16c46eecebca21e95bda425730.bundle → 920f0b3a0c43cc93db1621b4c3a47e06a0d4ed32175c793e9934ad9c764fbc25.bundle} +6447 -9418
- package/SystemBundles/920f0b3a0c43cc93db1621b4c3a47e06a0d4ed32175c793e9934ad9c764fbc25.map +2780 -0
- package/SystemModules/amzn__react-native-safe-area-context-8.modules.txt +7 -0
- package/SystemModules/amzn__react-native-safe-area-context-8.private.modules.txt +61 -0
- package/SystemModules/keplerscript-system-bundle-config.json +3 -3
- package/android/build.gradle +103 -25
- package/android/gradle.properties +1 -0
- package/android/spotless.gradle +24 -0
- package/android/src/fabric/java/com/th3rdwave/safeareacontext/InsetsChangeEvent.kt +25 -0
- package/android/src/fabric/java/com/th3rdwave/safeareacontext/UIManagerHelperCompat.kt +14 -0
- package/android/src/main/AndroidManifest.xml +1 -2
- package/android/src/main/java/com/th3rdwave/safeareacontext/EdgeInsets.kt +3 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/Rect.kt +3 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaContextModule.kt +32 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaContextPackage.kt +41 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaProvider.kt +47 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaProviderManager.kt +41 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaUtils.kt +102 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaView.kt +155 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewEdges.kt +16 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewLocalData.kt +7 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewManager.kt +73 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewMode.kt +6 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewShadowNode.kt +170 -0
- package/android/src/main/java/com/th3rdwave/safeareacontext/SerializationUtils.kt +39 -0
- package/android/src/main/jni/CMakeLists.txt +87 -0
- package/android/src/main/jni/safeareacontext.h +17 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNCSafeAreaProviderManagerDelegate.java +31 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNCSafeAreaProviderManagerInterface.java +16 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNCSafeAreaViewManagerDelegate.java +41 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNCSafeAreaViewManagerInterface.java +20 -0
- package/android/src/paper/java/com/th3rdwave/safeareacontext/InsetsChangeEvent.kt +29 -0
- package/android/src/paper/java/com/th3rdwave/safeareacontext/NativeSafeAreaContextSpec.java +56 -0
- package/android/src/paper/java/com/th3rdwave/safeareacontext/UIManagerHelperCompat.kt +20 -0
- package/common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewComponentDescriptor.h +25 -0
- package/common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewShadowNode.cpp +131 -0
- package/common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewShadowNode.h +36 -0
- package/common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewState.cpp +23 -0
- package/common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewState.h +56 -0
- package/ios/Fabric/RNCSafeAreaProviderComponentView.h +13 -0
- package/ios/Fabric/RNCSafeAreaProviderComponentView.mm +129 -0
- package/ios/Fabric/RNCSafeAreaViewComponentView.h +11 -0
- package/ios/Fabric/RNCSafeAreaViewComponentView.mm +153 -0
- package/ios/RNCSafeAreaContext.h +9 -0
- package/ios/RNCSafeAreaContext.mm +85 -0
- package/ios/{SafeAreaView/RNCSafeAreaProvider.h → RNCSafeAreaProvider.h} +4 -0
- package/ios/RNCSafeAreaProvider.m +102 -0
- package/ios/RNCSafeAreaProviderManager.m +20 -0
- package/ios/{SafeAreaView/RNCSafeAreaShadowView.m → RNCSafeAreaShadowView.m} +50 -36
- package/ios/RNCSafeAreaUtils.h +22 -0
- package/ios/RNCSafeAreaUtils.m +41 -0
- package/ios/{SafeAreaView/RNCSafeAreaView.h → RNCSafeAreaView.h} +8 -4
- package/ios/RNCSafeAreaView.m +168 -0
- package/ios/RNCSafeAreaViewEdgeMode.h +12 -0
- package/ios/RNCSafeAreaViewEdgeMode.m +16 -0
- package/ios/RNCSafeAreaViewEdges.h +15 -0
- package/ios/RNCSafeAreaViewEdges.m +36 -0
- package/ios/{SafeAreaView/RNCSafeAreaViewLocalData.h → RNCSafeAreaViewLocalData.h} +12 -1
- package/ios/{SafeAreaView/RNCSafeAreaViewLocalData.m → RNCSafeAreaViewLocalData.m} +4 -0
- package/ios/{SafeAreaView/RNCSafeAreaViewManager.m → RNCSafeAreaViewManager.m} +5 -1
- package/ios/RNCSafeAreaViewMode.m +15 -0
- package/ios/{SafeAreaView.xcodeproj → RNSafeAreaContext.xcodeproj}/project.pbxproj +70 -56
- package/jest/mock.tsx +59 -0
- package/kepler-compatibility.json +2 -2
- package/lib/commonjs/CompatNativeSafeAreaProvider.js +6 -6
- package/lib/commonjs/CompatNativeSafeAreaProvider.js.map +1 -1
- package/lib/commonjs/InitialWindow.js.map +1 -1
- package/lib/commonjs/InitialWindow.kepler.js +1 -1
- package/lib/commonjs/InitialWindow.kepler.js.map +1 -1
- package/lib/commonjs/InitialWindow.native.js +4 -4
- package/lib/commonjs/InitialWindow.native.js.map +1 -1
- package/lib/commonjs/NativeSafeAreaProvider.js +7 -124
- package/lib/commonjs/NativeSafeAreaProvider.js.map +1 -1
- package/lib/commonjs/NativeSafeAreaProvider.kepler.js +6 -2
- package/lib/commonjs/NativeSafeAreaProvider.kepler.js.map +1 -1
- package/lib/commonjs/NativeSafeAreaProvider.web.js +135 -0
- package/lib/commonjs/NativeSafeAreaProvider.web.js.map +1 -0
- package/lib/commonjs/NativeSafeAreaProvider.windows.js +6 -2
- package/lib/commonjs/NativeSafeAreaProvider.windows.js.map +1 -1
- package/lib/commonjs/SafeArea.types.js.map +1 -1
- package/lib/commonjs/SafeAreaContext.js +55 -34
- package/lib/commonjs/SafeAreaContext.js.map +1 -1
- package/lib/commonjs/SafeAreaView.js +39 -71
- package/lib/commonjs/SafeAreaView.js.map +1 -1
- package/lib/commonjs/SafeAreaView.kepler.js.map +1 -1
- package/lib/commonjs/SafeAreaView.web.js +91 -0
- package/lib/commonjs/SafeAreaView.web.js.map +1 -0
- package/lib/commonjs/SafeAreaView.windows.js.map +1 -1
- package/lib/commonjs/index.js +1 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/specs/NativeSafeAreaContext.js +9 -0
- package/lib/commonjs/specs/NativeSafeAreaContext.js.map +1 -0
- package/lib/commonjs/specs/NativeSafeAreaProvider.js +10 -0
- package/lib/commonjs/specs/NativeSafeAreaProvider.js.map +1 -0
- package/lib/commonjs/specs/NativeSafeAreaView.js +12 -0
- package/lib/commonjs/specs/NativeSafeAreaView.js.map +1 -0
- package/lib/module/CompatNativeSafeAreaProvider.js +8 -5
- package/lib/module/CompatNativeSafeAreaProvider.js.map +1 -1
- package/lib/module/InitialWindow.js +2 -0
- package/lib/module/InitialWindow.js.map +1 -1
- package/lib/module/InitialWindow.kepler.js +3 -1
- package/lib/module/InitialWindow.kepler.js.map +1 -1
- package/lib/module/InitialWindow.native.js +5 -4
- package/lib/module/InitialWindow.native.js.map +1 -1
- package/lib/module/NativeSafeAreaProvider.js +3 -122
- package/lib/module/NativeSafeAreaProvider.js.map +1 -1
- package/lib/module/NativeSafeAreaProvider.kepler.js +3 -2
- package/lib/module/NativeSafeAreaProvider.kepler.js.map +1 -1
- package/lib/module/NativeSafeAreaProvider.web.js +130 -0
- package/lib/module/NativeSafeAreaProvider.web.js.map +1 -0
- package/lib/module/NativeSafeAreaProvider.windows.js +3 -2
- package/lib/module/NativeSafeAreaProvider.windows.js.map +1 -1
- package/lib/module/SafeArea.types.js +2 -0
- package/lib/module/SafeArea.types.js.map +1 -1
- package/lib/module/SafeAreaContext.js +57 -33
- package/lib/module/SafeAreaContext.js.map +1 -1
- package/lib/module/SafeAreaView.js +38 -69
- package/lib/module/SafeAreaView.js.map +1 -1
- package/lib/module/SafeAreaView.kepler.js +2 -0
- package/lib/module/SafeAreaView.kepler.js.map +1 -1
- package/lib/module/SafeAreaView.web.js +86 -0
- package/lib/module/SafeAreaView.web.js.map +1 -0
- package/lib/module/SafeAreaView.windows.js +2 -0
- package/lib/module/SafeAreaView.windows.js.map +1 -1
- package/lib/module/index.js +3 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/specs/NativeSafeAreaContext.js +5 -0
- package/lib/module/specs/NativeSafeAreaContext.js.map +1 -0
- package/lib/module/specs/NativeSafeAreaProvider.js +5 -0
- package/lib/module/specs/NativeSafeAreaProvider.js.map +1 -0
- package/lib/module/specs/NativeSafeAreaView.js +7 -0
- package/lib/module/specs/NativeSafeAreaView.js.map +1 -0
- package/lib/typescript/CompatNativeSafeAreaProvider.d.ts +4 -0
- package/lib/typescript/CompatNativeSafeAreaProvider.d.ts.map +1 -0
- package/lib/typescript/{src/InitialWindow.d.ts → InitialWindow.d.ts} +2 -1
- package/lib/typescript/InitialWindow.d.ts.map +1 -0
- package/lib/typescript/{src/InitialWindow.kepler.d.ts → InitialWindow.kepler.d.ts} +1 -0
- package/lib/typescript/InitialWindow.kepler.d.ts.map +1 -0
- package/lib/typescript/{src/InitialWindow.native.d.ts → InitialWindow.native.d.ts} +2 -1
- package/lib/typescript/InitialWindow.native.d.ts.map +1 -0
- package/lib/typescript/NativeSafeAreaProvider.d.ts +3 -0
- package/lib/typescript/NativeSafeAreaProvider.d.ts.map +1 -0
- package/lib/typescript/NativeSafeAreaProvider.kepler.d.ts +2 -0
- package/lib/typescript/NativeSafeAreaProvider.kepler.d.ts.map +1 -0
- package/lib/typescript/NativeSafeAreaProvider.web.d.ts +4 -0
- package/lib/typescript/NativeSafeAreaProvider.web.d.ts.map +1 -0
- package/lib/typescript/NativeSafeAreaProvider.windows.d.ts +2 -0
- package/lib/typescript/NativeSafeAreaProvider.windows.d.ts.map +1 -0
- package/lib/typescript/SafeArea.types.d.ts +36 -0
- package/lib/typescript/SafeArea.types.d.ts.map +1 -0
- package/lib/typescript/{src/SafeAreaContext.d.ts → SafeAreaContext.d.ts} +9 -6
- package/lib/typescript/SafeAreaContext.d.ts.map +1 -0
- package/lib/typescript/SafeAreaView.d.ts +5 -0
- package/lib/typescript/SafeAreaView.d.ts.map +1 -0
- package/lib/typescript/{src/SafeAreaView.kepler.d.ts → SafeAreaView.kepler.d.ts} +1 -0
- package/lib/typescript/SafeAreaView.kepler.d.ts.map +1 -0
- package/lib/typescript/SafeAreaView.web.d.ts +4 -0
- package/lib/typescript/SafeAreaView.web.d.ts.map +1 -0
- package/lib/typescript/SafeAreaView.windows.d.ts +3 -0
- package/lib/typescript/SafeAreaView.windows.d.ts.map +1 -0
- package/lib/typescript/{src/index.d.ts → index.d.ts} +1 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/specs/NativeSafeAreaContext.d.ts +23 -0
- package/lib/typescript/specs/NativeSafeAreaContext.d.ts.map +1 -0
- package/lib/typescript/specs/NativeSafeAreaProvider.d.ts +22 -0
- package/lib/typescript/specs/NativeSafeAreaProvider.d.ts.map +1 -0
- package/lib/typescript/specs/NativeSafeAreaView.d.ts +14 -0
- package/lib/typescript/specs/NativeSafeAreaView.d.ts.map +1 -0
- package/oss-attribution/attribution.txt +0 -0
- package/oss-attribution/licenseInfos.json +1 -0
- package/package.json +137 -1
- package/react-native-safe-area-context.podspec +26 -4
- package/react-native.config.js +8 -0
- package/src/CompatNativeSafeAreaProvider.tsx +2 -3
- package/src/InitialWindow.kepler.ts +1 -1
- package/src/InitialWindow.native.ts +5 -11
- package/src/InitialWindow.ts +1 -1
- package/src/NativeSafeAreaProvider.kepler.tsx +1 -3
- package/src/NativeSafeAreaProvider.tsx +2 -128
- package/src/NativeSafeAreaProvider.web.tsx +127 -0
- package/src/NativeSafeAreaProvider.windows.tsx +1 -3
- package/src/SafeArea.types.ts +15 -11
- package/src/SafeAreaContext.tsx +66 -43
- package/src/SafeAreaView.tsx +47 -82
- package/src/SafeAreaView.web.tsx +123 -0
- package/src/SafeAreaView.windows.tsx +2 -1
- package/src/index.tsx +2 -0
- package/src/specs/NativeSafeAreaContext.ts +23 -0
- package/src/specs/NativeSafeAreaProvider.ts +29 -0
- package/src/specs/NativeSafeAreaView.ts +17 -0
- package/SystemBundles/85c8d24b7f717b77a2deb00e32cc2aaa293a5a16c46eecebca21e95bda425730.map +0 -4335
- package/SystemModules/amzn__react-native-safe-area-context-2.modules.txt +0 -55
- package/SystemModules/amzn__react-native-safe-area-context-2.private.modules.txt +0 -90
- package/THIRD_PARTY_NOTICES.txt +0 -24
- package/android/src/main/java/com/th3rdwave/safeareacontext/EdgeInsets.java +0 -22
- package/android/src/main/java/com/th3rdwave/safeareacontext/InsetsChangeEvent.java +0 -33
- package/android/src/main/java/com/th3rdwave/safeareacontext/Rect.java +0 -22
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaContextPackage.java +0 -31
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaProvider.java +0 -66
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaProviderManager.java +0 -94
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaUtils.java +0 -82
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaView.java +0 -159
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewEdges.java +0 -8
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewLocalData.java +0 -27
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewManager.java +0 -72
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewMode.java +0 -6
- package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewShadowNode.java +0 -201
- package/android/src/main/java/com/th3rdwave/safeareacontext/SerializationUtils.java +0 -52
- package/ios/SafeAreaView/RCTView+SafeAreaCompat.h +0 -16
- package/ios/SafeAreaView/RCTView+SafeAreaCompat.m +0 -57
- package/ios/SafeAreaView/RNCSafeAreaProvider.m +0 -65
- package/ios/SafeAreaView/RNCSafeAreaProviderManager.m +0 -61
- package/ios/SafeAreaView/RNCSafeAreaView.m +0 -118
- package/ios/SafeAreaView/RNCSafeAreaViewEdges.h +0 -9
- package/ios/SafeAreaView/RNCSafeAreaViewEdges.m +0 -13
- package/ios/SafeAreaView/RNCSafeAreaViewMode.m +0 -11
- package/lib/commonjs/NativeSafeAreaProvider.macos.js +0 -9
- package/lib/commonjs/NativeSafeAreaProvider.macos.js.map +0 -1
- package/lib/commonjs/NativeSafeAreaProvider.native.js +0 -9
- package/lib/commonjs/NativeSafeAreaProvider.native.js.map +0 -1
- package/lib/commonjs/SafeAreaView.macos.js +0 -9
- package/lib/commonjs/SafeAreaView.macos.js.map +0 -1
- package/lib/commonjs/SafeAreaView.native.js +0 -9
- package/lib/commonjs/SafeAreaView.native.js.map +0 -1
- package/lib/commonjs/useWindowDimensions.js +0 -32
- package/lib/commonjs/useWindowDimensions.js.map +0 -1
- package/lib/module/NativeSafeAreaProvider.macos.js +0 -3
- package/lib/module/NativeSafeAreaProvider.macos.js.map +0 -1
- package/lib/module/NativeSafeAreaProvider.native.js +0 -3
- package/lib/module/NativeSafeAreaProvider.native.js.map +0 -1
- package/lib/module/SafeAreaView.macos.js +0 -3
- package/lib/module/SafeAreaView.macos.js.map +0 -1
- package/lib/module/SafeAreaView.native.js +0 -3
- package/lib/module/SafeAreaView.native.js.map +0 -1
- package/lib/module/useWindowDimensions.js +0 -26
- package/lib/module/useWindowDimensions.js.map +0 -1
- package/lib/typescript/src/CompatNativeSafeAreaProvider.d.ts +0 -2
- package/lib/typescript/src/NativeSafeAreaProvider.d.ts +0 -2
- package/lib/typescript/src/NativeSafeAreaProvider.kepler.d.ts +0 -2
- package/lib/typescript/src/NativeSafeAreaProvider.macos.d.ts +0 -2
- package/lib/typescript/src/NativeSafeAreaProvider.native.d.ts +0 -3
- package/lib/typescript/src/NativeSafeAreaProvider.windows.d.ts +0 -2
- package/lib/typescript/src/SafeArea.types.d.ts +0 -31
- package/lib/typescript/src/SafeAreaView.d.ts +0 -2
- package/lib/typescript/src/SafeAreaView.macos.d.ts +0 -2
- package/lib/typescript/src/SafeAreaView.native.d.ts +0 -2
- package/lib/typescript/src/SafeAreaView.windows.d.ts +0 -2
- package/lib/typescript/src/useWindowDimensions.d.ts +0 -8
- package/src/NativeSafeAreaProvider.macos.tsx +0 -3
- package/src/NativeSafeAreaProvider.native.tsx +0 -6
- package/src/SafeAreaView.macos.tsx +0 -3
- package/src/SafeAreaView.native.tsx +0 -6
- package/src/useWindowDimensions.tsx +0 -35
- /package/ios/{SafeAreaView/RNCSafeAreaProviderManager.h → RNCSafeAreaProviderManager.h} +0 -0
- /package/ios/{SafeAreaView/RNCSafeAreaShadowView.h → RNCSafeAreaShadowView.h} +0 -0
- /package/ios/{SafeAreaView/RNCSafeAreaViewManager.h → RNCSafeAreaViewManager.h} +0 -0
- /package/ios/{SafeAreaView/RNCSafeAreaViewMode.h → RNCSafeAreaViewMode.h} +0 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#import "RNCSafeAreaContext.h"
|
|
2
|
+
|
|
3
|
+
#import <React/RCTUtils.h>
|
|
4
|
+
#if TARGET_OS_IPHONE
|
|
5
|
+
#import <UIKit/UIKit.h>
|
|
6
|
+
#elif TARGET_OS_OSX
|
|
7
|
+
#import <AppKit/AppKit.h>
|
|
8
|
+
#endif
|
|
9
|
+
#ifdef RCT_NEW_ARCH_ENABLED
|
|
10
|
+
#import <safeareacontext/safeareacontext.h>
|
|
11
|
+
#endif
|
|
12
|
+
|
|
13
|
+
#ifdef RCT_NEW_ARCH_ENABLED
|
|
14
|
+
using namespace facebook::react;
|
|
15
|
+
|
|
16
|
+
@interface RNCSafeAreaContext () <NativeSafeAreaContextSpec>
|
|
17
|
+
@end
|
|
18
|
+
#endif
|
|
19
|
+
|
|
20
|
+
@implementation RNCSafeAreaContext
|
|
21
|
+
|
|
22
|
+
RCT_EXPORT_MODULE()
|
|
23
|
+
|
|
24
|
+
+ (BOOL)requiresMainQueueSetup
|
|
25
|
+
{
|
|
26
|
+
return YES;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
- (NSDictionary *)constantsToExport
|
|
30
|
+
{
|
|
31
|
+
return [self getConstants];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
- (NSDictionary *)getConstants
|
|
35
|
+
{
|
|
36
|
+
__block NSDictionary *constants;
|
|
37
|
+
|
|
38
|
+
RCTUnsafeExecuteOnMainQueueSync(^{
|
|
39
|
+
#if TARGET_OS_IPHONE
|
|
40
|
+
UIWindow *window = RCTKeyWindow();
|
|
41
|
+
#elif TARGET_OS_OSX
|
|
42
|
+
NSWindow *window = RCTKeyWindow();
|
|
43
|
+
#endif
|
|
44
|
+
if (window == nil) {
|
|
45
|
+
constants = @{@"initialWindowMetrics" : [NSNull null]};
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
#if TARGET_OS_IPHONE
|
|
50
|
+
UIEdgeInsets safeAreaInsets = window.safeAreaInsets;
|
|
51
|
+
#elif TARGET_OS_OSX
|
|
52
|
+
NSEdgeInsets safeAreaInsets = NSEdgeInsetsZero;
|
|
53
|
+
#endif
|
|
54
|
+
|
|
55
|
+
constants = @{
|
|
56
|
+
@"initialWindowMetrics" : @{
|
|
57
|
+
@"insets" : @{
|
|
58
|
+
@"top" : @(safeAreaInsets.top),
|
|
59
|
+
@"right" : @(safeAreaInsets.right),
|
|
60
|
+
@"bottom" : @(safeAreaInsets.bottom),
|
|
61
|
+
@"left" : @(safeAreaInsets.left),
|
|
62
|
+
},
|
|
63
|
+
@"frame" : @{
|
|
64
|
+
@"x" : @(window.frame.origin.x),
|
|
65
|
+
@"y" : @(window.frame.origin.y),
|
|
66
|
+
@"width" : @(window.frame.size.width),
|
|
67
|
+
@"height" : @(window.frame.size.height),
|
|
68
|
+
},
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
return constants;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
#ifdef RCT_NEW_ARCH_ENABLED
|
|
77
|
+
|
|
78
|
+
- (std::shared_ptr<TurboModule>)getTurboModule:(const ObjCTurboModule::InitParams &)params
|
|
79
|
+
{
|
|
80
|
+
return std::make_shared<NativeSafeAreaContextSpecJSI>(params);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
#endif
|
|
84
|
+
|
|
85
|
+
@end
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
#import "RNCSafeAreaProvider.h"
|
|
2
|
+
|
|
3
|
+
#import <React/RCTBridge.h>
|
|
4
|
+
#import <React/RCTUIManager.h>
|
|
5
|
+
#import "RNCSafeAreaUtils.h"
|
|
6
|
+
|
|
7
|
+
@implementation RNCSafeAreaProvider {
|
|
8
|
+
UIEdgeInsets _currentSafeAreaInsets;
|
|
9
|
+
CGRect _currentFrame;
|
|
10
|
+
BOOL _initialInsetsSent;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
- (instancetype)init
|
|
14
|
+
{
|
|
15
|
+
if ((self = [super init])) {
|
|
16
|
+
#if !TARGET_OS_TV && !TARGET_OS_OSX
|
|
17
|
+
[NSNotificationCenter.defaultCenter addObserver:self
|
|
18
|
+
selector:@selector(invalidateSafeAreaInsets)
|
|
19
|
+
name:UIKeyboardDidShowNotification
|
|
20
|
+
object:nil];
|
|
21
|
+
[NSNotificationCenter.defaultCenter addObserver:self
|
|
22
|
+
selector:@selector(invalidateSafeAreaInsets)
|
|
23
|
+
name:UIKeyboardDidHideNotification
|
|
24
|
+
object:nil];
|
|
25
|
+
[NSNotificationCenter.defaultCenter addObserver:self
|
|
26
|
+
selector:@selector(invalidateSafeAreaInsets)
|
|
27
|
+
name:UIKeyboardDidChangeFrameNotification
|
|
28
|
+
object:nil];
|
|
29
|
+
[NSNotificationCenter.defaultCenter addObserver:self
|
|
30
|
+
selector:@selector(invalidateSafeAreaInsets)
|
|
31
|
+
name:UIWindowDidBecomeVisibleNotification
|
|
32
|
+
object:nil];
|
|
33
|
+
#endif
|
|
34
|
+
}
|
|
35
|
+
return self;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
- (void)safeAreaInsetsDidChange
|
|
39
|
+
{
|
|
40
|
+
[self invalidateSafeAreaInsets];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
- (void)invalidateSafeAreaInsets
|
|
44
|
+
{
|
|
45
|
+
// This gets called before the view size is set by react-native so
|
|
46
|
+
// make sure to wait so we don't set wrong insets to JS.
|
|
47
|
+
if (CGSizeEqualToSize(self.frame.size, CGSizeZero)) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
#if TARGET_OS_IPHONE
|
|
52
|
+
UIEdgeInsets safeAreaInsets = self.safeAreaInsets;
|
|
53
|
+
#elif TARGET_OS_OSX
|
|
54
|
+
NSEdgeInsets safeAreaInsets;
|
|
55
|
+
if (@available(macOS 11.0, *)) {
|
|
56
|
+
safeAreaInsets = self.safeAreaInsets;
|
|
57
|
+
} else {
|
|
58
|
+
safeAreaInsets = NSEdgeInsetsZero;
|
|
59
|
+
}
|
|
60
|
+
#endif
|
|
61
|
+
CGRect frame = [self convertRect:self.bounds toView:RNCParentViewController(self).view];
|
|
62
|
+
|
|
63
|
+
if (_initialInsetsSent &&
|
|
64
|
+
#if TARGET_OS_IPHONE
|
|
65
|
+
UIEdgeInsetsEqualToEdgeInsetsWithThreshold(safeAreaInsets, _currentSafeAreaInsets, 1.0 / RCTScreenScale()) &&
|
|
66
|
+
#elif TARGET_OS_OSX
|
|
67
|
+
NSEdgeInsetsEqualToEdgeInsetsWithThreshold(safeAreaInsets, _currentSafeAreaInsets, 1.0 / RCTScreenScale()) &&
|
|
68
|
+
#endif
|
|
69
|
+
CGRectEqualToRect(frame, _currentFrame)) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
_initialInsetsSent = YES;
|
|
74
|
+
_currentSafeAreaInsets = safeAreaInsets;
|
|
75
|
+
_currentFrame = frame;
|
|
76
|
+
|
|
77
|
+
[NSNotificationCenter.defaultCenter postNotificationName:RNCSafeAreaDidChange object:self userInfo:nil];
|
|
78
|
+
|
|
79
|
+
self.onInsetsChange(@{
|
|
80
|
+
@"insets" : @{
|
|
81
|
+
@"top" : @(safeAreaInsets.top),
|
|
82
|
+
@"right" : @(safeAreaInsets.right),
|
|
83
|
+
@"bottom" : @(safeAreaInsets.bottom),
|
|
84
|
+
@"left" : @(safeAreaInsets.left),
|
|
85
|
+
},
|
|
86
|
+
@"frame" : @{
|
|
87
|
+
@"x" : @(frame.origin.x),
|
|
88
|
+
@"y" : @(frame.origin.y),
|
|
89
|
+
@"width" : @(frame.size.width),
|
|
90
|
+
@"height" : @(frame.size.height),
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
- (void)layoutSubviews
|
|
96
|
+
{
|
|
97
|
+
[super layoutSubviews];
|
|
98
|
+
|
|
99
|
+
[self invalidateSafeAreaInsets];
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
@end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#import "RNCSafeAreaProviderManager.h"
|
|
2
|
+
|
|
3
|
+
#import "RNCSafeAreaProvider.h"
|
|
4
|
+
|
|
5
|
+
@implementation RNCSafeAreaProviderManager
|
|
6
|
+
|
|
7
|
+
RCT_EXPORT_MODULE(RNCSafeAreaProvider)
|
|
8
|
+
|
|
9
|
+
RCT_EXPORT_VIEW_PROPERTY(onInsetsChange, RCTDirectEventBlock)
|
|
10
|
+
|
|
11
|
+
#if TARGET_OS_IPHONE
|
|
12
|
+
- (UIView *)view
|
|
13
|
+
#elif TARGET_OS_OSX
|
|
14
|
+
- (NSView *)view
|
|
15
|
+
#endif
|
|
16
|
+
{
|
|
17
|
+
return [RNCSafeAreaProvider new];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
@end
|
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
#import <React/RCTAssert.h>
|
|
4
4
|
#include <math.h>
|
|
5
5
|
|
|
6
|
+
#import "RNCSafeAreaViewEdgeMode.h"
|
|
7
|
+
#import "RNCSafeAreaViewEdges.h"
|
|
6
8
|
#import "RNCSafeAreaViewLocalData.h"
|
|
7
9
|
#import "RNCSafeAreaViewMode.h"
|
|
8
|
-
#import "RNCSafeAreaViewEdges.h"
|
|
9
10
|
|
|
10
11
|
// From RCTShadowView.m
|
|
11
12
|
typedef NS_ENUM(unsigned int, meta_prop_t) {
|
|
@@ -39,7 +40,11 @@ typedef NS_ENUM(unsigned int, meta_prop_t) {
|
|
|
39
40
|
return self;
|
|
40
41
|
}
|
|
41
42
|
|
|
42
|
-
- (void)extractEdges:(YGValue[])_metaProps
|
|
43
|
+
- (void)extractEdges:(YGValue[])_metaProps
|
|
44
|
+
top:(CGFloat *)top
|
|
45
|
+
right:(CGFloat *)right
|
|
46
|
+
bottom:(CGFloat *)bottom
|
|
47
|
+
left:(CGFloat *)left
|
|
43
48
|
{
|
|
44
49
|
if (_metaProps[META_PROP_ALL].unit == YGUnitPoint) {
|
|
45
50
|
*top = _metaProps[META_PROP_ALL].value;
|
|
@@ -61,7 +66,7 @@ typedef NS_ENUM(unsigned int, meta_prop_t) {
|
|
|
61
66
|
if (_metaProps[META_PROP_TOP].unit == YGUnitPoint) {
|
|
62
67
|
*top = _metaProps[META_PROP_TOP].value;
|
|
63
68
|
}
|
|
64
|
-
|
|
69
|
+
|
|
65
70
|
if (_metaProps[META_PROP_RIGHT].unit == YGUnitPoint) {
|
|
66
71
|
*right = _metaProps[META_PROP_RIGHT].value;
|
|
67
72
|
}
|
|
@@ -75,7 +80,8 @@ typedef NS_ENUM(unsigned int, meta_prop_t) {
|
|
|
75
80
|
}
|
|
76
81
|
}
|
|
77
82
|
|
|
78
|
-
- (void)resetInsetsForMode:(RNCSafeAreaViewMode)mode
|
|
83
|
+
- (void)resetInsetsForMode:(RNCSafeAreaViewMode)mode
|
|
84
|
+
{
|
|
79
85
|
if (mode == RNCSafeAreaViewModePadding) {
|
|
80
86
|
super.paddingTop = _paddingMetaProps[META_PROP_TOP];
|
|
81
87
|
super.paddingRight = _paddingMetaProps[META_PROP_RIGHT];
|
|
@@ -104,23 +110,32 @@ typedef NS_ENUM(unsigned int, meta_prop_t) {
|
|
|
104
110
|
CGFloat bottom = 0;
|
|
105
111
|
CGFloat left = 0;
|
|
106
112
|
|
|
107
|
-
CGFloat insetTop = (edges & RNCSafeAreaViewEdgesTop) ? insets.top : 0;
|
|
108
|
-
CGFloat insetRight = (edges & RNCSafeAreaViewEdgesRight) ? insets.right : 0;
|
|
109
|
-
CGFloat insetBottom = (edges & RNCSafeAreaViewEdgesBottom) ? insets.bottom : 0;
|
|
110
|
-
CGFloat insetLeft = (edges & RNCSafeAreaViewEdgesLeft) ? insets.left : 0;
|
|
111
|
-
|
|
112
113
|
if (mode == RNCSafeAreaViewModePadding) {
|
|
113
114
|
[self extractEdges:_paddingMetaProps top:&top right:&right bottom:&bottom left:&left];
|
|
114
|
-
super.paddingTop = (YGValue){
|
|
115
|
-
super.paddingRight =
|
|
116
|
-
|
|
117
|
-
super.
|
|
115
|
+
super.paddingTop = (YGValue){[self getEdgeValue:edges.top insetValue:insets.top edgeValue:top], YGUnitPoint};
|
|
116
|
+
super.paddingRight =
|
|
117
|
+
(YGValue){[self getEdgeValue:edges.right insetValue:insets.right edgeValue:right], YGUnitPoint};
|
|
118
|
+
super.paddingBottom =
|
|
119
|
+
(YGValue){[self getEdgeValue:edges.bottom insetValue:insets.bottom edgeValue:bottom], YGUnitPoint};
|
|
120
|
+
super.paddingLeft = (YGValue){[self getEdgeValue:edges.left insetValue:insets.left edgeValue:left], YGUnitPoint};
|
|
118
121
|
} else if (mode == RNCSafeAreaViewModeMargin) {
|
|
119
122
|
[self extractEdges:_marginMetaProps top:&top right:&right bottom:&bottom left:&left];
|
|
120
|
-
super.marginTop = (YGValue){
|
|
121
|
-
super.marginRight = (YGValue){
|
|
122
|
-
super.marginBottom =
|
|
123
|
-
|
|
123
|
+
super.marginTop = (YGValue){[self getEdgeValue:edges.top insetValue:insets.top edgeValue:top], YGUnitPoint};
|
|
124
|
+
super.marginRight = (YGValue){[self getEdgeValue:edges.right insetValue:insets.right edgeValue:right], YGUnitPoint};
|
|
125
|
+
super.marginBottom =
|
|
126
|
+
(YGValue){[self getEdgeValue:edges.bottom insetValue:insets.bottom edgeValue:bottom], YGUnitPoint};
|
|
127
|
+
super.marginLeft = (YGValue){[self getEdgeValue:edges.left insetValue:insets.left edgeValue:left], YGUnitPoint};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
- (CGFloat)getEdgeValue:(RNCSafeAreaViewEdgeMode)edgeMode insetValue:(CGFloat)insetValue edgeValue:(CGFloat)edgeValue
|
|
132
|
+
{
|
|
133
|
+
if (edgeMode == RNCSafeAreaViewEdgeModeOff) {
|
|
134
|
+
return edgeValue;
|
|
135
|
+
} else if (edgeMode == RNCSafeAreaViewEdgeModeMaximum) {
|
|
136
|
+
return MAX(insetValue, edgeValue);
|
|
137
|
+
} else {
|
|
138
|
+
return insetValue + edgeValue;
|
|
124
139
|
}
|
|
125
140
|
}
|
|
126
141
|
|
|
@@ -136,38 +151,37 @@ typedef NS_ENUM(unsigned int, meta_prop_t) {
|
|
|
136
151
|
- (void)setLocalData:(RNCSafeAreaViewLocalData *)localData
|
|
137
152
|
{
|
|
138
153
|
RCTAssert(
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
);
|
|
154
|
+
[localData isKindOfClass:[RNCSafeAreaViewLocalData class]],
|
|
155
|
+
@"Local data object for `RCTRNCSafeAreaShadowView` must be `RCTRNCSafeAreaViewLocalData` instance.");
|
|
142
156
|
|
|
143
157
|
if (_localData != nil && _localData.mode != localData.mode) {
|
|
144
158
|
[self resetInsetsForMode:_localData.mode];
|
|
145
159
|
}
|
|
146
|
-
|
|
160
|
+
|
|
147
161
|
_localData = localData;
|
|
148
162
|
_needsUpdate = false;
|
|
149
163
|
[self updateInsets];
|
|
150
|
-
|
|
164
|
+
|
|
151
165
|
if (_localData.mode == RNCSafeAreaViewModePadding) {
|
|
152
|
-
[super didSetProps:@[@"paddingTop", @"paddingRight", @"paddingBottom", @"paddingLeft"]];
|
|
166
|
+
[super didSetProps:@[ @"paddingTop", @"paddingRight", @"paddingBottom", @"paddingLeft" ]];
|
|
153
167
|
} else {
|
|
154
|
-
[super didSetProps:@[@"marginTop", @"marginRight", @"marginBottom", @"marginLeft"]];
|
|
168
|
+
[super didSetProps:@[ @"marginTop", @"marginRight", @"marginBottom", @"marginLeft" ]];
|
|
155
169
|
}
|
|
156
170
|
}
|
|
157
171
|
|
|
158
172
|
#define SHADOW_VIEW_MARGIN_PADDING_PROP(edge, metaProp) \
|
|
159
|
-
-
|
|
160
|
-
{
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
}
|
|
165
|
-
-
|
|
166
|
-
{
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
}
|
|
173
|
+
-(void)setPadding##edge : (YGValue)value \
|
|
174
|
+
{ \
|
|
175
|
+
[super setPadding##edge:value]; \
|
|
176
|
+
_needsUpdate = true; \
|
|
177
|
+
_paddingMetaProps[META_PROP_##metaProp] = value; \
|
|
178
|
+
} \
|
|
179
|
+
-(void)setMargin##edge : (YGValue)value \
|
|
180
|
+
{ \
|
|
181
|
+
[super setMargin##edge:value]; \
|
|
182
|
+
_needsUpdate = true; \
|
|
183
|
+
_marginMetaProps[META_PROP_##metaProp] = value; \
|
|
184
|
+
}
|
|
171
185
|
|
|
172
186
|
SHADOW_VIEW_MARGIN_PADDING_PROP(, ALL);
|
|
173
187
|
SHADOW_VIEW_MARGIN_PADDING_PROP(Vertical, VERTICAL);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#import <React/RCTDefines.h>
|
|
2
|
+
#import <React/RCTView.h>
|
|
3
|
+
#if TARGET_OS_IPHONE
|
|
4
|
+
#import <UIKit/UIKit.h>
|
|
5
|
+
#elif TARGET_OS_OSX
|
|
6
|
+
#import <AppKit/AppKit.h>
|
|
7
|
+
#endif
|
|
8
|
+
|
|
9
|
+
extern NSString *const RNCSafeAreaDidChange;
|
|
10
|
+
|
|
11
|
+
RCT_EXTERN BOOL
|
|
12
|
+
#if TARGET_OS_IPHONE
|
|
13
|
+
UIEdgeInsetsEqualToEdgeInsetsWithThreshold(UIEdgeInsets insets1, UIEdgeInsets insets2, CGFloat threshold);
|
|
14
|
+
#elif TARGET_OS_OSX
|
|
15
|
+
NSEdgeInsetsEqualToEdgeInsetsWithThreshold(NSEdgeInsets insets1, NSEdgeInsets insets2, CGFloat threshold);
|
|
16
|
+
#endif
|
|
17
|
+
|
|
18
|
+
#if TARGET_OS_IPHONE
|
|
19
|
+
RCT_EXTERN UIViewController *RNCParentViewController(UIView *view);
|
|
20
|
+
#elif TARGET_OS_OSX
|
|
21
|
+
RCT_EXTERN NSViewController *RNCParentViewController(NSView *view);
|
|
22
|
+
#endif
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#import "RNCSafeAreaUtils.h"
|
|
2
|
+
|
|
3
|
+
#import <React/RCTUIManager.h>
|
|
4
|
+
|
|
5
|
+
NSString *const RNCSafeAreaDidChange = @"RNCSafeAreaDidChange";
|
|
6
|
+
|
|
7
|
+
#if TARGET_OS_IPHONE
|
|
8
|
+
BOOL UIEdgeInsetsEqualToEdgeInsetsWithThreshold(UIEdgeInsets insets1, UIEdgeInsets insets2, CGFloat threshold)
|
|
9
|
+
#elif TARGET_OS_OSX
|
|
10
|
+
BOOL NSEdgeInsetsEqualToEdgeInsetsWithThreshold(NSEdgeInsets insets1, NSEdgeInsets insets2, CGFloat threshold)
|
|
11
|
+
#endif
|
|
12
|
+
{
|
|
13
|
+
return ABS(insets1.left - insets2.left) <= threshold && ABS(insets1.right - insets2.right) <= threshold &&
|
|
14
|
+
ABS(insets1.top - insets2.top) <= threshold && ABS(insets1.bottom - insets2.bottom) <= threshold;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
#if TARGET_OS_IPHONE
|
|
18
|
+
UIViewController *RNCParentViewController(UIView *view)
|
|
19
|
+
{
|
|
20
|
+
UIResponder *responder = view.nextResponder;
|
|
21
|
+
while (responder != nil) {
|
|
22
|
+
if ([responder isKindOfClass:[UIViewController class]]) {
|
|
23
|
+
return (UIViewController *)responder;
|
|
24
|
+
}
|
|
25
|
+
responder = responder.nextResponder;
|
|
26
|
+
}
|
|
27
|
+
return nil;
|
|
28
|
+
}
|
|
29
|
+
#elif TARGET_OS_OSX
|
|
30
|
+
NSViewController *RNCParentViewController(NSView *view)
|
|
31
|
+
{
|
|
32
|
+
NSResponder *responder = view.nextResponder;
|
|
33
|
+
while (responder != nil) {
|
|
34
|
+
if ([responder isKindOfClass:[NSViewController class]]) {
|
|
35
|
+
return (NSViewController *)responder;
|
|
36
|
+
}
|
|
37
|
+
responder = responder.nextResponder;
|
|
38
|
+
}
|
|
39
|
+
return nil;
|
|
40
|
+
}
|
|
41
|
+
#endif
|
|
@@ -1,15 +1,19 @@
|
|
|
1
|
-
#import <UIKit/UIKit.h>
|
|
2
|
-
#import <React/RCTView.h>
|
|
3
1
|
#import <React/RCTBridge.h>
|
|
2
|
+
#import <React/RCTView.h>
|
|
3
|
+
#if TARGET_OS_IPHONE
|
|
4
|
+
#import <UIKit/UIKit.h>
|
|
5
|
+
#elif TARGET_OS_OSX
|
|
6
|
+
#import <AppKit/AppKit.h>
|
|
7
|
+
#endif
|
|
4
8
|
|
|
5
|
-
#import "RNCSafeAreaViewMode.h"
|
|
6
9
|
#import "RNCSafeAreaViewEdges.h"
|
|
10
|
+
#import "RNCSafeAreaViewMode.h"
|
|
7
11
|
|
|
8
12
|
NS_ASSUME_NONNULL_BEGIN
|
|
9
13
|
|
|
10
14
|
@class RNCSafeAreaView;
|
|
11
15
|
|
|
12
|
-
@interface RNCSafeAreaView: RCTView
|
|
16
|
+
@interface RNCSafeAreaView : RCTView
|
|
13
17
|
|
|
14
18
|
- (instancetype)initWithBridge:(RCTBridge *)bridge;
|
|
15
19
|
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
#import "RNCSafeAreaView.h"
|
|
2
|
+
|
|
3
|
+
#import <React/RCTBridge.h>
|
|
4
|
+
#import <React/RCTUIManager.h>
|
|
5
|
+
|
|
6
|
+
#import "RNCSafeAreaProvider.h"
|
|
7
|
+
#import "RNCSafeAreaUtils.h"
|
|
8
|
+
#import "RNCSafeAreaViewEdges.h"
|
|
9
|
+
#import "RNCSafeAreaViewLocalData.h"
|
|
10
|
+
#import "RNCSafeAreaViewMode.h"
|
|
11
|
+
|
|
12
|
+
@implementation RNCSafeAreaView {
|
|
13
|
+
__weak RCTBridge *_bridge;
|
|
14
|
+
#if TARGET_OS_IPHONE
|
|
15
|
+
UIEdgeInsets _currentSafeAreaInsets;
|
|
16
|
+
#elif TARGET_OS_OSX
|
|
17
|
+
NSEdgeInsets _currentSafeAreaInsets;
|
|
18
|
+
#endif
|
|
19
|
+
RNCSafeAreaViewMode _mode;
|
|
20
|
+
RNCSafeAreaViewEdges _edges;
|
|
21
|
+
__weak RNCSafeAreaProvider *_Nullable _providerView;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
- (instancetype)initWithBridge:(RCTBridge *)bridge
|
|
25
|
+
{
|
|
26
|
+
if (self = [super initWithFrame:CGRectZero]) {
|
|
27
|
+
_bridge = bridge;
|
|
28
|
+
// Defaults
|
|
29
|
+
_mode = RNCSafeAreaViewModePadding;
|
|
30
|
+
_edges = RNCSafeAreaViewEdgesMake(
|
|
31
|
+
RNCSafeAreaViewEdgeModeOff, RNCSafeAreaViewEdgeModeOff, RNCSafeAreaViewEdgeModeOff, RNCSafeAreaViewEdgeModeOff);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return self;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
RCT_NOT_IMPLEMENTED(-(instancetype)initWithCoder : (NSCoder *)decoder)
|
|
38
|
+
RCT_NOT_IMPLEMENTED(-(instancetype)initWithFrame : (CGRect)frame)
|
|
39
|
+
|
|
40
|
+
- (NSString *)description
|
|
41
|
+
{
|
|
42
|
+
NSString *superDescription = [super description];
|
|
43
|
+
|
|
44
|
+
// Cutting the last `>` character.
|
|
45
|
+
if (superDescription.length > 0 && [superDescription characterAtIndex:superDescription.length - 1] == '>') {
|
|
46
|
+
superDescription = [superDescription substringToIndex:superDescription.length - 1];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
#if TARGET_OS_IPHONE
|
|
50
|
+
NSString *providerViewSafeAreaInsetsString = NSStringFromUIEdgeInsets(_providerView.safeAreaInsets);
|
|
51
|
+
NSString *currentSafeAreaInsetsString = NSStringFromUIEdgeInsets(_currentSafeAreaInsets);
|
|
52
|
+
#elif TARGET_OS_OSX
|
|
53
|
+
NSString *providerViewSafeAreaInsetsString;
|
|
54
|
+
NSString *currentSafeAreaInsetsString;
|
|
55
|
+
if (@available(macOS 11.0, *)) {
|
|
56
|
+
providerViewSafeAreaInsetsString = [NSString stringWithFormat:@"{%f,%f,%f,%f}",
|
|
57
|
+
_providerView.safeAreaInsets.top,
|
|
58
|
+
_providerView.safeAreaInsets.left,
|
|
59
|
+
_providerView.safeAreaInsets.bottom,
|
|
60
|
+
_providerView.safeAreaInsets.right];
|
|
61
|
+
currentSafeAreaInsetsString = [NSString stringWithFormat:@"{%f,%f,%f,%f}",
|
|
62
|
+
_currentSafeAreaInsets.top,
|
|
63
|
+
_currentSafeAreaInsets.left,
|
|
64
|
+
_currentSafeAreaInsets.bottom,
|
|
65
|
+
_currentSafeAreaInsets.right];
|
|
66
|
+
} else {
|
|
67
|
+
providerViewSafeAreaInsetsString = @"{0.0,0.0,0.0,0.0}";
|
|
68
|
+
currentSafeAreaInsetsString = @"{0.0,0.0,0.0,0.0}";
|
|
69
|
+
}
|
|
70
|
+
#endif
|
|
71
|
+
|
|
72
|
+
return [NSString stringWithFormat:@"%@; RNCSafeAreaInsets = %@; appliedRNCSafeAreaInsets = %@>",
|
|
73
|
+
superDescription,
|
|
74
|
+
providerViewSafeAreaInsetsString,
|
|
75
|
+
currentSafeAreaInsetsString];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
- (void)didMoveToWindow
|
|
79
|
+
{
|
|
80
|
+
#if TARGET_OS_IPHONE
|
|
81
|
+
UIView *previousProviderView = _providerView;
|
|
82
|
+
#elif TARGET_OS_OSX
|
|
83
|
+
NSView *previousProviderView = _providerView;
|
|
84
|
+
#endif
|
|
85
|
+
_providerView = [self findNearestProvider];
|
|
86
|
+
|
|
87
|
+
[self invalidateSafeAreaInsets];
|
|
88
|
+
|
|
89
|
+
if (previousProviderView != _providerView) {
|
|
90
|
+
if (previousProviderView != nil) {
|
|
91
|
+
[NSNotificationCenter.defaultCenter removeObserver:self name:RNCSafeAreaDidChange object:previousProviderView];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (_providerView != nil) {
|
|
95
|
+
[NSNotificationCenter.defaultCenter addObserver:self
|
|
96
|
+
selector:@selector(safeAreaProviderInsetsDidChange:)
|
|
97
|
+
name:RNCSafeAreaDidChange
|
|
98
|
+
object:_providerView];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
- (void)safeAreaProviderInsetsDidChange:(NSNotification *)notification
|
|
104
|
+
{
|
|
105
|
+
[self invalidateSafeAreaInsets];
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
- (void)invalidateSafeAreaInsets
|
|
109
|
+
{
|
|
110
|
+
if (_providerView == nil) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
#if TARGET_OS_IPHONE
|
|
114
|
+
UIEdgeInsets safeAreaInsets = _providerView.safeAreaInsets;
|
|
115
|
+
if (UIEdgeInsetsEqualToEdgeInsetsWithThreshold(safeAreaInsets, _currentSafeAreaInsets, 1.0 / RCTScreenScale())) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
#elif TARGET_OS_OSX
|
|
119
|
+
NSEdgeInsets safeAreaInsets = _providerView.safeAreaInsets;
|
|
120
|
+
if (NSEdgeInsetsEqualToEdgeInsetsWithThreshold(safeAreaInsets, _currentSafeAreaInsets, 1.0 / RCTScreenScale())) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
#endif
|
|
124
|
+
|
|
125
|
+
_currentSafeAreaInsets = safeAreaInsets;
|
|
126
|
+
[self updateLocalData];
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
- (nullable RNCSafeAreaProvider *)findNearestProvider
|
|
130
|
+
{
|
|
131
|
+
#if TARGET_OS_IPHONE
|
|
132
|
+
UIView *current = self.reactSuperview;
|
|
133
|
+
#elif TARGET_OS_OSX
|
|
134
|
+
NSView *current = self.reactSuperview;
|
|
135
|
+
#endif
|
|
136
|
+
while (current != nil) {
|
|
137
|
+
if ([current isKindOfClass:RNCSafeAreaProvider.class]) {
|
|
138
|
+
return (RNCSafeAreaProvider *)current;
|
|
139
|
+
}
|
|
140
|
+
current = current.reactSuperview;
|
|
141
|
+
}
|
|
142
|
+
return nil;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
- (void)updateLocalData
|
|
146
|
+
{
|
|
147
|
+
if (_providerView == nil) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
RNCSafeAreaViewLocalData *localData = [[RNCSafeAreaViewLocalData alloc] initWithInsets:_currentSafeAreaInsets
|
|
151
|
+
mode:_mode
|
|
152
|
+
edges:_edges];
|
|
153
|
+
[_bridge.uiManager setLocalData:localData forView:self];
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
- (void)setMode:(RNCSafeAreaViewMode)mode
|
|
157
|
+
{
|
|
158
|
+
_mode = mode;
|
|
159
|
+
[self updateLocalData];
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
- (void)setEdges:(RNCSafeAreaViewEdges)edges
|
|
163
|
+
{
|
|
164
|
+
_edges = edges;
|
|
165
|
+
[self updateLocalData];
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
@end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#import <Foundation/Foundation.h>
|
|
2
|
+
#import <React/RCTConvert.h>
|
|
3
|
+
|
|
4
|
+
typedef NS_ENUM(NSInteger, RNCSafeAreaViewEdgeMode) {
|
|
5
|
+
RNCSafeAreaViewEdgeModeOff,
|
|
6
|
+
RNCSafeAreaViewEdgeModeAdditive,
|
|
7
|
+
RNCSafeAreaViewEdgeModeMaximum
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
@interface RCTConvert (RNCSafeAreaViewEdgeMode)
|
|
11
|
+
+ (RNCSafeAreaViewEdgeMode)RNCSafeAreaViewEdgeMode:(nullable id)json;
|
|
12
|
+
@end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#import "RNCSafeAreaViewEdgeMode.h"
|
|
2
|
+
#import <React/RCTConvert.h>
|
|
3
|
+
|
|
4
|
+
@implementation RCTConvert (RNCSafeAreaViewEdgeMode)
|
|
5
|
+
|
|
6
|
+
RCT_ENUM_CONVERTER(
|
|
7
|
+
RNCSafeAreaViewEdgeMode,
|
|
8
|
+
(@{
|
|
9
|
+
@"off" : @(RNCSafeAreaViewEdgeModeOff),
|
|
10
|
+
@"additive" : @(RNCSafeAreaViewEdgeModeAdditive),
|
|
11
|
+
@"maximum" : @(RNCSafeAreaViewEdgeModeMaximum),
|
|
12
|
+
}),
|
|
13
|
+
RNCSafeAreaViewEdgeModeOff,
|
|
14
|
+
integerValue);
|
|
15
|
+
|
|
16
|
+
@end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#import <Foundation/Foundation.h>
|
|
2
|
+
#import "RNCSafeAreaViewEdgeMode.h"
|
|
3
|
+
|
|
4
|
+
typedef struct RNCSafeAreaViewEdges {
|
|
5
|
+
RNCSafeAreaViewEdgeMode top;
|
|
6
|
+
RNCSafeAreaViewEdgeMode right;
|
|
7
|
+
RNCSafeAreaViewEdgeMode bottom;
|
|
8
|
+
RNCSafeAreaViewEdgeMode left;
|
|
9
|
+
} RNCSafeAreaViewEdges;
|
|
10
|
+
|
|
11
|
+
RNCSafeAreaViewEdges RNCSafeAreaViewEdgesMake(
|
|
12
|
+
RNCSafeAreaViewEdgeMode top,
|
|
13
|
+
RNCSafeAreaViewEdgeMode right,
|
|
14
|
+
RNCSafeAreaViewEdgeMode bottom,
|
|
15
|
+
RNCSafeAreaViewEdgeMode left);
|