@amazon-devices/react-native-safe-area-context 2.0.1758683737 → 8.0.9000000000

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.
Files changed (258) hide show
  1. package/README.md +6 -302
  2. package/SystemBundles/3e1c492419a85957481898df760cf9cf3bd38d3e26ef2e78822fb256fdee0153.bundle +7373 -0
  3. package/SystemBundles/3e1c492419a85957481898df760cf9cf3bd38d3e26ef2e78822fb256fdee0153.map +2780 -0
  4. package/SystemModules/amzn__react-native-safe-area-context-8.modules.txt +7 -0
  5. package/SystemModules/amzn__react-native-safe-area-context-8.private.modules.txt +61 -0
  6. package/SystemModules/keplerscript-system-bundle-config.json +3 -3
  7. package/android/build.gradle +103 -25
  8. package/android/gradle.properties +1 -0
  9. package/android/spotless.gradle +24 -0
  10. package/android/src/fabric/java/com/th3rdwave/safeareacontext/InsetsChangeEvent.kt +25 -0
  11. package/android/src/fabric/java/com/th3rdwave/safeareacontext/UIManagerHelperCompat.kt +14 -0
  12. package/android/src/main/AndroidManifest.xml +1 -2
  13. package/android/src/main/java/com/th3rdwave/safeareacontext/EdgeInsets.kt +3 -0
  14. package/android/src/main/java/com/th3rdwave/safeareacontext/Rect.kt +3 -0
  15. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaContextModule.kt +32 -0
  16. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaContextPackage.kt +41 -0
  17. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaProvider.kt +47 -0
  18. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaProviderManager.kt +41 -0
  19. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaUtils.kt +102 -0
  20. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaView.kt +155 -0
  21. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewEdges.kt +16 -0
  22. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewLocalData.kt +7 -0
  23. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewManager.kt +73 -0
  24. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewMode.kt +6 -0
  25. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewShadowNode.kt +170 -0
  26. package/android/src/main/java/com/th3rdwave/safeareacontext/SerializationUtils.kt +39 -0
  27. package/android/src/main/jni/CMakeLists.txt +87 -0
  28. package/android/src/main/jni/safeareacontext.h +17 -0
  29. package/android/src/paper/java/com/facebook/react/viewmanagers/RNCSafeAreaProviderManagerDelegate.java +31 -0
  30. package/android/src/paper/java/com/facebook/react/viewmanagers/RNCSafeAreaProviderManagerInterface.java +16 -0
  31. package/android/src/paper/java/com/facebook/react/viewmanagers/RNCSafeAreaViewManagerDelegate.java +41 -0
  32. package/android/src/paper/java/com/facebook/react/viewmanagers/RNCSafeAreaViewManagerInterface.java +20 -0
  33. package/android/src/paper/java/com/th3rdwave/safeareacontext/InsetsChangeEvent.kt +29 -0
  34. package/android/src/paper/java/com/th3rdwave/safeareacontext/NativeSafeAreaContextSpec.java +56 -0
  35. package/android/src/paper/java/com/th3rdwave/safeareacontext/UIManagerHelperCompat.kt +20 -0
  36. package/common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewComponentDescriptor.h +25 -0
  37. package/common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewShadowNode.cpp +131 -0
  38. package/common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewShadowNode.h +36 -0
  39. package/common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewState.cpp +23 -0
  40. package/common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewState.h +56 -0
  41. package/ios/Fabric/RNCSafeAreaProviderComponentView.h +13 -0
  42. package/ios/Fabric/RNCSafeAreaProviderComponentView.mm +129 -0
  43. package/ios/Fabric/RNCSafeAreaViewComponentView.h +11 -0
  44. package/ios/Fabric/RNCSafeAreaViewComponentView.mm +153 -0
  45. package/ios/RNCSafeAreaContext.h +9 -0
  46. package/ios/RNCSafeAreaContext.mm +85 -0
  47. package/ios/{SafeAreaView/RNCSafeAreaProvider.h → RNCSafeAreaProvider.h} +4 -0
  48. package/ios/RNCSafeAreaProvider.m +102 -0
  49. package/ios/RNCSafeAreaProviderManager.m +20 -0
  50. package/ios/{SafeAreaView/RNCSafeAreaShadowView.m → RNCSafeAreaShadowView.m} +50 -36
  51. package/ios/RNCSafeAreaUtils.h +22 -0
  52. package/ios/RNCSafeAreaUtils.m +41 -0
  53. package/ios/{SafeAreaView/RNCSafeAreaView.h → RNCSafeAreaView.h} +8 -4
  54. package/ios/RNCSafeAreaView.m +168 -0
  55. package/ios/RNCSafeAreaViewEdgeMode.h +12 -0
  56. package/ios/RNCSafeAreaViewEdgeMode.m +16 -0
  57. package/ios/RNCSafeAreaViewEdges.h +15 -0
  58. package/ios/RNCSafeAreaViewEdges.m +36 -0
  59. package/ios/{SafeAreaView/RNCSafeAreaViewLocalData.h → RNCSafeAreaViewLocalData.h} +12 -1
  60. package/ios/{SafeAreaView/RNCSafeAreaViewLocalData.m → RNCSafeAreaViewLocalData.m} +4 -0
  61. package/ios/{SafeAreaView/RNCSafeAreaViewManager.m → RNCSafeAreaViewManager.m} +5 -1
  62. package/ios/RNCSafeAreaViewMode.m +15 -0
  63. package/ios/{SafeAreaView.xcodeproj → RNSafeAreaContext.xcodeproj}/project.pbxproj +70 -56
  64. package/jest/mock.tsx +59 -0
  65. package/kepler-compatibility.json +2 -4
  66. package/lib/commonjs/CompatNativeSafeAreaProvider.js +7 -8
  67. package/lib/commonjs/CompatNativeSafeAreaProvider.js.map +1 -1
  68. package/lib/commonjs/InitialWindow.js.map +1 -1
  69. package/lib/commonjs/InitialWindow.kepler.js +1 -1
  70. package/lib/commonjs/InitialWindow.kepler.js.map +1 -1
  71. package/lib/commonjs/InitialWindow.native.js +4 -4
  72. package/lib/commonjs/InitialWindow.native.js.map +1 -1
  73. package/lib/commonjs/NativeSafeAreaProvider.js +7 -125
  74. package/lib/commonjs/NativeSafeAreaProvider.js.map +1 -1
  75. package/lib/commonjs/NativeSafeAreaProvider.kepler.js +6 -2
  76. package/lib/commonjs/NativeSafeAreaProvider.kepler.js.map +1 -1
  77. package/lib/commonjs/NativeSafeAreaProvider.web.js +135 -0
  78. package/lib/commonjs/NativeSafeAreaProvider.web.js.map +1 -0
  79. package/lib/commonjs/NativeSafeAreaProvider.windows.js +6 -2
  80. package/lib/commonjs/NativeSafeAreaProvider.windows.js.map +1 -1
  81. package/lib/commonjs/SafeArea.types.js.map +1 -1
  82. package/lib/commonjs/SafeAreaContext.js +56 -36
  83. package/lib/commonjs/SafeAreaContext.js.map +1 -1
  84. package/lib/commonjs/SafeAreaView.js +40 -73
  85. package/lib/commonjs/SafeAreaView.js.map +1 -1
  86. package/lib/commonjs/SafeAreaView.kepler.js.map +1 -1
  87. package/lib/commonjs/SafeAreaView.web.js +91 -0
  88. package/lib/commonjs/SafeAreaView.web.js.map +1 -0
  89. package/lib/commonjs/SafeAreaView.windows.js.map +1 -1
  90. package/lib/commonjs/index.js +1 -0
  91. package/lib/commonjs/index.js.map +1 -1
  92. package/lib/commonjs/package.json +1 -0
  93. package/lib/commonjs/specs/NativeSafeAreaContext.js +9 -0
  94. package/lib/commonjs/specs/NativeSafeAreaContext.js.map +1 -0
  95. package/lib/commonjs/specs/NativeSafeAreaProvider.js +10 -0
  96. package/lib/commonjs/specs/NativeSafeAreaProvider.js.map +1 -0
  97. package/lib/commonjs/specs/NativeSafeAreaView.js +12 -0
  98. package/lib/commonjs/specs/NativeSafeAreaView.js.map +1 -0
  99. package/lib/module/CompatNativeSafeAreaProvider.js +8 -5
  100. package/lib/module/CompatNativeSafeAreaProvider.js.map +1 -1
  101. package/lib/module/InitialWindow.js +2 -0
  102. package/lib/module/InitialWindow.js.map +1 -1
  103. package/lib/module/InitialWindow.kepler.js +3 -1
  104. package/lib/module/InitialWindow.kepler.js.map +1 -1
  105. package/lib/module/InitialWindow.native.js +5 -4
  106. package/lib/module/InitialWindow.native.js.map +1 -1
  107. package/lib/module/NativeSafeAreaProvider.js +3 -122
  108. package/lib/module/NativeSafeAreaProvider.js.map +1 -1
  109. package/lib/module/NativeSafeAreaProvider.kepler.js +3 -2
  110. package/lib/module/NativeSafeAreaProvider.kepler.js.map +1 -1
  111. package/lib/module/NativeSafeAreaProvider.web.js +130 -0
  112. package/lib/module/NativeSafeAreaProvider.web.js.map +1 -0
  113. package/lib/module/NativeSafeAreaProvider.windows.js +3 -2
  114. package/lib/module/NativeSafeAreaProvider.windows.js.map +1 -1
  115. package/lib/module/SafeArea.types.js +2 -0
  116. package/lib/module/SafeArea.types.js.map +1 -1
  117. package/lib/module/SafeAreaContext.js +57 -33
  118. package/lib/module/SafeAreaContext.js.map +1 -1
  119. package/lib/module/SafeAreaView.js +38 -69
  120. package/lib/module/SafeAreaView.js.map +1 -1
  121. package/lib/module/SafeAreaView.kepler.js +2 -0
  122. package/lib/module/SafeAreaView.kepler.js.map +1 -1
  123. package/lib/module/SafeAreaView.web.js +86 -0
  124. package/lib/module/SafeAreaView.web.js.map +1 -0
  125. package/lib/module/SafeAreaView.windows.js +2 -0
  126. package/lib/module/SafeAreaView.windows.js.map +1 -1
  127. package/lib/module/index.js +3 -0
  128. package/lib/module/index.js.map +1 -1
  129. package/lib/module/specs/NativeSafeAreaContext.js +5 -0
  130. package/lib/module/specs/NativeSafeAreaContext.js.map +1 -0
  131. package/lib/module/specs/NativeSafeAreaProvider.js +5 -0
  132. package/lib/module/specs/NativeSafeAreaProvider.js.map +1 -0
  133. package/lib/module/specs/NativeSafeAreaView.js +7 -0
  134. package/lib/module/specs/NativeSafeAreaView.js.map +1 -0
  135. package/lib/typescript/CompatNativeSafeAreaProvider.d.ts +4 -0
  136. package/lib/typescript/CompatNativeSafeAreaProvider.d.ts.map +1 -0
  137. package/lib/typescript/{src/InitialWindow.d.ts → InitialWindow.d.ts} +2 -1
  138. package/lib/typescript/InitialWindow.d.ts.map +1 -0
  139. package/lib/typescript/{src/InitialWindow.kepler.d.ts → InitialWindow.kepler.d.ts} +1 -0
  140. package/lib/typescript/InitialWindow.kepler.d.ts.map +1 -0
  141. package/lib/typescript/{src/InitialWindow.native.d.ts → InitialWindow.native.d.ts} +2 -1
  142. package/lib/typescript/InitialWindow.native.d.ts.map +1 -0
  143. package/lib/typescript/NativeSafeAreaProvider.d.ts +3 -0
  144. package/lib/typescript/NativeSafeAreaProvider.d.ts.map +1 -0
  145. package/lib/typescript/NativeSafeAreaProvider.kepler.d.ts +2 -0
  146. package/lib/typescript/NativeSafeAreaProvider.kepler.d.ts.map +1 -0
  147. package/lib/typescript/NativeSafeAreaProvider.web.d.ts +4 -0
  148. package/lib/typescript/NativeSafeAreaProvider.web.d.ts.map +1 -0
  149. package/lib/typescript/NativeSafeAreaProvider.windows.d.ts +2 -0
  150. package/lib/typescript/NativeSafeAreaProvider.windows.d.ts.map +1 -0
  151. package/lib/typescript/SafeArea.types.d.ts +36 -0
  152. package/lib/typescript/SafeArea.types.d.ts.map +1 -0
  153. package/lib/typescript/{src/SafeAreaContext.d.ts → SafeAreaContext.d.ts} +9 -6
  154. package/lib/typescript/SafeAreaContext.d.ts.map +1 -0
  155. package/lib/typescript/SafeAreaView.d.ts +5 -0
  156. package/lib/typescript/SafeAreaView.d.ts.map +1 -0
  157. package/lib/typescript/{src/SafeAreaView.kepler.d.ts → SafeAreaView.kepler.d.ts} +1 -0
  158. package/lib/typescript/SafeAreaView.kepler.d.ts.map +1 -0
  159. package/lib/typescript/SafeAreaView.web.d.ts +4 -0
  160. package/lib/typescript/SafeAreaView.web.d.ts.map +1 -0
  161. package/lib/typescript/SafeAreaView.windows.d.ts +3 -0
  162. package/lib/typescript/SafeAreaView.windows.d.ts.map +1 -0
  163. package/lib/typescript/{src/index.d.ts → index.d.ts} +1 -0
  164. package/lib/typescript/index.d.ts.map +1 -0
  165. package/lib/typescript/specs/NativeSafeAreaContext.d.ts +23 -0
  166. package/lib/typescript/specs/NativeSafeAreaContext.d.ts.map +1 -0
  167. package/lib/typescript/specs/NativeSafeAreaProvider.d.ts +22 -0
  168. package/lib/typescript/specs/NativeSafeAreaProvider.d.ts.map +1 -0
  169. package/lib/typescript/specs/NativeSafeAreaView.d.ts +14 -0
  170. package/lib/typescript/specs/NativeSafeAreaView.d.ts.map +1 -0
  171. package/package.json +1 -1
  172. package/react-native-safe-area-context.podspec +26 -4
  173. package/react-native.config.js +8 -0
  174. package/src/CompatNativeSafeAreaProvider.tsx +2 -3
  175. package/src/InitialWindow.kepler.ts +1 -1
  176. package/src/InitialWindow.native.ts +5 -11
  177. package/src/InitialWindow.ts +1 -1
  178. package/src/NativeSafeAreaProvider.kepler.tsx +1 -3
  179. package/src/NativeSafeAreaProvider.tsx +2 -128
  180. package/src/NativeSafeAreaProvider.web.tsx +127 -0
  181. package/src/NativeSafeAreaProvider.windows.tsx +1 -3
  182. package/src/SafeArea.types.ts +15 -11
  183. package/src/SafeAreaContext.tsx +66 -43
  184. package/src/SafeAreaView.tsx +47 -82
  185. package/src/SafeAreaView.web.tsx +123 -0
  186. package/src/SafeAreaView.windows.tsx +2 -1
  187. package/src/index.tsx +2 -0
  188. package/src/specs/NativeSafeAreaContext.ts +23 -0
  189. package/src/specs/NativeSafeAreaProvider.ts +29 -0
  190. package/src/specs/NativeSafeAreaView.ts +17 -0
  191. package/SystemBundles/e3c0cdeab56b8b622d4f0fd5a80812eafe199fa2287d0e3a09c5e573a1035350.bundle +0 -11031
  192. package/SystemBundles/e3c0cdeab56b8b622d4f0fd5a80812eafe199fa2287d0e3a09c5e573a1035350.map +0 -1
  193. package/SystemModules/amzn__react-native-safe-area-context-2.modules.txt +0 -55
  194. package/SystemModules/amzn__react-native-safe-area-context-2.private.modules.txt +0 -91
  195. package/THIRD_PARTY_NOTICES.txt +0 -24
  196. package/android/src/main/java/com/th3rdwave/safeareacontext/EdgeInsets.java +0 -22
  197. package/android/src/main/java/com/th3rdwave/safeareacontext/InsetsChangeEvent.java +0 -33
  198. package/android/src/main/java/com/th3rdwave/safeareacontext/Rect.java +0 -22
  199. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaContextPackage.java +0 -31
  200. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaProvider.java +0 -66
  201. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaProviderManager.java +0 -94
  202. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaUtils.java +0 -82
  203. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaView.java +0 -159
  204. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewEdges.java +0 -8
  205. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewLocalData.java +0 -27
  206. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewManager.java +0 -72
  207. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewMode.java +0 -6
  208. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewShadowNode.java +0 -201
  209. package/android/src/main/java/com/th3rdwave/safeareacontext/SerializationUtils.java +0 -52
  210. package/ios/SafeAreaView/RCTView+SafeAreaCompat.h +0 -16
  211. package/ios/SafeAreaView/RCTView+SafeAreaCompat.m +0 -57
  212. package/ios/SafeAreaView/RNCSafeAreaProvider.m +0 -65
  213. package/ios/SafeAreaView/RNCSafeAreaProviderManager.m +0 -61
  214. package/ios/SafeAreaView/RNCSafeAreaView.m +0 -118
  215. package/ios/SafeAreaView/RNCSafeAreaViewEdges.h +0 -9
  216. package/ios/SafeAreaView/RNCSafeAreaViewEdges.m +0 -13
  217. package/ios/SafeAreaView/RNCSafeAreaViewMode.m +0 -11
  218. package/lib/commonjs/NativeSafeAreaProvider.macos.js +0 -9
  219. package/lib/commonjs/NativeSafeAreaProvider.macos.js.map +0 -1
  220. package/lib/commonjs/NativeSafeAreaProvider.native.js +0 -9
  221. package/lib/commonjs/NativeSafeAreaProvider.native.js.map +0 -1
  222. package/lib/commonjs/SafeAreaView.macos.js +0 -9
  223. package/lib/commonjs/SafeAreaView.macos.js.map +0 -1
  224. package/lib/commonjs/SafeAreaView.native.js +0 -9
  225. package/lib/commonjs/SafeAreaView.native.js.map +0 -1
  226. package/lib/commonjs/useWindowDimensions.js +0 -32
  227. package/lib/commonjs/useWindowDimensions.js.map +0 -1
  228. package/lib/module/NativeSafeAreaProvider.macos.js +0 -3
  229. package/lib/module/NativeSafeAreaProvider.macos.js.map +0 -1
  230. package/lib/module/NativeSafeAreaProvider.native.js +0 -3
  231. package/lib/module/NativeSafeAreaProvider.native.js.map +0 -1
  232. package/lib/module/SafeAreaView.macos.js +0 -3
  233. package/lib/module/SafeAreaView.macos.js.map +0 -1
  234. package/lib/module/SafeAreaView.native.js +0 -3
  235. package/lib/module/SafeAreaView.native.js.map +0 -1
  236. package/lib/module/useWindowDimensions.js +0 -26
  237. package/lib/module/useWindowDimensions.js.map +0 -1
  238. package/lib/typescript/src/CompatNativeSafeAreaProvider.d.ts +0 -2
  239. package/lib/typescript/src/NativeSafeAreaProvider.d.ts +0 -2
  240. package/lib/typescript/src/NativeSafeAreaProvider.kepler.d.ts +0 -2
  241. package/lib/typescript/src/NativeSafeAreaProvider.macos.d.ts +0 -2
  242. package/lib/typescript/src/NativeSafeAreaProvider.native.d.ts +0 -3
  243. package/lib/typescript/src/NativeSafeAreaProvider.windows.d.ts +0 -2
  244. package/lib/typescript/src/SafeArea.types.d.ts +0 -31
  245. package/lib/typescript/src/SafeAreaView.d.ts +0 -2
  246. package/lib/typescript/src/SafeAreaView.macos.d.ts +0 -2
  247. package/lib/typescript/src/SafeAreaView.native.d.ts +0 -2
  248. package/lib/typescript/src/SafeAreaView.windows.d.ts +0 -2
  249. package/lib/typescript/src/useWindowDimensions.d.ts +0 -8
  250. package/src/NativeSafeAreaProvider.macos.tsx +0 -3
  251. package/src/NativeSafeAreaProvider.native.tsx +0 -6
  252. package/src/SafeAreaView.macos.tsx +0 -3
  253. package/src/SafeAreaView.native.tsx +0 -6
  254. package/src/useWindowDimensions.tsx +0 -35
  255. /package/ios/{SafeAreaView/RNCSafeAreaProviderManager.h → RNCSafeAreaProviderManager.h} +0 -0
  256. /package/ios/{SafeAreaView/RNCSafeAreaShadowView.h → RNCSafeAreaShadowView.h} +0 -0
  257. /package/ios/{SafeAreaView/RNCSafeAreaViewManager.h → RNCSafeAreaViewManager.h} +0 -0
  258. /package/ios/{SafeAreaView/RNCSafeAreaViewMode.h → RNCSafeAreaViewMode.h} +0 -0
@@ -0,0 +1,9 @@
1
+ #import <React/RCTBridgeModule.h>
2
+
3
+ NS_ASSUME_NONNULL_BEGIN
4
+
5
+ @interface RNCSafeAreaContext : NSObject <RCTBridgeModule>
6
+
7
+ @end
8
+
9
+ NS_ASSUME_NONNULL_END
@@ -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
@@ -1,4 +1,8 @@
1
+ #if TARGET_OS_IPHONE
1
2
  #import <UIKit/UIKit.h>
3
+ #elif TARGET_OS_OSX
4
+ #import <AppKit/AppKit.h>
5
+ #endif
2
6
 
3
7
  #import <React/RCTView.h>
4
8
 
@@ -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 top:(CGFloat *)top right:(CGFloat *)right bottom:(CGFloat *)bottom left:(CGFloat *)left
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){insetTop + top, YGUnitPoint};
115
- super.paddingRight = (YGValue){insetRight + right, YGUnitPoint};
116
- super.paddingBottom = (YGValue){insetBottom + bottom, YGUnitPoint};
117
- super.paddingLeft = (YGValue){insetLeft + left, YGUnitPoint};
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){insetTop + top, YGUnitPoint};
121
- super.marginRight = (YGValue){insetRight + right, YGUnitPoint};
122
- super.marginBottom = (YGValue){insetBottom + bottom, YGUnitPoint};
123
- super.marginLeft = (YGValue){insetLeft + left, YGUnitPoint};
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
- [localData isKindOfClass:[RNCSafeAreaViewLocalData class]],
140
- @"Local data object for `RCTRNCSafeAreaShadowView` must be `RCTRNCSafeAreaViewLocalData` instance."
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
- - (void)setPadding##edge:(YGValue)value \
160
- { \
161
- [super setPadding##edge:value]; \
162
- _needsUpdate = true; \
163
- _paddingMetaProps[META_PROP_##metaProp] = value; \
164
- } \
165
- - (void)setMargin##edge:(YGValue)value \
166
- { \
167
- [super setMargin##edge:value]; \
168
- _needsUpdate = true; \
169
- _marginMetaProps[META_PROP_##metaProp] = value; \
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);