@amazon-devices/react-native-screens 2.0.1758683737

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 (381) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +223 -0
  3. package/RNScreens.podspec +53 -0
  4. package/SystemBundles/8f5a820b958535e533acb38dbc0c72c1837721b9db075f4a1740e42b9fee3910.bundle +33668 -0
  5. package/SystemBundles/8f5a820b958535e533acb38dbc0c72c1837721b9db075f4a1740e42b9fee3910.map +1 -0
  6. package/SystemModules/amzn__react-native-screens.modules.txt +101 -0
  7. package/SystemModules/amzn__react-native-screens.private.modules.txt +244 -0
  8. package/SystemModules/keplerscript-system-bundle-config.json +7 -0
  9. package/THIRD_PARTY_NOTICES.txt +707 -0
  10. package/android/build.gradle +133 -0
  11. package/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +49 -0
  12. package/android/src/main/AndroidManifest.xml +5 -0
  13. package/android/src/main/java/com/swmansion/rnscreens/CustomSearchView.kt +77 -0
  14. package/android/src/main/java/com/swmansion/rnscreens/CustomToolbar.kt +7 -0
  15. package/android/src/main/java/com/swmansion/rnscreens/FragmentBackPressOverrider.kt +29 -0
  16. package/android/src/main/java/com/swmansion/rnscreens/FragmentHolder.kt +7 -0
  17. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +21 -0
  18. package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +289 -0
  19. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt +372 -0
  20. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.kt +40 -0
  21. package/android/src/main/java/com/swmansion/rnscreens/ScreenEventDispatcher.kt +21 -0
  22. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt +331 -0
  23. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragmentWrapper.kt +22 -0
  24. package/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +336 -0
  25. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +282 -0
  26. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragmentWrapper.kt +15 -0
  27. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +398 -0
  28. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +204 -0
  29. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.kt +38 -0
  30. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt +41 -0
  31. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt +75 -0
  32. package/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +186 -0
  33. package/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt +296 -0
  34. package/android/src/main/java/com/swmansion/rnscreens/ScreensShadowNode.kt +19 -0
  35. package/android/src/main/java/com/swmansion/rnscreens/SearchBarManager.kt +133 -0
  36. package/android/src/main/java/com/swmansion/rnscreens/SearchBarView.kt +178 -0
  37. package/android/src/main/java/com/swmansion/rnscreens/SearchViewFormatter.kt +67 -0
  38. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderAttachedEvent.kt +22 -0
  39. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderBackButtonClickedEvent.kt +22 -0
  40. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderDetachedEvent.kt +22 -0
  41. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderHeightChangeEvent.kt +26 -0
  42. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenAppearEvent.kt +18 -0
  43. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDisappearEvent.kt +18 -0
  44. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDismissedEvent.kt +20 -0
  45. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenTransitionProgressEvent.kt +32 -0
  46. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillAppearEvent.kt +18 -0
  47. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillDisappearEvent.kt +18 -0
  48. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarBlurEvent.kt +22 -0
  49. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarChangeTextEvent.kt +28 -0
  50. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarCloseEvent.kt +22 -0
  51. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarFocusEvent.kt +22 -0
  52. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarOpenEvent.kt +22 -0
  53. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarSearchButtonPressEvent.kt +24 -0
  54. package/android/src/main/java/com/swmansion/rnscreens/events/StackFinishTransitioningEvent.kt +18 -0
  55. package/android/src/main/java/com/swmansion/rnscreens/utils/DeviceUtils.kt +12 -0
  56. package/android/src/main/jni/CMakeLists.txt +72 -0
  57. package/android/src/main/jni/rnscreens.cpp +16 -0
  58. package/android/src/main/jni/rnscreens.h +28 -0
  59. package/android/src/main/res/base/anim/rns_default_enter_in.xml +18 -0
  60. package/android/src/main/res/base/anim/rns_default_enter_out.xml +19 -0
  61. package/android/src/main/res/base/anim/rns_default_exit_in.xml +17 -0
  62. package/android/src/main/res/base/anim/rns_default_exit_out.xml +18 -0
  63. package/android/src/main/res/base/anim/rns_fade_from_bottom.xml +14 -0
  64. package/android/src/main/res/base/anim/rns_fade_in.xml +7 -0
  65. package/android/src/main/res/base/anim/rns_fade_out.xml +7 -0
  66. package/android/src/main/res/base/anim/rns_fade_to_bottom.xml +15 -0
  67. package/android/src/main/res/base/anim/rns_no_animation_20.xml +6 -0
  68. package/android/src/main/res/base/anim/rns_no_animation_250.xml +7 -0
  69. package/android/src/main/res/base/anim/rns_no_animation_350.xml +6 -0
  70. package/android/src/main/res/base/anim/rns_no_animation_medium.xml +7 -0
  71. package/android/src/main/res/base/anim/rns_slide_in_from_bottom.xml +7 -0
  72. package/android/src/main/res/base/anim/rns_slide_in_from_left.xml +5 -0
  73. package/android/src/main/res/base/anim/rns_slide_in_from_right.xml +5 -0
  74. package/android/src/main/res/base/anim/rns_slide_out_to_bottom.xml +7 -0
  75. package/android/src/main/res/base/anim/rns_slide_out_to_left.xml +5 -0
  76. package/android/src/main/res/base/anim/rns_slide_out_to_right.xml +5 -0
  77. package/android/src/main/res/base/anim/rns_standard_accelerate_interpolator.xml +6 -0
  78. package/android/src/main/res/v33/anim-v33/rns_default_enter_in.xml +38 -0
  79. package/android/src/main/res/v33/anim-v33/rns_default_enter_out.xml +38 -0
  80. package/android/src/main/res/v33/anim-v33/rns_default_exit_in.xml +38 -0
  81. package/android/src/main/res/v33/anim-v33/rns_default_exit_out.xml +38 -0
  82. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +111 -0
  83. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +44 -0
  84. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java +107 -0
  85. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java +42 -0
  86. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java +31 -0
  87. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java +17 -0
  88. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackManagerDelegate.java +25 -0
  89. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackManagerInterface.java +16 -0
  90. package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +10 -0
  91. package/common/cpp/react/renderer/components/rnscreens/RNSScreenComponentDescriptor.h +41 -0
  92. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.cpp +9 -0
  93. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.h +30 -0
  94. package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.cpp +14 -0
  95. package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.h +45 -0
  96. package/ios/RCTImageComponentView+RNSScreenStackHeaderConfig.h +11 -0
  97. package/ios/RCTImageComponentView+RNSScreenStackHeaderConfig.mm +14 -0
  98. package/ios/RNSConvert.h +36 -0
  99. package/ios/RNSConvert.mm +154 -0
  100. package/ios/RNSEnums.h +71 -0
  101. package/ios/RNSFullWindowOverlay.h +34 -0
  102. package/ios/RNSFullWindowOverlay.mm +241 -0
  103. package/ios/RNSScreen.h +144 -0
  104. package/ios/RNSScreen.mm +1599 -0
  105. package/ios/RNSScreenContainer.h +45 -0
  106. package/ios/RNSScreenContainer.mm +343 -0
  107. package/ios/RNSScreenNavigationContainer.h +16 -0
  108. package/ios/RNSScreenNavigationContainer.mm +66 -0
  109. package/ios/RNSScreenStack.h +37 -0
  110. package/ios/RNSScreenStack.mm +1111 -0
  111. package/ios/RNSScreenStackAnimator.h +8 -0
  112. package/ios/RNSScreenStackAnimator.mm +320 -0
  113. package/ios/RNSScreenStackHeaderConfig.h +74 -0
  114. package/ios/RNSScreenStackHeaderConfig.mm +967 -0
  115. package/ios/RNSScreenStackHeaderSubview.h +44 -0
  116. package/ios/RNSScreenStackHeaderSubview.mm +147 -0
  117. package/ios/RNSScreenWindowTraits.h +26 -0
  118. package/ios/RNSScreenWindowTraits.mm +266 -0
  119. package/ios/RNSSearchBar.h +43 -0
  120. package/ios/RNSSearchBar.mm +465 -0
  121. package/ios/RNScreens.xcodeproj/project.pbxproj +461 -0
  122. package/ios/UIViewController+RNScreens.h +9 -0
  123. package/ios/UIViewController+RNScreens.mm +78 -0
  124. package/ios/UIWindow+RNScreens.h +9 -0
  125. package/ios/UIWindow+RNScreens.mm +17 -0
  126. package/ios/events/RNSHeaderHeightChangeEvent.h +8 -0
  127. package/ios/events/RNSHeaderHeightChangeEvent.mm +44 -0
  128. package/ios/events/RNSScreenViewEvent.h +12 -0
  129. package/ios/events/RNSScreenViewEvent.mm +59 -0
  130. package/ios/utils/RNSUIBarButtonItem.h +5 -0
  131. package/ios/utils/RNSUIBarButtonItem.mm +22 -0
  132. package/kepler-compatibility.json +8 -0
  133. package/kepler-transformed-package-info.json +3 -0
  134. package/lib/commonjs/TransitionProgressContext.js +11 -0
  135. package/lib/commonjs/TransitionProgressContext.js.map +1 -0
  136. package/lib/commonjs/fabric/FullWindowOverlayNativeComponent.js +11 -0
  137. package/lib/commonjs/fabric/FullWindowOverlayNativeComponent.js.map +1 -0
  138. package/lib/commonjs/fabric/ScreenContainerNativeComponent.js +33 -0
  139. package/lib/commonjs/fabric/ScreenContainerNativeComponent.js.map +1 -0
  140. package/lib/commonjs/fabric/ScreenNativeComponent.js +70 -0
  141. package/lib/commonjs/fabric/ScreenNativeComponent.js.map +1 -0
  142. package/lib/commonjs/fabric/ScreenNavigationContainerNativeComponent.js +11 -0
  143. package/lib/commonjs/fabric/ScreenNavigationContainerNativeComponent.js.map +1 -0
  144. package/lib/commonjs/fabric/ScreenStackHeaderConfigNativeComponent.js +31 -0
  145. package/lib/commonjs/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -0
  146. package/lib/commonjs/fabric/ScreenStackHeaderSubviewNativeComponent.js +12 -0
  147. package/lib/commonjs/fabric/ScreenStackHeaderSubviewNativeComponent.js.map +1 -0
  148. package/lib/commonjs/fabric/ScreenStackNativeComponent.js +35 -0
  149. package/lib/commonjs/fabric/ScreenStackNativeComponent.js.map +1 -0
  150. package/lib/commonjs/fabric/SearchBarNativeComponent.js +19 -0
  151. package/lib/commonjs/fabric/SearchBarNativeComponent.js.map +1 -0
  152. package/lib/commonjs/index.js +147 -0
  153. package/lib/commonjs/index.js.map +1 -0
  154. package/lib/commonjs/index.native.js +407 -0
  155. package/lib/commonjs/index.native.js.map +1 -0
  156. package/lib/commonjs/native-stack/index.js +49 -0
  157. package/lib/commonjs/native-stack/index.js.map +1 -0
  158. package/lib/commonjs/native-stack/navigators/createNativeStackNavigator.js +75 -0
  159. package/lib/commonjs/native-stack/navigators/createNativeStackNavigator.js.map +1 -0
  160. package/lib/commonjs/native-stack/types.js +6 -0
  161. package/lib/commonjs/native-stack/types.js.map +1 -0
  162. package/lib/commonjs/native-stack/utils/AnimatedHeaderHeightContext.js +12 -0
  163. package/lib/commonjs/native-stack/utils/AnimatedHeaderHeightContext.js.map +1 -0
  164. package/lib/commonjs/native-stack/utils/HeaderHeightContext.js +12 -0
  165. package/lib/commonjs/native-stack/utils/HeaderHeightContext.js.map +1 -0
  166. package/lib/commonjs/native-stack/utils/SafeAreaProviderCompat.js +75 -0
  167. package/lib/commonjs/native-stack/utils/SafeAreaProviderCompat.js.map +1 -0
  168. package/lib/commonjs/native-stack/utils/getDefaultHeaderHeight.js +35 -0
  169. package/lib/commonjs/native-stack/utils/getDefaultHeaderHeight.js.map +1 -0
  170. package/lib/commonjs/native-stack/utils/useAnimatedHeaderHeight.js +19 -0
  171. package/lib/commonjs/native-stack/utils/useAnimatedHeaderHeight.js.map +1 -0
  172. package/lib/commonjs/native-stack/utils/useBackPressSubscription.js +54 -0
  173. package/lib/commonjs/native-stack/utils/useBackPressSubscription.js.map +1 -0
  174. package/lib/commonjs/native-stack/utils/useHeaderHeight.js +19 -0
  175. package/lib/commonjs/native-stack/utils/useHeaderHeight.js.map +1 -0
  176. package/lib/commonjs/native-stack/views/FontProcessor.js +21 -0
  177. package/lib/commonjs/native-stack/views/FontProcessor.js.map +1 -0
  178. package/lib/commonjs/native-stack/views/HeaderConfig.js +141 -0
  179. package/lib/commonjs/native-stack/views/HeaderConfig.js.map +1 -0
  180. package/lib/commonjs/native-stack/views/NativeStackView.js +354 -0
  181. package/lib/commonjs/native-stack/views/NativeStackView.js.map +1 -0
  182. package/lib/commonjs/reanimated/ReanimatedHeaderHeightContext.js +12 -0
  183. package/lib/commonjs/reanimated/ReanimatedHeaderHeightContext.js.map +1 -0
  184. package/lib/commonjs/reanimated/ReanimatedNativeStackScreen.js +101 -0
  185. package/lib/commonjs/reanimated/ReanimatedNativeStackScreen.js.map +1 -0
  186. package/lib/commonjs/reanimated/ReanimatedScreen.js +22 -0
  187. package/lib/commonjs/reanimated/ReanimatedScreen.js.map +1 -0
  188. package/lib/commonjs/reanimated/ReanimatedScreenProvider.js +47 -0
  189. package/lib/commonjs/reanimated/ReanimatedScreenProvider.js.map +1 -0
  190. package/lib/commonjs/reanimated/ReanimatedTransitionProgressContext.js +12 -0
  191. package/lib/commonjs/reanimated/ReanimatedTransitionProgressContext.js.map +1 -0
  192. package/lib/commonjs/reanimated/index.js +28 -0
  193. package/lib/commonjs/reanimated/index.js.map +1 -0
  194. package/lib/commonjs/reanimated/useReanimatedHeaderHeight.js +19 -0
  195. package/lib/commonjs/reanimated/useReanimatedHeaderHeight.js.map +1 -0
  196. package/lib/commonjs/reanimated/useReanimatedTransitionProgress.js +19 -0
  197. package/lib/commonjs/reanimated/useReanimatedTransitionProgress.js.map +1 -0
  198. package/lib/commonjs/types.js +6 -0
  199. package/lib/commonjs/types.js.map +1 -0
  200. package/lib/commonjs/useTransitionProgress.js +19 -0
  201. package/lib/commonjs/useTransitionProgress.js.map +1 -0
  202. package/lib/commonjs/utils.js +21 -0
  203. package/lib/commonjs/utils.js.map +1 -0
  204. package/lib/module/TransitionProgressContext.js +3 -0
  205. package/lib/module/TransitionProgressContext.js.map +1 -0
  206. package/lib/module/fabric/FullWindowOverlayNativeComponent.js +4 -0
  207. package/lib/module/fabric/FullWindowOverlayNativeComponent.js.map +1 -0
  208. package/lib/module/fabric/ScreenContainerNativeComponent.js +25 -0
  209. package/lib/module/fabric/ScreenContainerNativeComponent.js.map +1 -0
  210. package/lib/module/fabric/ScreenNativeComponent.js +63 -0
  211. package/lib/module/fabric/ScreenNativeComponent.js.map +1 -0
  212. package/lib/module/fabric/ScreenNavigationContainerNativeComponent.js +4 -0
  213. package/lib/module/fabric/ScreenNavigationContainerNativeComponent.js.map +1 -0
  214. package/lib/module/fabric/ScreenStackHeaderConfigNativeComponent.js +23 -0
  215. package/lib/module/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -0
  216. package/lib/module/fabric/ScreenStackHeaderSubviewNativeComponent.js +7 -0
  217. package/lib/module/fabric/ScreenStackHeaderSubviewNativeComponent.js.map +1 -0
  218. package/lib/module/fabric/ScreenStackNativeComponent.js +28 -0
  219. package/lib/module/fabric/ScreenStackNativeComponent.js.map +1 -0
  220. package/lib/module/fabric/SearchBarNativeComponent.js +10 -0
  221. package/lib/module/fabric/SearchBarNativeComponent.js.map +1 -0
  222. package/lib/module/index.js +67 -0
  223. package/lib/module/index.js.map +1 -0
  224. package/lib/module/index.native.js +410 -0
  225. package/lib/module/index.native.js.map +1 -0
  226. package/lib/module/native-stack/index.js +22 -0
  227. package/lib/module/native-stack/index.js.map +1 -0
  228. package/lib/module/native-stack/navigators/createNativeStackNavigator.js +72 -0
  229. package/lib/module/native-stack/navigators/createNativeStackNavigator.js.map +1 -0
  230. package/lib/module/native-stack/types.js +2 -0
  231. package/lib/module/native-stack/types.js.map +1 -0
  232. package/lib/module/native-stack/utils/AnimatedHeaderHeightContext.js +4 -0
  233. package/lib/module/native-stack/utils/AnimatedHeaderHeightContext.js.map +1 -0
  234. package/lib/module/native-stack/utils/HeaderHeightContext.js +4 -0
  235. package/lib/module/native-stack/utils/HeaderHeightContext.js.map +1 -0
  236. package/lib/module/native-stack/utils/SafeAreaProviderCompat.js +68 -0
  237. package/lib/module/native-stack/utils/SafeAreaProviderCompat.js.map +1 -0
  238. package/lib/module/native-stack/utils/getDefaultHeaderHeight.js +29 -0
  239. package/lib/module/native-stack/utils/getDefaultHeaderHeight.js.map +1 -0
  240. package/lib/module/native-stack/utils/useAnimatedHeaderHeight.js +10 -0
  241. package/lib/module/native-stack/utils/useAnimatedHeaderHeight.js.map +1 -0
  242. package/lib/module/native-stack/utils/useBackPressSubscription.js +47 -0
  243. package/lib/module/native-stack/utils/useBackPressSubscription.js.map +1 -0
  244. package/lib/module/native-stack/utils/useHeaderHeight.js +10 -0
  245. package/lib/module/native-stack/utils/useHeaderHeight.js.map +1 -0
  246. package/lib/module/native-stack/views/FontProcessor.js +13 -0
  247. package/lib/module/native-stack/views/FontProcessor.js.map +1 -0
  248. package/lib/module/native-stack/views/HeaderConfig.js +132 -0
  249. package/lib/module/native-stack/views/HeaderConfig.js.map +1 -0
  250. package/lib/module/native-stack/views/NativeStackView.js +355 -0
  251. package/lib/module/native-stack/views/NativeStackView.js.map +1 -0
  252. package/lib/module/reanimated/ReanimatedHeaderHeightContext.js +5 -0
  253. package/lib/module/reanimated/ReanimatedHeaderHeightContext.js.map +1 -0
  254. package/lib/module/reanimated/ReanimatedNativeStackScreen.js +97 -0
  255. package/lib/module/reanimated/ReanimatedNativeStackScreen.js.map +1 -0
  256. package/lib/module/reanimated/ReanimatedScreen.js +17 -0
  257. package/lib/module/reanimated/ReanimatedScreen.js.map +1 -0
  258. package/lib/module/reanimated/ReanimatedScreenProvider.js +40 -0
  259. package/lib/module/reanimated/ReanimatedScreenProvider.js.map +1 -0
  260. package/lib/module/reanimated/ReanimatedTransitionProgressContext.js +5 -0
  261. package/lib/module/reanimated/ReanimatedTransitionProgressContext.js.map +1 -0
  262. package/lib/module/reanimated/index.js +4 -0
  263. package/lib/module/reanimated/index.js.map +1 -0
  264. package/lib/module/reanimated/useReanimatedHeaderHeight.js +10 -0
  265. package/lib/module/reanimated/useReanimatedHeaderHeight.js.map +1 -0
  266. package/lib/module/reanimated/useReanimatedTransitionProgress.js +10 -0
  267. package/lib/module/reanimated/useReanimatedTransitionProgress.js.map +1 -0
  268. package/lib/module/types.js +2 -0
  269. package/lib/module/types.js.map +1 -0
  270. package/lib/module/useTransitionProgress.js +10 -0
  271. package/lib/module/useTransitionProgress.js.map +1 -0
  272. package/lib/module/utils.js +14 -0
  273. package/lib/module/utils.js.map +1 -0
  274. package/lib/typescript/TransitionProgressContext.d.ts +9 -0
  275. package/lib/typescript/fabric/FullWindowOverlayNativeComponent.d.ts +7 -0
  276. package/lib/typescript/fabric/ScreenContainerNativeComponent.d.ts +5 -0
  277. package/lib/typescript/fabric/ScreenNativeComponent.d.ts +66 -0
  278. package/lib/typescript/fabric/ScreenNavigationContainerNativeComponent.d.ts +7 -0
  279. package/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts +33 -0
  280. package/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts +10 -0
  281. package/lib/typescript/fabric/ScreenStackNativeComponent.d.ts +8 -0
  282. package/lib/typescript/fabric/SearchBarNativeComponent.d.ts +49 -0
  283. package/lib/typescript/index.d.ts +33 -0
  284. package/lib/typescript/index.native.d.ts +2 -0
  285. package/lib/typescript/native-stack/index.d.ts +19 -0
  286. package/lib/typescript/native-stack/navigators/createNativeStackNavigator.d.ts +6 -0
  287. package/lib/typescript/native-stack/types.d.ts +438 -0
  288. package/lib/typescript/native-stack/utils/AnimatedHeaderHeightContext.d.ts +4 -0
  289. package/lib/typescript/native-stack/utils/HeaderHeightContext.d.ts +3 -0
  290. package/lib/typescript/native-stack/utils/SafeAreaProviderCompat.d.ts +11 -0
  291. package/lib/typescript/native-stack/utils/getDefaultHeaderHeight.d.ts +7 -0
  292. package/lib/typescript/native-stack/utils/useAnimatedHeaderHeight.d.ts +1 -0
  293. package/lib/typescript/native-stack/utils/useBackPressSubscription.d.ts +16 -0
  294. package/lib/typescript/native-stack/utils/useHeaderHeight.d.ts +1 -0
  295. package/lib/typescript/native-stack/views/FontProcessor.d.ts +1 -0
  296. package/lib/typescript/native-stack/views/HeaderConfig.d.ts +8 -0
  297. package/lib/typescript/native-stack/views/NativeStackView.d.ts +10 -0
  298. package/lib/typescript/reanimated/ReanimatedHeaderHeightContext.d.ts +4 -0
  299. package/lib/typescript/reanimated/ReanimatedNativeStackScreen.d.ts +5 -0
  300. package/lib/typescript/reanimated/ReanimatedScreen.d.ts +5 -0
  301. package/lib/typescript/reanimated/ReanimatedScreenProvider.d.ts +2 -0
  302. package/lib/typescript/reanimated/ReanimatedTransitionProgressContext.d.ts +9 -0
  303. package/lib/typescript/reanimated/index.d.ts +3 -0
  304. package/lib/typescript/reanimated/useReanimatedHeaderHeight.d.ts +3 -0
  305. package/lib/typescript/reanimated/useReanimatedTransitionProgress.d.ts +11 -0
  306. package/lib/typescript/types.d.ts +612 -0
  307. package/lib/typescript/useTransitionProgress.d.ts +5 -0
  308. package/lib/typescript/utils.d.ts +3 -0
  309. package/native-stack/README.md +814 -0
  310. package/native-stack/package.json +6 -0
  311. package/package.json +1 -0
  312. package/react-native.config.js +42 -0
  313. package/reanimated/package.json +6 -0
  314. package/src/TransitionProgressContext.tsx +12 -0
  315. package/src/fabric/FullWindowOverlayNativeComponent.ts +7 -0
  316. package/src/fabric/ScreenContainerNativeComponent.ts +28 -0
  317. package/src/fabric/ScreenNativeComponent.ts +158 -0
  318. package/src/fabric/ScreenNavigationContainerNativeComponent.ts +10 -0
  319. package/src/fabric/ScreenStackHeaderConfigNativeComponent.ts +61 -0
  320. package/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts +22 -0
  321. package/src/fabric/ScreenStackNativeComponent.ts +33 -0
  322. package/src/fabric/SearchBarNativeComponent.ts +79 -0
  323. package/src/index.native.tsx +599 -0
  324. package/src/index.tsx +119 -0
  325. package/src/native-stack/index.tsx +27 -0
  326. package/src/native-stack/navigators/createNativeStackNavigator.tsx +107 -0
  327. package/src/native-stack/types.tsx +486 -0
  328. package/src/native-stack/utils/AnimatedHeaderHeightContext.tsx +8 -0
  329. package/src/native-stack/utils/HeaderHeightContext.tsx +5 -0
  330. package/src/native-stack/utils/SafeAreaProviderCompat.tsx +78 -0
  331. package/src/native-stack/utils/getDefaultHeaderHeight.tsx +41 -0
  332. package/src/native-stack/utils/useAnimatedHeaderHeight.tsx +15 -0
  333. package/src/native-stack/utils/useBackPressSubscription.tsx +66 -0
  334. package/src/native-stack/utils/useHeaderHeight.tsx +15 -0
  335. package/src/native-stack/views/FontProcessor.tsx +14 -0
  336. package/src/native-stack/views/HeaderConfig.tsx +187 -0
  337. package/src/native-stack/views/NativeStackView.tsx +466 -0
  338. package/src/reanimated/ReanimatedHeaderHeightContext.tsx +7 -0
  339. package/src/reanimated/ReanimatedNativeStackScreen.tsx +130 -0
  340. package/src/reanimated/ReanimatedScreen.tsx +25 -0
  341. package/src/reanimated/ReanimatedScreenProvider.tsx +42 -0
  342. package/src/reanimated/ReanimatedTransitionProgressContext.tsx +13 -0
  343. package/src/reanimated/index.tsx +3 -0
  344. package/src/reanimated/useReanimatedHeaderHeight.tsx +14 -0
  345. package/src/reanimated/useReanimatedTransitionProgress.tsx +14 -0
  346. package/src/types.tsx +699 -0
  347. package/src/useTransitionProgress.tsx +15 -0
  348. package/src/utils.ts +18 -0
  349. package/windows/README.md +25 -0
  350. package/windows/RNScreens/PropertySheet.props +16 -0
  351. package/windows/RNScreens/RNScreens.cpp +66 -0
  352. package/windows/RNScreens/RNScreens.def +3 -0
  353. package/windows/RNScreens/RNScreens.h +41 -0
  354. package/windows/RNScreens/RNScreens.idl +8 -0
  355. package/windows/RNScreens/RNScreens.vcxproj +187 -0
  356. package/windows/RNScreens/RNScreens.vcxproj.filters +52 -0
  357. package/windows/RNScreens/ReactPackageProvider.cpp +30 -0
  358. package/windows/RNScreens/ReactPackageProvider.h +17 -0
  359. package/windows/RNScreens/ReactPackageProvider.idl +9 -0
  360. package/windows/RNScreens/Screen.cpp +122 -0
  361. package/windows/RNScreens/Screen.h +64 -0
  362. package/windows/RNScreens/ScreenContainer.cpp +49 -0
  363. package/windows/RNScreens/ScreenContainer.h +23 -0
  364. package/windows/RNScreens/ScreenContainerViewManager.cpp +133 -0
  365. package/windows/RNScreens/ScreenContainerViewManager.h +78 -0
  366. package/windows/RNScreens/ScreenStack.cpp +65 -0
  367. package/windows/RNScreens/ScreenStack.h +23 -0
  368. package/windows/RNScreens/ScreenStackHeaderConfig.cpp +19 -0
  369. package/windows/RNScreens/ScreenStackHeaderConfig.h +14 -0
  370. package/windows/RNScreens/ScreenStackHeaderConfigViewManager.cpp +89 -0
  371. package/windows/RNScreens/ScreenStackHeaderConfigViewManager.h +62 -0
  372. package/windows/RNScreens/ScreenStackViewManager.cpp +132 -0
  373. package/windows/RNScreens/ScreenStackViewManager.h +78 -0
  374. package/windows/RNScreens/ScreenViewManager.cpp +154 -0
  375. package/windows/RNScreens/ScreenViewManager.h +78 -0
  376. package/windows/RNScreens/packages.config +4 -0
  377. package/windows/RNScreens/pch.cpp +1 -0
  378. package/windows/RNScreens/pch.h +9 -0
  379. package/windows/RNScreens62.sln +254 -0
  380. package/windows/RNScreens63.sln +225 -0
  381. package/windows/RNScreens65.sln +144 -0
@@ -0,0 +1,466 @@
1
+ /*
2
+ * Portions of this file are copyright (c) 2023 Amazon.com, Inc. or its affiliates. All rights reserved.
3
+ *
4
+ * PORTIONS OF THIS FILE ARE AMAZON PROPRIETARY/CONFIDENTIAL. USE IS SUBJECT TO LICENSE TERMS.
5
+ *
6
+ * Amazon modifications are indicated by [amznmod_* comments].
7
+ */
8
+
9
+ /*
10
+ * Changelog:
11
+ * Set up react-native-screens package to build for Kepler
12
+ */
13
+
14
+ import * as React from 'react';
15
+ import { Animated, Platform, StyleSheet, View, ViewProps } from 'react-native';
16
+ // @ts-ignore Getting private component
17
+ // eslint-disable-next-line import/no-named-as-default, import/default, import/no-named-as-default-member, import/namespace
18
+ import AppContainer from 'react-native/Libraries/ReactNative/AppContainer';
19
+ import warnOnce from 'warn-once';
20
+ import {
21
+ ScreenStack,
22
+ StackPresentationTypes,
23
+ ScreenContext,
24
+ } from '@amazon-devices/react-native-screens';
25
+ import {
26
+ ParamListBase,
27
+ StackActions,
28
+ StackNavigationState,
29
+ useTheme,
30
+ Route,
31
+ NavigationState,
32
+ PartialState,
33
+ // amznmod_react - change imports to kepler packages
34
+ } from '@amazon-devices/react-navigation__native';
35
+ import {
36
+ Rect,
37
+ useSafeAreaFrame,
38
+ useSafeAreaInsets,
39
+ // amznmod_react - change imports to kepler packages
40
+ } from '@amazon-devices/react-native-safe-area-context';
41
+ import {
42
+ NativeStackDescriptorMap,
43
+ NativeStackNavigationHelpers,
44
+ NativeStackNavigationOptions,
45
+ } from '../types';
46
+ import HeaderConfig from './HeaderConfig';
47
+ import SafeAreaProviderCompat from '../utils/SafeAreaProviderCompat';
48
+ import getDefaultHeaderHeight from '../utils/getDefaultHeaderHeight';
49
+ import HeaderHeightContext from '../utils/HeaderHeightContext';
50
+ import AnimatedHeaderHeightContext from '../utils/AnimatedHeaderHeightContext';
51
+
52
+ const isAndroid = Platform.OS === 'android';
53
+
54
+ let Container = View;
55
+
56
+ if (__DEV__) {
57
+ const DebugContainer = (
58
+ props: ViewProps & { stackPresentation: StackPresentationTypes }
59
+ ) => {
60
+ const { stackPresentation, ...rest } = props;
61
+ if (Platform.OS === 'ios' && stackPresentation !== 'push') {
62
+ return (
63
+ <AppContainer>
64
+ <View {...rest} />
65
+ </AppContainer>
66
+ );
67
+ }
68
+ return <View {...rest} />;
69
+ };
70
+ // @ts-ignore Wrong props
71
+ Container = DebugContainer;
72
+ }
73
+
74
+ const MaybeNestedStack = ({
75
+ options,
76
+ route,
77
+ stackPresentation,
78
+ children,
79
+ }: {
80
+ options: NativeStackNavigationOptions;
81
+ route: Route<string>;
82
+ stackPresentation: StackPresentationTypes;
83
+ children: React.ReactNode;
84
+ }) => {
85
+ const { colors } = useTheme();
86
+ const { headerShown = true, contentStyle } = options;
87
+
88
+ const Screen = React.useContext(ScreenContext);
89
+
90
+ const isHeaderInModal = isAndroid
91
+ ? false
92
+ : stackPresentation !== 'push' && headerShown === true;
93
+
94
+ const headerShownPreviousRef = React.useRef(headerShown);
95
+
96
+ React.useEffect(() => {
97
+ warnOnce(
98
+ !isAndroid &&
99
+ stackPresentation !== 'push' &&
100
+ headerShownPreviousRef.current !== headerShown,
101
+ `Dynamically changing 'headerShown' in modals will result in remounting the screen and losing all local state. See options for the screen '${route.name}'.`
102
+ );
103
+
104
+ headerShownPreviousRef.current = headerShown;
105
+ }, [headerShown, stackPresentation, route.name]);
106
+
107
+ const content = (
108
+ <Container
109
+ style={[
110
+ styles.container,
111
+ stackPresentation !== 'transparentModal' &&
112
+ stackPresentation !== 'containedTransparentModal' && {
113
+ backgroundColor: colors.background,
114
+ },
115
+ contentStyle,
116
+ ]}
117
+ // @ts-ignore Wrong props passed to View
118
+ stackPresentation={stackPresentation}
119
+ // This view must *not* be flattened.
120
+ // See https://github.com/software-mansion/react-native-screens/pull/1825
121
+ // for detailed explanation.
122
+ collapsable={false}>
123
+ {children}
124
+ </Container>
125
+ );
126
+
127
+ const dimensions = useSafeAreaFrame();
128
+ const topInset = useSafeAreaInsets().top;
129
+ const isStatusBarTranslucent = options.statusBarTranslucent ?? false;
130
+ const statusBarHeight = getStatusBarHeight(
131
+ topInset,
132
+ dimensions,
133
+ isStatusBarTranslucent
134
+ );
135
+
136
+ const isLargeHeader = options.headerLargeTitle ?? false;
137
+
138
+ const headerHeight = getDefaultHeaderHeight(
139
+ dimensions,
140
+ statusBarHeight,
141
+ stackPresentation,
142
+ isLargeHeader
143
+ );
144
+
145
+ if (isHeaderInModal) {
146
+ return (
147
+ <ScreenStack style={styles.container}>
148
+ <Screen enabled isNativeStack style={StyleSheet.absoluteFill}>
149
+ <HeaderHeightContext.Provider value={headerHeight}>
150
+ <HeaderConfig {...options} route={route} />
151
+ {content}
152
+ </HeaderHeightContext.Provider>
153
+ </Screen>
154
+ </ScreenStack>
155
+ );
156
+ }
157
+ return content;
158
+ };
159
+
160
+ type NavigationRoute<
161
+ ParamList extends ParamListBase,
162
+ RouteName extends keyof ParamList
163
+ > = Route<Extract<RouteName, string>, ParamList[RouteName]> & {
164
+ state?: NavigationState | PartialState<NavigationState>;
165
+ };
166
+
167
+ const RouteView = ({
168
+ descriptors,
169
+ route,
170
+ index,
171
+ navigation,
172
+ stateKey,
173
+ }: {
174
+ descriptors: NativeStackDescriptorMap;
175
+ route: NavigationRoute<ParamListBase, string>;
176
+ index: number;
177
+ navigation: NativeStackNavigationHelpers;
178
+ stateKey: string;
179
+ }) => {
180
+ const { options, render: renderScene } = descriptors[route.key];
181
+ const {
182
+ gestureEnabled,
183
+ headerShown,
184
+ hideKeyboardOnSwipe,
185
+ homeIndicatorHidden,
186
+ sheetAllowedDetents = 'large',
187
+ sheetLargestUndimmedDetent = 'all',
188
+ sheetGrabberVisible = false,
189
+ sheetCornerRadius = -1.0,
190
+ sheetExpandsWhenScrolledToEdge = true,
191
+ nativeBackButtonDismissalEnabled = false,
192
+ navigationBarColor,
193
+ navigationBarHidden,
194
+ replaceAnimation = 'pop',
195
+ screenOrientation,
196
+ statusBarAnimation,
197
+ statusBarColor,
198
+ statusBarHidden,
199
+ statusBarStyle,
200
+ statusBarTranslucent,
201
+ swipeDirection = 'horizontal',
202
+ transitionDuration,
203
+ freezeOnBlur,
204
+ } = options;
205
+
206
+ let {
207
+ customAnimationOnSwipe,
208
+ fullScreenSwipeEnabled,
209
+ gestureResponseDistance,
210
+ stackAnimation,
211
+ stackPresentation = 'push',
212
+ } = options;
213
+
214
+ if (swipeDirection === 'vertical') {
215
+ // for `vertical` direction to work, we need to set `fullScreenSwipeEnabled` to `true`
216
+ // so the screen can be dismissed from any point on screen.
217
+ // `customAnimationOnSwipe` needs to be set to `true` so the `stackAnimation` set by user can be used,
218
+ // otherwise `simple_push` will be used.
219
+ // Also, the default animation for this direction seems to be `slide_from_bottom`.
220
+ if (fullScreenSwipeEnabled === undefined) {
221
+ fullScreenSwipeEnabled = true;
222
+ }
223
+ if (customAnimationOnSwipe === undefined) {
224
+ customAnimationOnSwipe = true;
225
+ }
226
+ if (stackAnimation === undefined) {
227
+ stackAnimation = 'slide_from_bottom';
228
+ }
229
+ }
230
+
231
+ if (index === 0) {
232
+ // first screen should always be treated as `push`, it resolves problems with no header animation
233
+ // for navigator with first screen as `modal` and the next as `push`
234
+ stackPresentation = 'push';
235
+ }
236
+
237
+ const dimensions = useSafeAreaFrame();
238
+ const topInset = useSafeAreaInsets().top;
239
+ const isStatusBarTranslucent = options.statusBarTranslucent ?? false;
240
+ const statusBarHeight = getStatusBarHeight(
241
+ topInset,
242
+ dimensions,
243
+ isStatusBarTranslucent
244
+ );
245
+
246
+ const isLargeHeader = options.headerLargeTitle ?? false;
247
+
248
+ const defaultHeaderHeight = getDefaultHeaderHeight(
249
+ dimensions,
250
+ statusBarHeight,
251
+ stackPresentation,
252
+ isLargeHeader
253
+ );
254
+
255
+ const parentHeaderHeight = React.useContext(HeaderHeightContext);
256
+ const isHeaderInPush = isAndroid
257
+ ? headerShown
258
+ : stackPresentation === 'push' && headerShown !== false;
259
+
260
+ const staticHeaderHeight =
261
+ isHeaderInPush !== false ? defaultHeaderHeight : parentHeaderHeight ?? 0;
262
+
263
+ // We need to ensure the first retrieved header height will be cached and set in animatedHeaderHeight.
264
+ // We're caching the header height here, as on iOS native side events are not always coming to the JS on first notify.
265
+ // TODO: Check why first event is not being received once it is cached on the native side.
266
+ const cachedAnimatedHeaderHeight = React.useRef(statusBarHeight);
267
+ const animatedHeaderHeight = React.useRef(
268
+ // amznmod_react - change imports to kepler packages
269
+ // @ts-ignore
270
+ new Animated.Value(staticHeaderHeight, {
271
+ useNativeDriver: true,
272
+ })
273
+ ).current;
274
+
275
+ const Screen = React.useContext(ScreenContext);
276
+
277
+ const { dark } = useTheme();
278
+
279
+ return (
280
+ <Screen
281
+ key={route.key}
282
+ enabled
283
+ isNativeStack
284
+ style={StyleSheet.absoluteFill}
285
+ sheetAllowedDetents={sheetAllowedDetents}
286
+ sheetLargestUndimmedDetent={sheetLargestUndimmedDetent}
287
+ sheetGrabberVisible={sheetGrabberVisible}
288
+ sheetCornerRadius={sheetCornerRadius}
289
+ sheetExpandsWhenScrolledToEdge={sheetExpandsWhenScrolledToEdge}
290
+ customAnimationOnSwipe={customAnimationOnSwipe}
291
+ freezeOnBlur={freezeOnBlur}
292
+ fullScreenSwipeEnabled={fullScreenSwipeEnabled}
293
+ hideKeyboardOnSwipe={hideKeyboardOnSwipe}
294
+ homeIndicatorHidden={homeIndicatorHidden}
295
+ gestureEnabled={isAndroid ? false : gestureEnabled}
296
+ gestureResponseDistance={gestureResponseDistance}
297
+ nativeBackButtonDismissalEnabled={nativeBackButtonDismissalEnabled}
298
+ navigationBarColor={navigationBarColor}
299
+ navigationBarHidden={navigationBarHidden}
300
+ replaceAnimation={replaceAnimation}
301
+ screenOrientation={screenOrientation}
302
+ stackAnimation={stackAnimation}
303
+ stackPresentation={stackPresentation}
304
+ statusBarAnimation={statusBarAnimation}
305
+ statusBarColor={statusBarColor}
306
+ statusBarHidden={statusBarHidden}
307
+ statusBarStyle={statusBarStyle ?? (dark ? 'light' : 'dark')}
308
+ statusBarTranslucent={statusBarTranslucent}
309
+ swipeDirection={swipeDirection}
310
+ transitionDuration={transitionDuration}
311
+ onHeaderBackButtonClicked={() => {
312
+ navigation.dispatch({
313
+ ...StackActions.pop(),
314
+ source: route.key,
315
+ target: stateKey,
316
+ });
317
+ }}
318
+ onWillAppear={() => {
319
+ navigation.emit({
320
+ type: 'transitionStart',
321
+ data: { closing: false },
322
+ target: route.key,
323
+ });
324
+ }}
325
+ onWillDisappear={() => {
326
+ navigation.emit({
327
+ type: 'transitionStart',
328
+ data: { closing: true },
329
+ target: route.key,
330
+ });
331
+ }}
332
+ onAppear={() => {
333
+ navigation.emit({
334
+ type: 'appear',
335
+ target: route.key,
336
+ });
337
+ navigation.emit({
338
+ type: 'transitionEnd',
339
+ data: { closing: false },
340
+ target: route.key,
341
+ });
342
+ }}
343
+ onDisappear={() => {
344
+ navigation.emit({
345
+ type: 'transitionEnd',
346
+ data: { closing: true },
347
+ target: route.key,
348
+ });
349
+ }}
350
+ onHeaderHeightChange={e => {
351
+ const headerHeight = e.nativeEvent.headerHeight;
352
+
353
+ if (cachedAnimatedHeaderHeight.current !== headerHeight) {
354
+ // Currently, we're setting value by Animated#setValue, because we want to cache animated value.
355
+ // Also, in React Native 0.72 there was a bug on Fabric causing a large delay between the screen transition,
356
+ // which should not occur.
357
+ // TODO: Check if it's possible to replace animated#setValue to Animated#event.
358
+ animatedHeaderHeight.setValue(headerHeight);
359
+ cachedAnimatedHeaderHeight.current = headerHeight;
360
+ }
361
+ }}
362
+ onDismissed={e => {
363
+ navigation.emit({
364
+ type: 'dismiss',
365
+ target: route.key,
366
+ });
367
+
368
+ const dismissCount =
369
+ e.nativeEvent.dismissCount > 0 ? e.nativeEvent.dismissCount : 1;
370
+
371
+ navigation.dispatch({
372
+ ...StackActions.pop(dismissCount),
373
+ source: route.key,
374
+ target: stateKey,
375
+ });
376
+ }}
377
+ onGestureCancel={() => {
378
+ navigation.emit({
379
+ type: 'gestureCancel',
380
+ target: route.key,
381
+ });
382
+ }}>
383
+ <AnimatedHeaderHeightContext.Provider value={animatedHeaderHeight}>
384
+ <HeaderHeightContext.Provider value={staticHeaderHeight}>
385
+ <MaybeNestedStack
386
+ options={options}
387
+ route={route}
388
+ stackPresentation={stackPresentation}>
389
+ {renderScene()}
390
+ </MaybeNestedStack>
391
+ {/* HeaderConfig must not be first child of a Screen.
392
+ See https://github.com/software-mansion/react-native-screens/pull/1825
393
+ for detailed explanation */}
394
+ <HeaderConfig
395
+ {...options}
396
+ route={route}
397
+ headerShown={isHeaderInPush}
398
+ />
399
+ </HeaderHeightContext.Provider>
400
+ </AnimatedHeaderHeightContext.Provider>
401
+ </Screen>
402
+ );
403
+ };
404
+
405
+ type Props = {
406
+ state: StackNavigationState<ParamListBase>;
407
+ navigation: NativeStackNavigationHelpers;
408
+ descriptors: NativeStackDescriptorMap;
409
+ };
410
+
411
+ function NativeStackViewInner({
412
+ state,
413
+ navigation,
414
+ descriptors,
415
+ }: Props): JSX.Element {
416
+ const { key, routes } = state;
417
+
418
+ return (
419
+ <ScreenStack style={styles.container}>
420
+ {routes.map((route, index) => (
421
+ <RouteView
422
+ key={route.key}
423
+ descriptors={descriptors}
424
+ route={route}
425
+ index={index}
426
+ navigation={navigation}
427
+ stateKey={key}
428
+ />
429
+ ))}
430
+ </ScreenStack>
431
+ );
432
+ }
433
+
434
+ export default function NativeStackView(props: Props) {
435
+ return (
436
+ <SafeAreaProviderCompat>
437
+ <NativeStackViewInner {...props} />
438
+ </SafeAreaProviderCompat>
439
+ );
440
+ }
441
+
442
+ function getStatusBarHeight(
443
+ topInset: number,
444
+ dimensions: Rect,
445
+ isStatusBarTranslucent: boolean
446
+ ) {
447
+ if (Platform.OS === 'ios') {
448
+ // It looks like some iOS devices don't have strictly set status bar height to 44.
449
+ // Thus, if the top inset is higher than 50, then the device should have a dynamic island.
450
+ // On models with Dynamic Island the status bar height is smaller than the safe area top inset by 5 pixels.
451
+ // See https://developer.apple.com/forums/thread/662466 for more details about status bar height.
452
+ const hasDynamicIsland = topInset > 50;
453
+ return hasDynamicIsland ? topInset - 5 : topInset;
454
+ } else if (Platform.OS === 'android') {
455
+ // On Android we should also rely on frame's y-axis position, as topInset is 0 on visible status bar.
456
+ return isStatusBarTranslucent ? topInset : dimensions.y;
457
+ }
458
+
459
+ return topInset;
460
+ }
461
+
462
+ const styles = StyleSheet.create({
463
+ container: {
464
+ flex: 1,
465
+ },
466
+ });
@@ -0,0 +1,7 @@
1
+ import * as React from 'react';
2
+ // @ts-ignore file to be used only if `react-native-reanimated` available in the project
3
+ import Animated from 'react-native-reanimated';
4
+
5
+ export default React.createContext<Animated.SharedValue<number> | undefined>(
6
+ undefined
7
+ );
@@ -0,0 +1,130 @@
1
+ /*
2
+ * Portions of this file are copyright (c) 2023 Amazon.com, Inc. or its affiliates. All rights reserved.
3
+ *
4
+ * PORTIONS OF THIS FILE ARE AMAZON PROPRIETARY/CONFIDENTIAL. USE IS SUBJECT TO LICENSE TERMS.
5
+ *
6
+ * Amazon modifications are indicated by [amznmod_* comments].
7
+ */
8
+
9
+ /*
10
+ * Changelog:
11
+ * Set up react-native-screens package to build for Kepler
12
+ */
13
+
14
+ import React from 'react';
15
+ import { Platform } from 'react-native';
16
+ import {
17
+ HeaderHeightChangeEventType,
18
+ InnerScreen,
19
+ ScreenProps,
20
+ TransitionProgressEventType,
21
+ } from '@amazon-devices/react-native-screens';
22
+
23
+ // @ts-ignore file to be used only if `react-native-reanimated` available in the project
24
+ import Animated, { useEvent, useSharedValue } from 'react-native-reanimated';
25
+ import ReanimatedTransitionProgressContext from './ReanimatedTransitionProgressContext';
26
+ import {
27
+ useSafeAreaFrame,
28
+ useSafeAreaInsets,
29
+ // amznmod_react - change imports to kepler packages
30
+ } from '@amazon-devices/react-native-safe-area-context';
31
+ import getDefaultHeaderHeight from '../native-stack/utils/getDefaultHeaderHeight';
32
+ import ReanimatedHeaderHeightContext from './ReanimatedHeaderHeightContext';
33
+
34
+ const AnimatedScreen = Animated.createAnimatedComponent(
35
+ InnerScreen as unknown as React.ComponentClass
36
+ );
37
+
38
+ // We use prop added to global by reanimated since it seems safer than the one from RN. See:
39
+ // https://github.com/software-mansion/react-native-reanimated/blob/3fe8b35b05e82b2f2aefda1fb97799cf81e4b7bb/src/reanimated2/UpdateProps.ts#L46
40
+ // @ts-expect-error nativeFabricUIManager is not yet included in the RN types
41
+ const ENABLE_FABRIC = !!global?._IS_FABRIC;
42
+
43
+ const ReanimatedNativeStackScreen = React.forwardRef<
44
+ typeof AnimatedScreen,
45
+ ScreenProps
46
+ >((props, ref) => {
47
+ const { children, ...rest } = props;
48
+ const { stackPresentation = 'push' } = rest;
49
+
50
+ const dimensions = useSafeAreaFrame();
51
+ const topInset = useSafeAreaInsets().top;
52
+ let statusBarHeight = topInset;
53
+ const hasDynamicIsland = Platform.OS === 'ios' && topInset === 59;
54
+ if (hasDynamicIsland) {
55
+ // On models with Dynamic Island the status bar height is smaller than the safe area top inset.
56
+ statusBarHeight = 54;
57
+ }
58
+
59
+ // Default header height, normally used in `useHeaderHeight` hook.
60
+ // Here, it is used for returning a default value for shared value.
61
+ const defaultHeaderHeight = getDefaultHeaderHeight(
62
+ dimensions,
63
+ statusBarHeight,
64
+ stackPresentation
65
+ );
66
+
67
+ const cachedHeaderHeight = React.useRef(defaultHeaderHeight);
68
+ const headerHeight = useSharedValue(defaultHeaderHeight);
69
+
70
+ const progress = useSharedValue(0);
71
+ const closing = useSharedValue(0);
72
+ const goingForward = useSharedValue(0);
73
+
74
+ return (
75
+ <AnimatedScreen
76
+ // @ts-ignore some problems with ref and onTransitionProgressReanimated being "fake" prop for parsing of `useEvent` return value
77
+ ref={ref}
78
+ onTransitionProgressReanimated={useEvent(
79
+ (event: TransitionProgressEventType) => {
80
+ 'worklet';
81
+ progress.value = event.progress;
82
+ closing.value = event.closing;
83
+ goingForward.value = event.goingForward;
84
+ },
85
+ [
86
+ // This should not be necessary, but is not properly managed by `react-native-reanimated`
87
+ // @ts-ignore wrong type
88
+ Platform.OS === 'android'
89
+ ? 'onTransitionProgress'
90
+ : // for some reason there is a difference in required event name between architectures
91
+ ENABLE_FABRIC
92
+ ? 'onTransitionProgress'
93
+ : 'topTransitionProgress',
94
+ ]
95
+ )}
96
+ onHeaderHeightChangeReanimated={useEvent(
97
+ (event: HeaderHeightChangeEventType) => {
98
+ 'worklet';
99
+ if (event.headerHeight !== cachedHeaderHeight.current) {
100
+ headerHeight.value = event.headerHeight;
101
+ cachedHeaderHeight.current = event.headerHeight;
102
+ }
103
+ },
104
+ [
105
+ // @ts-ignore wrong type
106
+ Platform.OS === 'android'
107
+ ? 'onHeaderHeightChange'
108
+ : ENABLE_FABRIC
109
+ ? 'onHeaderHeightChange'
110
+ : 'topHeaderHeightChange',
111
+ ]
112
+ )}
113
+ {...rest}>
114
+ <ReanimatedHeaderHeightContext.Provider value={headerHeight}>
115
+ <ReanimatedTransitionProgressContext.Provider
116
+ value={{
117
+ progress,
118
+ closing,
119
+ goingForward,
120
+ }}>
121
+ {children}
122
+ </ReanimatedTransitionProgressContext.Provider>
123
+ </ReanimatedHeaderHeightContext.Provider>
124
+ </AnimatedScreen>
125
+ );
126
+ });
127
+
128
+ ReanimatedNativeStackScreen.displayName = 'ReanimatedNativeStackScreen';
129
+
130
+ export default ReanimatedNativeStackScreen;
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+ import { InnerScreen, ScreenProps } from '@amazon-devices/react-native-screens';
3
+
4
+ // @ts-ignore file to be used only if `react-native-reanimated` available in the project
5
+ import Animated from 'react-native-reanimated';
6
+
7
+ const AnimatedScreen = Animated.createAnimatedComponent(
8
+ InnerScreen as unknown as React.ComponentClass
9
+ );
10
+
11
+ const ReanimatedScreen = React.forwardRef<typeof AnimatedScreen, ScreenProps>(
12
+ (props, ref) => {
13
+ return (
14
+ <AnimatedScreen
15
+ // @ts-ignore some problems with ref and onTransitionProgressReanimated being "fake" prop for parsing of `useEvent` return value
16
+ ref={ref}
17
+ {...props}
18
+ />
19
+ );
20
+ }
21
+ );
22
+
23
+ ReanimatedScreen.displayName = 'ReanimatedScreen';
24
+
25
+ export default ReanimatedScreen;
@@ -0,0 +1,42 @@
1
+ import React, { PropsWithChildren } from 'react';
2
+ import { View } from 'react-native';
3
+ import { ScreenProps, ScreenContext } from '@amazon-devices/react-native-screens';
4
+ import ReanimatedNativeStackScreen from './ReanimatedNativeStackScreen';
5
+ import AnimatedScreen from './ReanimatedScreen';
6
+
7
+ class ReanimatedScreenWrapper extends React.Component<ScreenProps> {
8
+ private ref: React.ElementRef<typeof View> | null = null;
9
+
10
+ setNativeProps(props: ScreenProps): void {
11
+ this.ref?.setNativeProps(props);
12
+ }
13
+
14
+ setRef = (ref: React.ElementRef<typeof View> | null): void => {
15
+ this.ref = ref;
16
+ this.props.onComponentRef?.(ref);
17
+ };
18
+
19
+ render() {
20
+ const ReanimatedScreen = this.props.isNativeStack
21
+ ? ReanimatedNativeStackScreen
22
+ : AnimatedScreen;
23
+ return (
24
+ <ReanimatedScreen
25
+ {...this.props}
26
+ // @ts-ignore some problems with ref
27
+ ref={this.setRef}
28
+ />
29
+ );
30
+ }
31
+ }
32
+
33
+ export default function ReanimatedScreenProvider(
34
+ props: PropsWithChildren<unknown>
35
+ ) {
36
+ return (
37
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
38
+ <ScreenContext.Provider value={ReanimatedScreenWrapper as any}>
39
+ {props.children}
40
+ </ScreenContext.Provider>
41
+ );
42
+ }
@@ -0,0 +1,13 @@
1
+ import * as React from 'react';
2
+ // @ts-ignore file to be used only if `react-native-reanimated` available in the project
3
+ import Animated from 'react-native-reanimated';
4
+
5
+ type ReanimatedTransitionProgressContextBody = {
6
+ progress: Animated.SharedValue<number>;
7
+ closing: Animated.SharedValue<number>;
8
+ goingForward: Animated.SharedValue<number>;
9
+ };
10
+
11
+ export default React.createContext<
12
+ ReanimatedTransitionProgressContextBody | undefined
13
+ >(undefined);
@@ -0,0 +1,3 @@
1
+ export { default as ReanimatedScreenProvider } from './ReanimatedScreenProvider';
2
+ export { default as useReanimatedTransitionProgress } from './useReanimatedTransitionProgress';
3
+ export { default as useReanimatedHeaderHeight } from './useReanimatedHeaderHeight';