@amazon-devices/react-native-screens 2.0.9000000000 → 3.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 +57 -18
- package/RNScreens.podspec +12 -30
- package/SystemBundles/d557bc3ccca761f329c4a0be9f40c5edeceaeb72783a7971e6e3dcf80a6bedb0.bundle +45130 -0
- package/SystemBundles/d557bc3ccca761f329c4a0be9f40c5edeceaeb72783a7971e6e3dcf80a6bedb0.map +13686 -0
- package/SystemModules/amzn__react-native-screens-3.modules.txt +158 -0
- package/SystemModules/amzn__react-native-screens-3.private.modules.txt +376 -0
- package/SystemModules/keplerscript-system-bundle-config.json +4 -4
- package/android/CMakeLists.txt +80 -0
- package/android/build.gradle +96 -17
- package/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledHeaderConfigViewGroup.kt +61 -0
- package/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +38 -25
- package/android/src/fabric/java/com/swmansion/rnscreens/NativeProxy.kt +53 -0
- package/android/src/main/cpp/NativeProxy.cpp +51 -0
- package/android/src/main/cpp/NativeProxy.h +35 -0
- package/android/src/main/cpp/OnLoad.cpp +8 -0
- package/android/src/main/cpp/jni-adapter.cpp +106 -0
- package/android/src/main/java/com/swmansion/rnscreens/CustomSearchView.kt +20 -10
- package/android/src/main/java/com/swmansion/rnscreens/CustomToolbar.kt +69 -1
- package/android/src/main/java/com/swmansion/rnscreens/FragmentBackPressOverrider.kt +8 -8
- package/android/src/main/java/com/swmansion/rnscreens/InsetsObserverProxy.kt +104 -0
- package/android/src/main/java/com/swmansion/rnscreens/ModalScreenViewManager.kt +12 -0
- package/android/src/main/java/com/swmansion/rnscreens/NativeDismissalObserver.kt +12 -0
- package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +65 -7
- package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +327 -84
- package/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt +122 -72
- package/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.kt +27 -4
- package/android/src/main/java/com/swmansion/rnscreens/ScreenContentWrapper.kt +38 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenContentWrapperManager.kt +25 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenEventDispatcher.kt +10 -2
- package/android/src/main/java/com/swmansion/rnscreens/ScreenFooter.kt +299 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenFooterManager.kt +25 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt +91 -67
- package/android/src/main/java/com/swmansion/rnscreens/ScreenFragmentWrapper.kt +12 -1
- package/android/src/main/java/com/swmansion/rnscreens/ScreenModalFragment.kt +281 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +184 -81
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +467 -80
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragmentWrapper.kt +8 -1
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +156 -124
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigShadowNode.kt +25 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +159 -39
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.kt +24 -9
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt +19 -13
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt +31 -28
- package/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +276 -71
- package/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt +124 -64
- package/android/src/main/java/com/swmansion/rnscreens/ScreensModule.kt +127 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreensShadowNode.kt +4 -2
- package/android/src/main/java/com/swmansion/rnscreens/SearchBarManager.kt +160 -53
- package/android/src/main/java/com/swmansion/rnscreens/SearchBarView.kt +57 -32
- package/android/src/main/java/com/swmansion/rnscreens/SearchViewFormatter.kt +15 -10
- package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/BottomSheetBehaviorExt.kt +42 -0
- package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/BottomSheetDialogRootView.kt +104 -0
- package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/BottomSheetDialogScreen.kt +26 -0
- package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/DimmingFragment.kt +493 -0
- package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/DimmingView.kt +66 -0
- package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/GestureTransparentViewGroup.kt +24 -0
- package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/SheetUtils.kt +135 -0
- package/android/src/main/java/com/swmansion/rnscreens/events/HeaderAttachedEvent.kt +7 -8
- package/android/src/main/java/com/swmansion/rnscreens/events/HeaderBackButtonClickedEvent.kt +8 -9
- package/android/src/main/java/com/swmansion/rnscreens/events/HeaderDetachedEvent.kt +7 -8
- package/android/src/main/java/com/swmansion/rnscreens/events/HeaderHeightChangeEvent.kt +9 -10
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenAppearEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDisappearEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDismissedEvent.kt +8 -4
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenTransitionProgressEvent.kt +13 -16
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillAppearEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillDisappearEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarBlurEvent.kt +8 -9
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarChangeTextEvent.kt +8 -11
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarCloseEvent.kt +7 -8
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarFocusEvent.kt +8 -9
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarOpenEvent.kt +7 -8
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarSearchButtonPressEvent.kt +12 -11
- package/android/src/main/java/com/swmansion/rnscreens/events/SheetDetentChangedEvent.kt +27 -0
- package/android/src/main/java/com/swmansion/rnscreens/events/StackFinishTransitioningEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/ext/NumericExt.kt +12 -0
- package/android/src/main/java/com/swmansion/rnscreens/ext/ViewExt.kt +32 -0
- package/android/src/main/java/com/swmansion/rnscreens/utils/DeviceUtils.kt +1 -5
- package/android/src/main/java/com/swmansion/rnscreens/utils/PaddingBundle.kt +8 -0
- package/android/src/main/java/com/swmansion/rnscreens/utils/ScreenDummyLayoutHelper.kt +282 -0
- package/android/src/main/jni/CMakeLists.txt +35 -23
- package/android/src/main/jni/rnscreens.h +3 -0
- package/android/src/main/res/base/anim/rns_ios_from_left_background_close.xml +5 -0
- package/android/src/main/res/base/anim/rns_ios_from_left_background_open.xml +5 -0
- package/android/src/main/res/base/anim/rns_ios_from_left_foreground_close.xml +6 -0
- package/android/src/main/res/base/anim/rns_ios_from_left_foreground_open.xml +6 -0
- package/android/src/main/res/base/anim/rns_ios_from_right_background_close.xml +5 -0
- package/android/src/main/res/base/anim/rns_ios_from_right_background_open.xml +5 -0
- package/android/src/main/res/base/anim/rns_ios_from_right_foreground_close.xml +6 -0
- package/android/src/main/res/base/anim/rns_ios_from_right_foreground_open.xml +6 -0
- package/android/src/main/res/base/drawable/rns_rounder_top_corners_shape.xml +8 -0
- package/android/src/main/res/v33/anim-v33/rns_default_enter_in.xml +0 -1
- package/android/src/main/res/v33/anim-v33/rns_default_enter_out.xml +2 -2
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerDelegate.java +25 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerInterface.java +16 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContentWrapperManagerDelegate.java +25 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContentWrapperManagerInterface.java +16 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenFooterManagerDelegate.java +25 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenFooterManagerInterface.java +16 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +16 -3
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +7 -2
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java +6 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java +2 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSSearchBarManagerDelegate.java +99 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSSearchBarManagerInterface.java +37 -0
- package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledHeaderConfigViewGroup.kt +39 -0
- package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +11 -2
- package/android/src/paper/java/com/swmansion/rnscreens/NativeProxy.kt +19 -0
- package/android/src/paper/java/com/swmansion/rnscreens/NativeScreensModuleSpec.java +36 -0
- package/common/cpp/react/renderer/components/rnscreens/FrameCorrectionModes.h +51 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenComponentDescriptor.h +40 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.cpp +16 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.h +32 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenComponentDescriptor.h +55 -12
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.cpp +157 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.h +31 -11
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigComponentDescriptor.h +49 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigShadowNode.cpp +22 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigShadowNode.h +40 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigState.cpp +34 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigState.h +57 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewComponentDescriptor.h +27 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewShadowNode.cpp +8 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewShadowNode.h +31 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewState.cpp +15 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewState.h +39 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.cpp +23 -2
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.h +33 -8
- package/common/cpp/react/renderer/components/rnscreens/utils/RectUtil.h +36 -0
- package/cpp/RNSScreenRemovalListener.cpp +25 -0
- package/cpp/RNSScreenRemovalListener.h +20 -0
- package/cpp/RNScreensTurboModule.cpp +115 -0
- package/cpp/RNScreensTurboModule.h +40 -0
- package/gesture-handler/package.json +6 -0
- package/ios/RNSConvert.h +24 -4
- package/ios/RNSConvert.mm +180 -55
- package/ios/RNSEnums.h +48 -0
- package/ios/RNSFullWindowOverlay.mm +12 -2
- package/ios/RNSModalScreen.h +8 -0
- package/ios/RNSModalScreen.mm +65 -0
- package/ios/RNSModule.h +19 -0
- package/ios/RNSModule.mm +173 -0
- package/ios/RNSPercentDrivenInteractiveTransition.h +12 -0
- package/ios/RNSPercentDrivenInteractiveTransition.mm +69 -0
- package/ios/RNSScreen.h +24 -5
- package/ios/RNSScreen.mm +652 -173
- package/ios/RNSScreenContainer.mm +12 -1
- package/ios/RNSScreenContentWrapper.h +44 -0
- package/ios/RNSScreenContentWrapper.mm +67 -0
- package/ios/RNSScreenFooter.h +30 -0
- package/ios/RNSScreenFooter.mm +142 -0
- package/ios/RNSScreenNavigationContainer.mm +7 -0
- package/ios/RNSScreenStack.h +6 -0
- package/ios/RNSScreenStack.mm +333 -109
- package/ios/RNSScreenStackAnimator.h +15 -1
- package/ios/RNSScreenStackAnimator.mm +380 -115
- package/ios/RNSScreenStackHeaderConfig.h +74 -6
- package/ios/RNSScreenStackHeaderConfig.mm +338 -69
- package/ios/RNSScreenStackHeaderSubview.h +0 -7
- package/ios/RNSScreenStackHeaderSubview.mm +61 -24
- package/ios/RNSScreenWindowTraits.h +1 -1
- package/ios/RNSScreenWindowTraits.mm +24 -50
- package/ios/RNSSearchBar.h +5 -5
- package/ios/RNSSearchBar.mm +42 -11
- package/ios/events/RNSHeaderHeightChangeEvent.h +0 -1
- package/ios/events/RNSHeaderHeightChangeEvent.mm +15 -0
- package/ios/events/RNSScreenViewEvent.h +0 -1
- package/ios/utils/RCTSurfaceTouchHandler+RNSUtility.h +15 -0
- package/ios/utils/RCTSurfaceTouchHandler+RNSUtility.mm +14 -0
- package/ios/utils/RCTTouchHandler+RNSUtility.h +15 -0
- package/ios/utils/RCTTouchHandler+RNSUtility.mm +15 -0
- package/ios/utils/RNSDefines.h +7 -0
- package/ios/utils/RNSUIBarButtonItem.h +2 -0
- package/ios/utils/UINavigationBar+RNSUtility.h +37 -0
- package/ios/utils/UINavigationBar+RNSUtility.mm +44 -0
- package/ios/utils/UIView+RNSUtility.h +23 -0
- package/ios/utils/UIView+RNSUtility.mm +54 -0
- package/kepler-compatibility.json +2 -2
- package/lib/commonjs/TransitionProgressContext.js +2 -2
- package/lib/commonjs/TransitionProgressContext.js.map +1 -1
- package/lib/commonjs/components/DebugContainer.js +38 -0
- package/lib/commonjs/components/DebugContainer.js.map +1 -0
- package/lib/commonjs/components/DebugContainer.web.js +14 -0
- package/lib/commonjs/components/DebugContainer.web.js.map +1 -0
- package/lib/commonjs/components/FullWindowOverlay.js +31 -0
- package/lib/commonjs/components/FullWindowOverlay.js.map +1 -0
- package/lib/commonjs/components/FullWindowOverlay.web.js +9 -0
- package/lib/commonjs/components/FullWindowOverlay.web.js.map +1 -0
- package/lib/commonjs/components/Screen.js +286 -0
- package/lib/commonjs/components/Screen.js.map +1 -0
- package/lib/commonjs/components/Screen.web.js +48 -0
- package/lib/commonjs/components/Screen.web.js.map +1 -0
- package/lib/commonjs/components/ScreenContainer.js +32 -0
- package/lib/commonjs/components/ScreenContainer.js.map +1 -0
- package/lib/commonjs/components/ScreenContainer.web.js +10 -0
- package/lib/commonjs/components/ScreenContainer.web.js.map +1 -0
- package/lib/commonjs/components/ScreenContentWrapper.js +17 -0
- package/lib/commonjs/components/ScreenContentWrapper.js.map +1 -0
- package/lib/commonjs/components/ScreenContentWrapper.web.js +10 -0
- package/lib/commonjs/components/ScreenContentWrapper.web.js.map +1 -0
- package/lib/commonjs/components/ScreenFooter.js +25 -0
- package/lib/commonjs/components/ScreenFooter.js.map +1 -0
- package/lib/commonjs/components/ScreenFooter.web.js +11 -0
- package/lib/commonjs/components/ScreenFooter.web.js.map +1 -0
- package/lib/commonjs/components/ScreenStack.js +67 -0
- package/lib/commonjs/components/ScreenStack.js.map +1 -0
- package/lib/commonjs/components/ScreenStack.web.js +10 -0
- package/lib/commonjs/components/ScreenStack.web.js.map +1 -0
- package/lib/commonjs/components/ScreenStackHeaderConfig.js +100 -0
- package/lib/commonjs/components/ScreenStackHeaderConfig.js.map +1 -0
- package/lib/commonjs/components/ScreenStackHeaderConfig.web.js +39 -0
- package/lib/commonjs/components/ScreenStackHeaderConfig.web.js.map +1 -0
- package/lib/commonjs/components/ScreenStackItem.js +106 -0
- package/lib/commonjs/components/ScreenStackItem.js.map +1 -0
- package/lib/commonjs/components/SearchBar.js +67 -0
- package/lib/commonjs/components/SearchBar.js.map +1 -0
- package/lib/commonjs/components/SearchBar.web.js +10 -0
- package/lib/commonjs/components/SearchBar.web.js.map +1 -0
- package/lib/commonjs/components/helpers/DelayedFreeze.js +31 -0
- package/lib/commonjs/components/helpers/DelayedFreeze.js.map +1 -0
- package/lib/commonjs/components/helpers/usePrevious.js +16 -0
- package/lib/commonjs/components/helpers/usePrevious.js.map +1 -0
- package/lib/commonjs/contexts.js +11 -0
- package/lib/commonjs/contexts.js.map +1 -0
- package/lib/commonjs/core.js +40 -0
- package/lib/commonjs/core.js.map +1 -0
- package/lib/commonjs/fabric/FullWindowOverlayNativeComponent.js +17 -2
- package/lib/commonjs/fabric/FullWindowOverlayNativeComponent.js.map +1 -1
- package/lib/commonjs/fabric/ModalScreenNativeComponent.js +14 -0
- package/lib/commonjs/fabric/ModalScreenNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/NativeScreensModule.js +10 -0
- package/lib/commonjs/fabric/NativeScreensModule.js.map +1 -0
- package/lib/commonjs/fabric/NativeScreensModule.web.js +8 -0
- package/lib/commonjs/fabric/NativeScreensModule.web.js.map +1 -0
- package/lib/commonjs/fabric/ScreenContainerNativeComponent.js +8 -11
- package/lib/commonjs/fabric/ScreenContainerNativeComponent.js.map +1 -1
- package/lib/commonjs/fabric/ScreenContentWrapperNativeComponent.js +18 -0
- package/lib/commonjs/fabric/ScreenContentWrapperNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/ScreenFooterNativeComponent.js +10 -0
- package/lib/commonjs/fabric/ScreenFooterNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/ScreenNativeComponent.js +13 -15
- package/lib/commonjs/fabric/ScreenNativeComponent.js.map +1 -1
- package/lib/commonjs/fabric/ScreenNavigationContainerNativeComponent.js +3 -2
- package/lib/commonjs/fabric/ScreenNavigationContainerNativeComponent.js.map +1 -1
- package/lib/commonjs/fabric/ScreenStackHeaderConfigNativeComponent.js +10 -9
- package/lib/commonjs/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
- package/lib/commonjs/fabric/ScreenStackHeaderSubviewNativeComponent.js +6 -3
- package/lib/commonjs/fabric/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
- package/lib/commonjs/fabric/ScreenStackNativeComponent.js +8 -11
- package/lib/commonjs/fabric/ScreenStackNativeComponent.js.map +1 -1
- package/lib/commonjs/fabric/SearchBarNativeComponent.js +5 -6
- package/lib/commonjs/fabric/SearchBarNativeComponent.js.map +1 -1
- package/lib/commonjs/gesture-handler/GestureDetectorProvider.js +19 -0
- package/lib/commonjs/gesture-handler/GestureDetectorProvider.js.map +1 -0
- package/lib/commonjs/gesture-handler/RNScreensTurboModule.js +8 -0
- package/lib/commonjs/gesture-handler/RNScreensTurboModule.js.map +1 -0
- package/lib/commonjs/gesture-handler/ScreenGestureDetector.js +200 -0
- package/lib/commonjs/gesture-handler/ScreenGestureDetector.js.map +1 -0
- package/lib/commonjs/gesture-handler/constraints.js +64 -0
- package/lib/commonjs/gesture-handler/constraints.js.map +1 -0
- package/lib/commonjs/gesture-handler/defaults.js +45 -0
- package/lib/commonjs/gesture-handler/defaults.js.map +1 -0
- package/lib/commonjs/gesture-handler/fabricUtils.js +66 -0
- package/lib/commonjs/gesture-handler/fabricUtils.js.map +1 -0
- package/lib/commonjs/gesture-handler/fabricUtils.web.js +17 -0
- package/lib/commonjs/gesture-handler/fabricUtils.web.js.map +1 -0
- package/lib/commonjs/gesture-handler/index.js +14 -0
- package/lib/commonjs/gesture-handler/index.js.map +1 -0
- package/lib/commonjs/index.js +157 -95
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/native-stack/contexts/GHContext.js +12 -0
- package/lib/commonjs/native-stack/contexts/GHContext.js.map +1 -0
- package/lib/commonjs/native-stack/index.js +1 -1
- package/lib/commonjs/native-stack/index.js.map +1 -1
- package/lib/commonjs/native-stack/navigators/createNativeStackNavigator.js +24 -24
- package/lib/commonjs/native-stack/navigators/createNativeStackNavigator.js.map +1 -1
- package/lib/commonjs/native-stack/types.js.map +1 -1
- package/lib/commonjs/native-stack/utils/AnimatedHeaderHeightContext.js +1 -2
- package/lib/commonjs/native-stack/utils/AnimatedHeaderHeightContext.js.map +1 -1
- package/lib/commonjs/native-stack/utils/HeaderHeightContext.js +1 -2
- package/lib/commonjs/native-stack/utils/HeaderHeightContext.js.map +1 -1
- package/lib/commonjs/native-stack/utils/SafeAreaProviderCompat.js +1 -2
- package/lib/commonjs/native-stack/utils/SafeAreaProviderCompat.js.map +1 -1
- package/lib/commonjs/native-stack/utils/getDefaultHeaderHeight.js.map +1 -1
- package/lib/commonjs/native-stack/utils/getStatusBarHeight.js +22 -0
- package/lib/commonjs/native-stack/utils/getStatusBarHeight.js.map +1 -0
- package/lib/commonjs/native-stack/utils/useAnimatedHeaderHeight.js +2 -3
- package/lib/commonjs/native-stack/utils/useAnimatedHeaderHeight.js.map +1 -1
- package/lib/commonjs/native-stack/utils/useBackPressSubscription.js +5 -6
- package/lib/commonjs/native-stack/utils/useBackPressSubscription.js.map +1 -1
- package/lib/commonjs/native-stack/utils/useHeaderHeight.js +2 -3
- package/lib/commonjs/native-stack/utils/useHeaderHeight.js.map +1 -1
- package/lib/commonjs/native-stack/views/FontProcessor.js +2 -4
- package/lib/commonjs/native-stack/views/FontProcessor.js.map +1 -1
- package/lib/commonjs/native-stack/views/FooterComponent.js +17 -0
- package/lib/commonjs/native-stack/views/FooterComponent.js.map +1 -0
- package/lib/commonjs/native-stack/views/HeaderConfig.js +23 -15
- package/lib/commonjs/native-stack/views/HeaderConfig.js.map +1 -1
- package/lib/commonjs/native-stack/views/NativeStackView.js +124 -56
- package/lib/commonjs/native-stack/views/NativeStackView.js.map +1 -1
- package/lib/commonjs/reanimated/ReanimatedHeaderHeightContext.js +1 -2
- package/lib/commonjs/reanimated/ReanimatedHeaderHeightContext.js.map +1 -1
- package/lib/commonjs/reanimated/ReanimatedNativeStackScreen.js +14 -21
- package/lib/commonjs/reanimated/ReanimatedNativeStackScreen.js.map +1 -1
- package/lib/commonjs/reanimated/ReanimatedScreen.js +4 -4
- package/lib/commonjs/reanimated/ReanimatedScreen.js.map +1 -1
- package/lib/commonjs/reanimated/ReanimatedScreenProvider.js +10 -18
- package/lib/commonjs/reanimated/ReanimatedScreenProvider.js.map +1 -1
- package/lib/commonjs/reanimated/ReanimatedTransitionProgressContext.js +1 -2
- package/lib/commonjs/reanimated/ReanimatedTransitionProgressContext.js.map +1 -1
- package/lib/commonjs/reanimated/index.js +1 -1
- package/lib/commonjs/reanimated/index.js.map +1 -1
- package/lib/commonjs/reanimated/useReanimatedHeaderHeight.js +4 -5
- package/lib/commonjs/reanimated/useReanimatedHeaderHeight.js.map +1 -1
- package/lib/commonjs/reanimated/useReanimatedTransitionProgress.js +2 -3
- package/lib/commonjs/reanimated/useReanimatedTransitionProgress.js.map +1 -1
- package/lib/commonjs/types.js.map +1 -1
- package/lib/commonjs/useTransitionProgress.js +2 -3
- package/lib/commonjs/useTransitionProgress.js.map +1 -1
- package/lib/commonjs/utils.js +28 -6
- package/lib/commonjs/utils.js.map +1 -1
- package/lib/module/TransitionProgressContext.js +2 -0
- package/lib/module/TransitionProgressContext.js.map +1 -1
- package/lib/module/components/DebugContainer.js +30 -0
- package/lib/module/components/DebugContainer.js.map +1 -0
- package/lib/module/components/DebugContainer.web.js +6 -0
- package/lib/module/components/DebugContainer.web.js.map +1 -0
- package/lib/module/components/FullWindowOverlay.js +24 -0
- package/lib/module/components/FullWindowOverlay.js.map +1 -0
- package/lib/module/components/FullWindowOverlay.web.js +3 -0
- package/lib/module/components/FullWindowOverlay.web.js.map +1 -0
- package/lib/module/components/Screen.js +282 -0
- package/lib/module/components/Screen.js.map +1 -0
- package/lib/module/components/Screen.web.js +41 -0
- package/lib/module/components/Screen.web.js.map +1 -0
- package/lib/module/components/ScreenContainer.js +26 -0
- package/lib/module/components/ScreenContainer.js.map +1 -0
- package/lib/module/components/ScreenContainer.web.js +4 -0
- package/lib/module/components/ScreenContainer.web.js.map +1 -0
- package/lib/module/components/ScreenContentWrapper.js +10 -0
- package/lib/module/components/ScreenContentWrapper.js.map +1 -0
- package/lib/module/components/ScreenContentWrapper.web.js +4 -0
- package/lib/module/components/ScreenContentWrapper.web.js.map +1 -0
- package/lib/module/components/ScreenFooter.js +18 -0
- package/lib/module/components/ScreenFooter.js.map +1 -0
- package/lib/module/components/ScreenFooter.web.js +6 -0
- package/lib/module/components/ScreenFooter.web.js.map +1 -0
- package/lib/module/components/ScreenStack.js +63 -0
- package/lib/module/components/ScreenStack.js.map +1 -0
- package/lib/module/components/ScreenStack.web.js +4 -0
- package/lib/module/components/ScreenStack.web.js.map +1 -0
- package/lib/module/components/ScreenStackHeaderConfig.js +91 -0
- package/lib/module/components/ScreenStackHeaderConfig.js.map +1 -0
- package/lib/module/components/ScreenStackHeaderConfig.web.js +26 -0
- package/lib/module/components/ScreenStackHeaderConfig.web.js.map +1 -0
- package/lib/module/components/ScreenStackItem.js +98 -0
- package/lib/module/components/ScreenStackItem.js.map +1 -0
- package/lib/module/components/SearchBar.js +62 -0
- package/lib/module/components/SearchBar.js.map +1 -0
- package/lib/module/components/SearchBar.web.js +4 -0
- package/lib/module/components/SearchBar.web.js.map +1 -0
- package/lib/module/components/helpers/DelayedFreeze.js +24 -0
- package/lib/module/components/helpers/DelayedFreeze.js.map +1 -0
- package/lib/module/components/helpers/usePrevious.js +10 -0
- package/lib/module/components/helpers/usePrevious.js.map +1 -0
- package/lib/module/contexts.js +4 -0
- package/lib/module/contexts.js.map +1 -0
- package/lib/module/core.js +31 -0
- package/lib/module/core.js.map +1 -0
- package/lib/module/fabric/FullWindowOverlayNativeComponent.js +16 -0
- package/lib/module/fabric/FullWindowOverlayNativeComponent.js.map +1 -1
- package/lib/module/fabric/ModalScreenNativeComponent.js +10 -0
- package/lib/module/fabric/ModalScreenNativeComponent.js.map +1 -0
- package/lib/module/fabric/NativeScreensModule.js +5 -0
- package/lib/module/fabric/NativeScreensModule.js.map +1 -0
- package/lib/module/fabric/NativeScreensModule.web.js +2 -0
- package/lib/module/fabric/NativeScreensModule.web.js.map +1 -0
- package/lib/module/fabric/ScreenContainerNativeComponent.js +3 -4
- package/lib/module/fabric/ScreenContainerNativeComponent.js.map +1 -1
- package/lib/module/fabric/ScreenContentWrapperNativeComponent.js +10 -0
- package/lib/module/fabric/ScreenContentWrapperNativeComponent.js.map +1 -0
- package/lib/module/fabric/ScreenFooterNativeComponent.js +3 -0
- package/lib/module/fabric/ScreenFooterNativeComponent.js.map +1 -0
- package/lib/module/fabric/ScreenNativeComponent.js +8 -7
- package/lib/module/fabric/ScreenNativeComponent.js.map +1 -1
- package/lib/module/fabric/ScreenNavigationContainerNativeComponent.js +2 -0
- package/lib/module/fabric/ScreenNavigationContainerNativeComponent.js.map +1 -1
- package/lib/module/fabric/ScreenStackHeaderConfigNativeComponent.js +8 -2
- package/lib/module/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
- package/lib/module/fabric/ScreenStackHeaderSubviewNativeComponent.js +5 -1
- package/lib/module/fabric/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
- package/lib/module/fabric/ScreenStackNativeComponent.js +3 -3
- package/lib/module/fabric/ScreenStackNativeComponent.js.map +1 -1
- package/lib/module/fabric/SearchBarNativeComponent.js +3 -1
- package/lib/module/fabric/SearchBarNativeComponent.js.map +1 -1
- package/lib/module/gesture-handler/GestureDetectorProvider.js +12 -0
- package/lib/module/gesture-handler/GestureDetectorProvider.js.map +1 -0
- package/lib/module/gesture-handler/RNScreensTurboModule.js +2 -0
- package/lib/module/gesture-handler/RNScreensTurboModule.js.map +1 -0
- package/lib/module/gesture-handler/ScreenGestureDetector.js +193 -0
- package/lib/module/gesture-handler/ScreenGestureDetector.js.map +1 -0
- package/lib/module/gesture-handler/constraints.js +56 -0
- package/lib/module/gesture-handler/constraints.js.map +1 -0
- package/lib/module/gesture-handler/defaults.js +39 -0
- package/lib/module/gesture-handler/defaults.js.map +1 -0
- package/lib/module/gesture-handler/fabricUtils.js +61 -0
- package/lib/module/gesture-handler/fabricUtils.js.map +1 -0
- package/lib/module/gesture-handler/fabricUtils.web.js +10 -0
- package/lib/module/gesture-handler/fabricUtils.web.js.map +1 -0
- package/lib/module/gesture-handler/index.js +5 -0
- package/lib/module/gesture-handler/index.js.map +1 -0
- package/lib/module/index.js +29 -64
- package/lib/module/index.js.map +1 -1
- package/lib/module/native-stack/contexts/GHContext.js +6 -0
- package/lib/module/native-stack/contexts/GHContext.js.map +1 -0
- package/lib/module/native-stack/index.js.map +1 -1
- package/lib/module/native-stack/navigators/createNativeStackNavigator.js +22 -21
- package/lib/module/native-stack/navigators/createNativeStackNavigator.js.map +1 -1
- package/lib/module/native-stack/types.js.map +1 -1
- package/lib/module/native-stack/utils/AnimatedHeaderHeightContext.js.map +1 -1
- package/lib/module/native-stack/utils/HeaderHeightContext.js.map +1 -1
- package/lib/module/native-stack/utils/SafeAreaProviderCompat.js.map +1 -1
- package/lib/module/native-stack/utils/getDefaultHeaderHeight.js.map +1 -1
- package/lib/module/native-stack/utils/getStatusBarHeight.js +16 -0
- package/lib/module/native-stack/utils/getStatusBarHeight.js.map +1 -0
- package/lib/module/native-stack/utils/useAnimatedHeaderHeight.js.map +1 -1
- package/lib/module/native-stack/utils/useBackPressSubscription.js +4 -5
- package/lib/module/native-stack/utils/useBackPressSubscription.js.map +1 -1
- package/lib/module/native-stack/utils/useHeaderHeight.js.map +1 -1
- package/lib/module/native-stack/views/FontProcessor.js +2 -3
- package/lib/module/native-stack/views/FontProcessor.js.map +1 -1
- package/lib/module/native-stack/views/FooterComponent.js +10 -0
- package/lib/module/native-stack/views/FooterComponent.js.map +1 -0
- package/lib/module/native-stack/views/HeaderConfig.js +14 -6
- package/lib/module/native-stack/views/HeaderConfig.js.map +1 -1
- package/lib/module/native-stack/views/NativeStackView.js +118 -47
- package/lib/module/native-stack/views/NativeStackView.js.map +1 -1
- package/lib/module/reanimated/ReanimatedHeaderHeightContext.js.map +1 -1
- package/lib/module/reanimated/ReanimatedNativeStackScreen.js +9 -13
- package/lib/module/reanimated/ReanimatedNativeStackScreen.js.map +1 -1
- package/lib/module/reanimated/ReanimatedScreen.js +2 -3
- package/lib/module/reanimated/ReanimatedScreen.js.map +1 -1
- package/lib/module/reanimated/ReanimatedScreenProvider.js +8 -16
- package/lib/module/reanimated/ReanimatedScreenProvider.js.map +1 -1
- package/lib/module/reanimated/ReanimatedTransitionProgressContext.js.map +1 -1
- package/lib/module/reanimated/index.js.map +1 -1
- package/lib/module/reanimated/useReanimatedHeaderHeight.js +1 -1
- package/lib/module/reanimated/useReanimatedHeaderHeight.js.map +1 -1
- package/lib/module/reanimated/useReanimatedTransitionProgress.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/lib/module/useTransitionProgress.js.map +1 -1
- package/lib/module/utils.js +26 -5
- package/lib/module/utils.js.map +1 -1
- package/lib/typescript/TransitionProgressContext.d.ts +2 -1
- package/lib/typescript/TransitionProgressContext.d.ts.map +1 -0
- package/lib/typescript/components/DebugContainer.d.ts +15 -0
- package/lib/typescript/components/DebugContainer.d.ts.map +1 -0
- package/lib/typescript/components/DebugContainer.web.d.ts +4 -0
- package/lib/typescript/components/DebugContainer.web.d.ts.map +1 -0
- package/lib/typescript/components/FullWindowOverlay.d.ts +6 -0
- package/lib/typescript/components/FullWindowOverlay.d.ts.map +1 -0
- package/lib/typescript/components/FullWindowOverlay.web.d.ts +6 -0
- package/lib/typescript/components/FullWindowOverlay.web.d.ts.map +1 -0
- package/lib/typescript/components/Screen.d.ts +8 -0
- package/lib/typescript/components/Screen.d.ts.map +1 -0
- package/lib/typescript/components/Screen.web.d.ts +11 -0
- package/lib/typescript/components/Screen.web.d.ts.map +1 -0
- package/lib/typescript/components/ScreenContainer.d.ts +5 -0
- package/lib/typescript/components/ScreenContainer.d.ts.map +1 -0
- package/lib/typescript/components/ScreenContainer.web.d.ts +4 -0
- package/lib/typescript/components/ScreenContainer.web.d.ts.map +1 -0
- package/lib/typescript/components/ScreenContentWrapper.d.ts +5 -0
- package/lib/typescript/components/ScreenContentWrapper.d.ts.map +1 -0
- package/lib/typescript/components/ScreenContentWrapper.web.d.ts +4 -0
- package/lib/typescript/components/ScreenContentWrapper.web.d.ts.map +1 -0
- package/lib/typescript/components/ScreenFooter.d.ts +12 -0
- package/lib/typescript/components/ScreenFooter.d.ts.map +1 -0
- package/lib/typescript/components/ScreenFooter.web.d.ts +6 -0
- package/lib/typescript/components/ScreenFooter.web.d.ts.map +1 -0
- package/lib/typescript/components/ScreenStack.d.ts +5 -0
- package/lib/typescript/components/ScreenStack.d.ts.map +1 -0
- package/lib/typescript/components/ScreenStack.web.d.ts +4 -0
- package/lib/typescript/components/ScreenStack.web.d.ts.map +1 -0
- package/lib/typescript/components/ScreenStackHeaderConfig.d.ts +13 -0
- package/lib/typescript/components/ScreenStackHeaderConfig.d.ts.map +1 -0
- package/lib/typescript/components/ScreenStackHeaderConfig.web.d.ts +13 -0
- package/lib/typescript/components/ScreenStackHeaderConfig.web.d.ts.map +1 -0
- package/lib/typescript/components/ScreenStackItem.d.ts +11 -0
- package/lib/typescript/components/ScreenStackItem.d.ts.map +1 -0
- package/lib/typescript/components/SearchBar.d.ts +5 -0
- package/lib/typescript/components/SearchBar.d.ts.map +1 -0
- package/lib/typescript/components/SearchBar.web.d.ts +4 -0
- package/lib/typescript/components/SearchBar.web.d.ts.map +1 -0
- package/lib/typescript/components/helpers/DelayedFreeze.d.ts +8 -0
- package/lib/typescript/components/helpers/DelayedFreeze.d.ts.map +1 -0
- package/lib/typescript/components/helpers/usePrevious.d.ts +2 -0
- package/lib/typescript/components/helpers/usePrevious.d.ts.map +1 -0
- package/lib/typescript/contexts.d.ts +5 -0
- package/lib/typescript/contexts.d.ts.map +1 -0
- package/lib/typescript/core.d.ts +6 -0
- package/lib/typescript/core.d.ts.map +1 -0
- package/lib/typescript/fabric/FullWindowOverlayNativeComponent.d.ts +1 -1
- package/lib/typescript/fabric/FullWindowOverlayNativeComponent.d.ts.map +1 -0
- package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts +76 -0
- package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts.map +1 -0
- package/lib/typescript/fabric/NativeScreensModule.d.ts +6 -0
- package/lib/typescript/fabric/NativeScreensModule.d.ts.map +1 -0
- package/lib/typescript/fabric/NativeScreensModule.web.d.ts +3 -0
- package/lib/typescript/fabric/NativeScreensModule.web.d.ts.map +1 -0
- package/lib/typescript/fabric/ScreenContainerNativeComponent.d.ts +1 -0
- package/lib/typescript/fabric/ScreenContainerNativeComponent.d.ts.map +1 -0
- package/lib/typescript/fabric/ScreenContentWrapperNativeComponent.d.ts +6 -0
- package/lib/typescript/fabric/ScreenContentWrapperNativeComponent.d.ts.map +1 -0
- package/lib/typescript/fabric/ScreenFooterNativeComponent.d.ts +7 -0
- package/lib/typescript/fabric/ScreenFooterNativeComponent.d.ts.map +1 -0
- package/lib/typescript/fabric/ScreenNativeComponent.d.ts +34 -24
- package/lib/typescript/fabric/ScreenNativeComponent.d.ts.map +1 -0
- package/lib/typescript/fabric/ScreenNavigationContainerNativeComponent.d.ts +1 -1
- package/lib/typescript/fabric/ScreenNavigationContainerNativeComponent.d.ts.map +1 -0
- package/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts +12 -2
- package/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts.map +1 -0
- package/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts +2 -2
- package/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/fabric/ScreenStackNativeComponent.d.ts +4 -2
- package/lib/typescript/fabric/ScreenStackNativeComponent.d.ts.map +1 -0
- package/lib/typescript/fabric/SearchBarNativeComponent.d.ts +17 -16
- package/lib/typescript/fabric/SearchBarNativeComponent.d.ts.map +1 -0
- package/lib/typescript/gesture-handler/GestureDetectorProvider.d.ts +5 -0
- package/lib/typescript/gesture-handler/GestureDetectorProvider.d.ts.map +1 -0
- package/lib/typescript/gesture-handler/RNScreensTurboModule.d.ts +13 -0
- package/lib/typescript/gesture-handler/RNScreensTurboModule.d.ts.map +1 -0
- package/lib/typescript/gesture-handler/ScreenGestureDetector.d.ts +5 -0
- package/lib/typescript/gesture-handler/ScreenGestureDetector.d.ts.map +1 -0
- package/lib/typescript/gesture-handler/constraints.d.ts +6 -0
- package/lib/typescript/gesture-handler/constraints.d.ts.map +1 -0
- package/lib/typescript/gesture-handler/defaults.d.ts +20 -0
- package/lib/typescript/gesture-handler/defaults.d.ts.map +1 -0
- package/lib/typescript/gesture-handler/fabricUtils.d.ts +10 -0
- package/lib/typescript/gesture-handler/fabricUtils.d.ts.map +1 -0
- package/lib/typescript/gesture-handler/fabricUtils.web.d.ts +6 -0
- package/lib/typescript/gesture-handler/fabricUtils.web.d.ts.map +1 -0
- package/lib/typescript/gesture-handler/index.d.ts +2 -0
- package/lib/typescript/gesture-handler/index.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +25 -31
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/native-stack/contexts/GHContext.d.ts +4 -0
- package/lib/typescript/native-stack/contexts/GHContext.d.ts.map +1 -0
- package/lib/typescript/native-stack/index.d.ts +1 -0
- package/lib/typescript/native-stack/index.d.ts.map +1 -0
- package/lib/typescript/native-stack/navigators/createNativeStackNavigator.d.ts +4 -0
- package/lib/typescript/native-stack/navigators/createNativeStackNavigator.d.ts.map +1 -0
- package/lib/typescript/native-stack/types.d.ts +191 -33
- package/lib/typescript/native-stack/types.d.ts.map +1 -0
- package/lib/typescript/native-stack/utils/AnimatedHeaderHeightContext.d.ts +1 -0
- package/lib/typescript/native-stack/utils/AnimatedHeaderHeightContext.d.ts.map +1 -0
- package/lib/typescript/native-stack/utils/HeaderHeightContext.d.ts +1 -0
- package/lib/typescript/native-stack/utils/HeaderHeightContext.d.ts.map +1 -0
- package/lib/typescript/native-stack/utils/SafeAreaProviderCompat.d.ts +2 -1
- package/lib/typescript/native-stack/utils/SafeAreaProviderCompat.d.ts.map +1 -0
- package/lib/typescript/native-stack/utils/getDefaultHeaderHeight.d.ts +3 -2
- package/lib/typescript/native-stack/utils/getDefaultHeaderHeight.d.ts.map +1 -0
- package/lib/typescript/native-stack/utils/getStatusBarHeight.d.ts +3 -0
- package/lib/typescript/native-stack/utils/getStatusBarHeight.d.ts.map +1 -0
- package/lib/typescript/native-stack/utils/useAnimatedHeaderHeight.d.ts +2 -1
- package/lib/typescript/native-stack/utils/useAnimatedHeaderHeight.d.ts.map +1 -0
- package/lib/typescript/native-stack/utils/useBackPressSubscription.d.ts +1 -0
- package/lib/typescript/native-stack/utils/useBackPressSubscription.d.ts.map +1 -0
- package/lib/typescript/native-stack/utils/useHeaderHeight.d.ts +1 -0
- package/lib/typescript/native-stack/utils/useHeaderHeight.d.ts.map +1 -0
- package/lib/typescript/native-stack/views/FontProcessor.d.ts +1 -0
- package/lib/typescript/native-stack/views/FontProcessor.d.ts.map +1 -0
- package/lib/typescript/native-stack/views/FooterComponent.d.ts +7 -0
- package/lib/typescript/native-stack/views/FooterComponent.d.ts.map +1 -0
- package/lib/typescript/native-stack/views/HeaderConfig.d.ts +4 -3
- package/lib/typescript/native-stack/views/HeaderConfig.d.ts.map +1 -0
- package/lib/typescript/native-stack/views/NativeStackView.d.ts +2 -1
- package/lib/typescript/native-stack/views/NativeStackView.d.ts.map +1 -0
- package/lib/typescript/reanimated/ReanimatedHeaderHeightContext.d.ts +1 -0
- package/lib/typescript/reanimated/ReanimatedHeaderHeightContext.d.ts.map +1 -0
- package/lib/typescript/reanimated/ReanimatedNativeStackScreen.d.ts +3 -3
- package/lib/typescript/reanimated/ReanimatedNativeStackScreen.d.ts.map +1 -0
- package/lib/typescript/reanimated/ReanimatedScreen.d.ts +3 -3
- package/lib/typescript/reanimated/ReanimatedScreen.d.ts.map +1 -0
- package/lib/typescript/reanimated/ReanimatedScreenProvider.d.ts +1 -0
- package/lib/typescript/reanimated/ReanimatedScreenProvider.d.ts.map +1 -0
- package/lib/typescript/reanimated/ReanimatedTransitionProgressContext.d.ts +2 -1
- package/lib/typescript/reanimated/ReanimatedTransitionProgressContext.d.ts.map +1 -0
- package/lib/typescript/reanimated/index.d.ts +1 -0
- package/lib/typescript/reanimated/index.d.ts.map +1 -0
- package/lib/typescript/reanimated/useReanimatedHeaderHeight.d.ts +2 -3
- package/lib/typescript/reanimated/useReanimatedHeaderHeight.d.ts.map +1 -0
- package/lib/typescript/reanimated/useReanimatedTransitionProgress.d.ts +4 -9
- package/lib/typescript/reanimated/useReanimatedTransitionProgress.d.ts.map +1 -0
- package/lib/typescript/types.d.ts +187 -37
- package/lib/typescript/types.d.ts.map +1 -0
- package/lib/typescript/useTransitionProgress.d.ts +4 -3
- package/lib/typescript/useTransitionProgress.d.ts.map +1 -0
- package/lib/typescript/utils.d.ts +27 -1
- package/lib/typescript/utils.d.ts.map +1 -0
- package/native-stack/README.md +156 -108
- package/native-stack/package.json +4 -4
- package/oss-attribution/attribution.txt +77 -0
- package/oss-attribution/licenseInfos.json +27 -0
- package/package.json +196 -1
- package/react-native.config.js +19 -16
- package/reanimated/package.json +1 -1
- package/src/TransitionProgressContext.tsx +3 -1
- package/src/components/DebugContainer.tsx +46 -0
- package/src/components/DebugContainer.web.tsx +7 -0
- package/src/components/FullWindowOverlay.tsx +33 -0
- package/src/components/FullWindowOverlay.web.tsx +6 -0
- package/src/components/Screen.tsx +392 -0
- package/src/components/Screen.web.tsx +47 -0
- package/src/components/ScreenContainer.tsx +28 -0
- package/src/components/ScreenContainer.web.tsx +5 -0
- package/src/components/ScreenContentWrapper.tsx +9 -0
- package/src/components/ScreenContentWrapper.web.tsx +5 -0
- package/src/components/ScreenFooter.tsx +20 -0
- package/src/components/ScreenFooter.web.tsx +7 -0
- package/src/components/ScreenStack.tsx +112 -0
- package/src/components/ScreenStack.web.tsx +5 -0
- package/src/components/ScreenStackHeaderConfig.tsx +127 -0
- package/src/components/ScreenStackHeaderConfig.web.tsx +45 -0
- package/src/components/ScreenStackItem.tsx +174 -0
- package/src/components/SearchBar.tsx +105 -0
- package/src/components/SearchBar.web.tsx +5 -0
- package/src/components/helpers/DelayedFreeze.tsx +27 -0
- package/src/components/helpers/usePrevious.tsx +12 -0
- package/src/contexts.tsx +9 -0
- package/src/core.ts +45 -0
- package/src/fabric/FullWindowOverlayNativeComponent.ts +16 -0
- package/src/fabric/ModalScreenNativeComponent.ts +115 -0
- package/src/fabric/NativeScreensModule.ts +8 -0
- package/src/fabric/NativeScreensModule.web.ts +1 -0
- package/src/fabric/ScreenContainerNativeComponent.ts +3 -3
- package/src/fabric/ScreenContentWrapperNativeComponent.ts +14 -0
- package/src/fabric/ScreenFooterNativeComponent.ts +6 -0
- package/src/fabric/ScreenNativeComponent.ts +34 -23
- package/src/fabric/ScreenNavigationContainerNativeComponent.ts +3 -1
- package/src/fabric/ScreenStackHeaderConfigNativeComponent.ts +38 -2
- package/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts +5 -1
- package/src/fabric/ScreenStackNativeComponent.ts +3 -2
- package/src/fabric/SearchBarNativeComponent.ts +17 -13
- package/src/gesture-handler/GestureDetectorProvider.tsx +16 -0
- package/src/gesture-handler/RNScreensTurboModule.ts +13 -0
- package/src/gesture-handler/ScreenGestureDetector.tsx +241 -0
- package/src/gesture-handler/constraints.ts +87 -0
- package/src/gesture-handler/defaults.ts +46 -0
- package/src/gesture-handler/fabricUtils.ts +86 -0
- package/src/gesture-handler/fabricUtils.web.ts +10 -0
- package/src/gesture-handler/index.tsx +4 -0
- package/src/index.tsx +49 -113
- package/src/native-stack/contexts/GHContext.tsx +9 -0
- package/src/native-stack/navigators/createNativeStackNavigator.tsx +6 -3
- package/src/native-stack/types.tsx +204 -31
- package/src/native-stack/utils/getDefaultHeaderHeight.tsx +2 -2
- package/src/native-stack/utils/getStatusBarHeight.tsx +22 -0
- package/src/native-stack/utils/useAnimatedHeaderHeight.tsx +1 -1
- package/src/native-stack/utils/useBackPressSubscription.tsx +3 -2
- package/src/native-stack/utils/useHeaderHeight.tsx +1 -1
- package/src/native-stack/views/FontProcessor.tsx +2 -2
- package/src/native-stack/views/FooterComponent.tsx +10 -0
- package/src/native-stack/views/HeaderConfig.tsx +22 -6
- package/src/native-stack/views/NativeStackView.tsx +141 -54
- package/src/reanimated/ReanimatedHeaderHeightContext.tsx +1 -1
- package/src/reanimated/ReanimatedNativeStackScreen.tsx +15 -13
- package/src/reanimated/ReanimatedScreen.tsx +4 -3
- package/src/reanimated/ReanimatedScreenProvider.tsx +3 -2
- package/src/reanimated/useReanimatedHeaderHeight.tsx +2 -2
- package/src/reanimated/useReanimatedTransitionProgress.tsx +1 -1
- package/src/types.tsx +213 -41
- package/src/useTransitionProgress.tsx +1 -1
- package/src/utils.ts +27 -5
- package/windows/README.md +4 -1
- package/windows/RNScreens/Screen.h +3 -1
- package/SystemBundles/3d72c1ccdc1866604203e2067a94f7ab2c45408da644bb242aa980ffea58a74d.bundle +0 -33190
- package/SystemBundles/3d72c1ccdc1866604203e2067a94f7ab2c45408da644bb242aa980ffea58a74d.map +0 -10181
- package/SystemModules/amzn__react-native-screens.modules.txt +0 -101
- package/SystemModules/amzn__react-native-screens.private.modules.txt +0 -243
- package/lib/commonjs/index.native.js +0 -409
- package/lib/commonjs/index.native.js.map +0 -1
- package/lib/module/index.native.js +0 -412
- package/lib/module/index.native.js.map +0 -1
- package/lib/typescript/index.native.d.ts +0 -2
- package/src/index.native.tsx +0 -601
package/ios/RNSScreen.mm
CHANGED
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
#import "RNSScreen.h"
|
|
4
4
|
#import "RNSScreenContainer.h"
|
|
5
|
+
#import "RNSScreenContentWrapper.h"
|
|
5
6
|
#import "RNSScreenWindowTraits.h"
|
|
6
7
|
|
|
7
8
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
8
9
|
#import <React/RCTConversions.h>
|
|
9
10
|
#import <React/RCTFabricComponentsPlugins.h>
|
|
10
11
|
#import <React/RCTRootComponentView.h>
|
|
12
|
+
#import <React/RCTScrollViewComponentView.h>
|
|
11
13
|
#import <React/RCTSurfaceTouchHandler.h>
|
|
12
14
|
#import <react/renderer/components/rnscreens/EventEmitters.h>
|
|
13
15
|
#import <react/renderer/components/rnscreens/Props.h>
|
|
@@ -17,52 +19,82 @@
|
|
|
17
19
|
#import "RNSHeaderHeightChangeEvent.h"
|
|
18
20
|
#import "RNSScreenViewEvent.h"
|
|
19
21
|
#else
|
|
22
|
+
#import <React/RCTScrollView.h>
|
|
20
23
|
#import <React/RCTTouchHandler.h>
|
|
21
|
-
#endif
|
|
24
|
+
#endif // RCT_NEW_ARCH_ENABLED
|
|
22
25
|
|
|
23
26
|
#import <React/RCTShadowView.h>
|
|
24
27
|
#import <React/RCTUIManager.h>
|
|
28
|
+
#import <React/RCTUIManagerUtils.h>
|
|
29
|
+
|
|
30
|
+
#import "RNSScreenFooter.h"
|
|
25
31
|
#import "RNSScreenStack.h"
|
|
26
32
|
#import "RNSScreenStackHeaderConfig.h"
|
|
27
33
|
|
|
34
|
+
#import "RNSDefines.h"
|
|
35
|
+
#import "UIView+RNSUtility.h"
|
|
36
|
+
|
|
28
37
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
29
38
|
namespace react = facebook::react;
|
|
39
|
+
#define ReactScrollViewBase RCTScrollViewComponentView
|
|
40
|
+
#else
|
|
41
|
+
#define ReactScrollViewBase RCTScrollView
|
|
30
42
|
#endif // RCT_NEW_ARCH_ENABLED
|
|
31
43
|
|
|
32
|
-
|
|
44
|
+
constexpr NSInteger SHEET_FIT_TO_CONTENTS = -1;
|
|
45
|
+
constexpr NSInteger SHEET_LARGEST_UNDIMMED_DETENT_NONE = -1;
|
|
46
|
+
|
|
47
|
+
@interface RNSScreenView () <
|
|
48
|
+
UIAdaptivePresentationControllerDelegate,
|
|
49
|
+
RNSScreenContentWrapperDelegate,
|
|
50
|
+
#if !TARGET_OS_TV
|
|
51
|
+
UISheetPresentationControllerDelegate,
|
|
52
|
+
#endif
|
|
33
53
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
34
|
-
|
|
54
|
+
RCTRNSScreenViewProtocol,
|
|
55
|
+
CAAnimationDelegate>
|
|
35
56
|
#else
|
|
36
|
-
|
|
57
|
+
RCTInvalidating>
|
|
37
58
|
#endif
|
|
59
|
+
|
|
38
60
|
@end
|
|
39
61
|
|
|
40
62
|
@implementation RNSScreenView {
|
|
41
|
-
__weak
|
|
63
|
+
__weak ReactScrollViewBase *_sheetsScrollView;
|
|
64
|
+
BOOL _didSetSheetAllowedDetentsOnController;
|
|
42
65
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
43
66
|
RCTSurfaceTouchHandler *_touchHandler;
|
|
44
67
|
react::RNSScreenShadowNode::ConcreteState::Shared _state;
|
|
45
68
|
// on fabric, they are not available by default so we need them exposed here too
|
|
46
69
|
NSMutableArray<UIView *> *_reactSubviews;
|
|
70
|
+
__weak RNSScreenContentWrapper *_contentWrapper;
|
|
47
71
|
#else
|
|
72
|
+
__weak RCTBridge *_bridge;
|
|
48
73
|
RCTTouchHandler *_touchHandler;
|
|
49
74
|
CGRect _reactFrame;
|
|
50
75
|
#endif
|
|
51
76
|
}
|
|
52
77
|
|
|
53
78
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
79
|
+
|
|
80
|
+
// Needed because of this: https://github.com/facebook/react-native/pull/37274
|
|
81
|
+
+ (void)load
|
|
82
|
+
{
|
|
83
|
+
[super load];
|
|
84
|
+
}
|
|
85
|
+
|
|
54
86
|
- (instancetype)initWithFrame:(CGRect)frame
|
|
55
87
|
{
|
|
56
88
|
if (self = [super initWithFrame:frame]) {
|
|
57
89
|
static const auto defaultProps = std::make_shared<const react::RNSScreenProps>();
|
|
58
90
|
_props = defaultProps;
|
|
59
91
|
_reactSubviews = [NSMutableArray new];
|
|
92
|
+
_contentWrapper = nil;
|
|
60
93
|
[self initCommonProps];
|
|
61
94
|
}
|
|
62
95
|
return self;
|
|
63
96
|
}
|
|
64
|
-
#
|
|
65
|
-
|
|
97
|
+
#else
|
|
66
98
|
- (instancetype)initWithBridge:(RCTBridge *)bridge
|
|
67
99
|
{
|
|
68
100
|
if (self = [super init]) {
|
|
@@ -72,6 +104,7 @@ namespace react = facebook::react;
|
|
|
72
104
|
|
|
73
105
|
return self;
|
|
74
106
|
}
|
|
107
|
+
#endif // RCT_NEW_ARCH_ENABLED
|
|
75
108
|
|
|
76
109
|
- (void)initCommonProps
|
|
77
110
|
{
|
|
@@ -86,9 +119,16 @@ namespace react = facebook::react;
|
|
|
86
119
|
_hasStatusBarHiddenSet = NO;
|
|
87
120
|
_hasOrientationSet = NO;
|
|
88
121
|
_hasHomeIndicatorHiddenSet = NO;
|
|
122
|
+
_activityState = RNSActivityStateUndefined;
|
|
123
|
+
_fullScreenSwipeShadowEnabled = YES;
|
|
89
124
|
#if !TARGET_OS_TV
|
|
90
125
|
_sheetExpandsWhenScrolledToEdge = YES;
|
|
91
126
|
#endif // !TARGET_OS_TV
|
|
127
|
+
_sheetsScrollView = nil;
|
|
128
|
+
_didSetSheetAllowedDetentsOnController = NO;
|
|
129
|
+
#ifdef RCT_NEW_ARCH_ENABLED
|
|
130
|
+
_markedForUnmountInCurrentTransaction = NO;
|
|
131
|
+
#endif // RCT_NEW_ARCH_ENABLED
|
|
92
132
|
}
|
|
93
133
|
|
|
94
134
|
- (UIViewController *)reactViewController
|
|
@@ -97,24 +137,73 @@ namespace react = facebook::react;
|
|
|
97
137
|
}
|
|
98
138
|
|
|
99
139
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
140
|
+
RNS_IGNORE_SUPER_CALL_BEGIN
|
|
100
141
|
- (NSArray<UIView *> *)reactSubviews
|
|
101
142
|
{
|
|
102
143
|
return _reactSubviews;
|
|
103
144
|
}
|
|
145
|
+
RNS_IGNORE_SUPER_CALL_END
|
|
104
146
|
#endif
|
|
105
147
|
|
|
106
148
|
- (void)updateBounds
|
|
107
149
|
{
|
|
108
150
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
109
151
|
if (_state != nullptr) {
|
|
110
|
-
|
|
152
|
+
RNSScreenStackHeaderConfig *config = [self findHeaderConfig];
|
|
153
|
+
// in large title, ScrollView handles the offset of content so we cannot set it here also.
|
|
154
|
+
CGFloat headerHeight =
|
|
155
|
+
config.largeTitle ? 0 : [_controller calculateHeaderHeightIsModal:self.isPresentedAsNativeModal];
|
|
156
|
+
auto newState =
|
|
157
|
+
react::RNSScreenState{RCTSizeFromCGSize(self.bounds.size), RCTPointFromCGPoint(CGPointMake(0, headerHeight))};
|
|
111
158
|
_state->updateState(std::move(newState));
|
|
112
159
|
UINavigationController *navctr = _controller.navigationController;
|
|
113
160
|
[navctr.view setNeedsLayout];
|
|
114
161
|
}
|
|
115
162
|
#else
|
|
116
163
|
[_bridge.uiManager setSize:self.bounds.size forView:self];
|
|
117
|
-
#endif
|
|
164
|
+
#endif // RCT_NEW_ARCH_ENABLED
|
|
165
|
+
|
|
166
|
+
if (_stackPresentation != RNSScreenStackPresentationFormSheet) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// In case of formSheet stack presentation, to mitigate view flickering
|
|
171
|
+
// (see PR with description of this problem: https://github.com/software-mansion/react-native-screens/pull/1870)
|
|
172
|
+
// we do not set `bottom: 0` in JS for wrapper of the screen content, causing React to not set
|
|
173
|
+
// strict frame every time the sheet size is updated by the code above. This approach leads however to
|
|
174
|
+
// situation where (if present) scrollview does not know its view port size resulting in buggy behaviour.
|
|
175
|
+
// That's exactly the issue we are handling below. We look for a scroll view down the view hierarchy (only going
|
|
176
|
+
// through first subviews, as the OS does something similar e.g. when looking for scrollview for large header
|
|
177
|
+
// interaction) and we set its frame to the sheet size. **This is not perfect**, as the content might jump when items
|
|
178
|
+
// are added/removed to/from the scroll view, but it's the best we got rn. See
|
|
179
|
+
// https://github.com/software-mansion/react-native-screens/pull/1852
|
|
180
|
+
|
|
181
|
+
// TODO: Consider adding a prop to control whether we want to look for a scroll view here.
|
|
182
|
+
// It might be necessary in case someone doesn't want its scroll view to span over whole
|
|
183
|
+
// height of the sheet.
|
|
184
|
+
ReactScrollViewBase *scrollView = [self findDirectLineDescendantReactScrollView];
|
|
185
|
+
if (_sheetsScrollView != scrollView) {
|
|
186
|
+
[_sheetsScrollView removeObserver:self forKeyPath:@"bounds" context:nil];
|
|
187
|
+
_sheetsScrollView = scrollView;
|
|
188
|
+
|
|
189
|
+
// We pass 0 as options, as we are not interested in receiving updated bounds value,
|
|
190
|
+
// we are going to overwrite it anyway.
|
|
191
|
+
[scrollView addObserver:self forKeyPath:@"bounds" options:0 context:nil];
|
|
192
|
+
}
|
|
193
|
+
if (scrollView != nil) {
|
|
194
|
+
[scrollView setFrame:self.frame];
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
- (void)observeValueForKeyPath:(NSString *)keyPath
|
|
199
|
+
ofObject:(id)object
|
|
200
|
+
change:(NSDictionary<NSKeyValueChangeKey, id> *)change
|
|
201
|
+
context:(void *)context
|
|
202
|
+
{
|
|
203
|
+
UIView *scrollview = (UIView *)object;
|
|
204
|
+
if (!CGRectEqualToRect(scrollview.frame, self.frame)) {
|
|
205
|
+
[scrollview setFrame:self.frame];
|
|
206
|
+
}
|
|
118
207
|
}
|
|
119
208
|
|
|
120
209
|
- (void)setStackPresentation:(RNSScreenStackPresentation)stackPresentation
|
|
@@ -166,12 +255,10 @@ namespace react = facebook::react;
|
|
|
166
255
|
_controller.presentationController.delegate = self;
|
|
167
256
|
} else if (_stackPresentation != RNSScreenStackPresentationPush) {
|
|
168
257
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
169
|
-
// TODO: on Fabric, same controllers can be used as modals and then recycled and used a push which would result in
|
|
170
|
-
// this error. It would be good to check if it doesn't leak in such case.
|
|
171
258
|
#else
|
|
172
259
|
RCTLogError(
|
|
173
260
|
@"Screen presentation updated from modal to push, this may likely result in a screen object leakage. If you need to change presentation style create a new screen object instead");
|
|
174
|
-
#endif
|
|
261
|
+
#endif // RCT_NEW_ARCH_ENABLED
|
|
175
262
|
}
|
|
176
263
|
_stackPresentation = stackPresentation;
|
|
177
264
|
}
|
|
@@ -194,6 +281,7 @@ namespace react = facebook::react;
|
|
|
194
281
|
case RNSScreenStackAnimationSimplePush:
|
|
195
282
|
case RNSScreenStackAnimationSlideFromBottom:
|
|
196
283
|
case RNSScreenStackAnimationFadeFromBottom:
|
|
284
|
+
case RNSScreenStackAnimationSlideFromLeft:
|
|
197
285
|
// Default
|
|
198
286
|
break;
|
|
199
287
|
}
|
|
@@ -224,12 +312,26 @@ namespace react = facebook::react;
|
|
|
224
312
|
{
|
|
225
313
|
int activityState = [activityStateOrNil intValue];
|
|
226
314
|
if (activityStateOrNil != nil && activityState != -1 && activityState != _activityState) {
|
|
315
|
+
[self maybeAssertActivityStateProgressionOldValue:_activityState newValue:activityState];
|
|
227
316
|
_activityState = activityState;
|
|
228
317
|
[_reactSuperview markChildUpdated];
|
|
229
318
|
}
|
|
230
319
|
}
|
|
231
320
|
|
|
232
|
-
|
|
321
|
+
- (void)maybeAssertActivityStateProgressionOldValue:(int)oldValue newValue:(int)newValue
|
|
322
|
+
{
|
|
323
|
+
if (self.isNativeStackScreen && newValue < oldValue) {
|
|
324
|
+
RCTLogError(@"[RNScreens] activityState can only progress in NativeStack");
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/// Note that this method works only after the screen is actually mounted under a screen stack view.
|
|
329
|
+
- (BOOL)isNativeStackScreen
|
|
330
|
+
{
|
|
331
|
+
return [_reactSuperview isKindOfClass:RNSScreenStackView.class];
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
#if !TARGET_OS_TV && !TARGET_OS_VISION
|
|
233
335
|
- (void)setStatusBarStyle:(RNSStatusBarStyle)statusBarStyle
|
|
234
336
|
{
|
|
235
337
|
_hasStatusBarStyleSet = YES;
|
|
@@ -251,6 +353,13 @@ namespace react = facebook::react;
|
|
|
251
353
|
_statusBarHidden = statusBarHidden;
|
|
252
354
|
[RNSScreenWindowTraits assertViewControllerBasedStatusBarAppearenceSet];
|
|
253
355
|
[RNSScreenWindowTraits updateStatusBarAppearance];
|
|
356
|
+
|
|
357
|
+
// As the status bar could change its visibility, we need to calculate header
|
|
358
|
+
// height for the correct value in `onHeaderHeightChange` event when navigation
|
|
359
|
+
// bar is not visible.
|
|
360
|
+
if (self.controller.navigationController.navigationBarHidden && !self.isModal) {
|
|
361
|
+
[self.controller calculateAndNotifyHeaderHeightChangeIsModal:NO];
|
|
362
|
+
}
|
|
254
363
|
}
|
|
255
364
|
|
|
256
365
|
- (void)setScreenOrientation:(UIInterfaceOrientationMask)screenOrientation
|
|
@@ -268,13 +377,48 @@ namespace react = facebook::react;
|
|
|
268
377
|
}
|
|
269
378
|
#endif
|
|
270
379
|
|
|
380
|
+
RNS_IGNORE_SUPER_CALL_BEGIN
|
|
271
381
|
- (UIView *)reactSuperview
|
|
272
382
|
{
|
|
273
383
|
return _reactSuperview;
|
|
274
384
|
}
|
|
385
|
+
RNS_IGNORE_SUPER_CALL_END
|
|
386
|
+
|
|
387
|
+
/// This is RNSScreenContentWrapperDelegate method, where we do get notified when React did update frame of our child.
|
|
388
|
+
- (void)reactDidSetFrame:(CGRect)reactFrame forContentWrapper:(RNSScreenContentWrapper *)contentWrapepr
|
|
389
|
+
{
|
|
390
|
+
if (self.stackPresentation != RNSScreenStackPresentationFormSheet || _didSetSheetAllowedDetentsOnController == YES) {
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
_didSetSheetAllowedDetentsOnController = YES;
|
|
395
|
+
|
|
396
|
+
#if !TARGET_OS_TV && !TARGET_OS_VISION && defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_16_0) && \
|
|
397
|
+
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_0
|
|
398
|
+
if (@available(iOS 16.0, *)) {
|
|
399
|
+
UISheetPresentationController *sheetController = _controller.sheetPresentationController;
|
|
400
|
+
if (sheetController == nil) {
|
|
401
|
+
RCTLogError(@"[RNScreens] sheetPresentationController is null when attempting to set allowed detents");
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
if (_sheetAllowedDetents.count > 0 && _sheetAllowedDetents[0].intValue == SHEET_FIT_TO_CONTENTS) {
|
|
406
|
+
auto detents = [self detentsFromMaxHeights:@[ [NSNumber numberWithFloat:reactFrame.size.height] ]];
|
|
407
|
+
[self setAllowedDetentsForSheet:sheetController to:detents animate:YES];
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
#endif // Check for iOS >= 16 && !TARGET_OS_TV
|
|
411
|
+
}
|
|
275
412
|
|
|
276
413
|
- (void)addSubview:(UIView *)view
|
|
277
414
|
{
|
|
415
|
+
/// This system method is called on Paper only. Fabric uses `-[insertSubview:atIndex:]`.
|
|
416
|
+
if ([view isKindOfClass:RNSScreenContentWrapper.class] &&
|
|
417
|
+
self.stackPresentation == RNSScreenStackPresentationFormSheet) {
|
|
418
|
+
auto contentWrapper = (RNSScreenContentWrapper *)view;
|
|
419
|
+
contentWrapper.delegate = self;
|
|
420
|
+
}
|
|
421
|
+
|
|
278
422
|
if (![view isKindOfClass:[RNSScreenStackHeaderConfig class]]) {
|
|
279
423
|
[super addSubview:view];
|
|
280
424
|
} else {
|
|
@@ -286,7 +430,6 @@ namespace react = facebook::react;
|
|
|
286
430
|
{
|
|
287
431
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
288
432
|
// If screen is already unmounted then there will be no event emitter
|
|
289
|
-
// it will be cleaned in prepareForRecycle
|
|
290
433
|
if (_eventEmitter != nullptr) {
|
|
291
434
|
std::dynamic_pointer_cast<const react::RNSScreenEventEmitter>(_eventEmitter)
|
|
292
435
|
->onDismissed(react::RNSScreenEventEmitter::OnDismissed{.dismissCount = dismissCount});
|
|
@@ -308,7 +451,6 @@ namespace react = facebook::react;
|
|
|
308
451
|
{
|
|
309
452
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
310
453
|
// If screen is already unmounted then there will be no event emitter
|
|
311
|
-
// it will be cleaned in prepareForRecycle
|
|
312
454
|
if (_eventEmitter != nullptr) {
|
|
313
455
|
std::dynamic_pointer_cast<const react::RNSScreenEventEmitter>(_eventEmitter)
|
|
314
456
|
->onNativeDismissCancelled(
|
|
@@ -325,7 +467,6 @@ namespace react = facebook::react;
|
|
|
325
467
|
{
|
|
326
468
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
327
469
|
// If screen is already unmounted then there will be no event emitter
|
|
328
|
-
// it will be cleaned in prepareForRecycle
|
|
329
470
|
if (_eventEmitter != nullptr) {
|
|
330
471
|
std::dynamic_pointer_cast<const react::RNSScreenEventEmitter>(_eventEmitter)
|
|
331
472
|
->onWillAppear(react::RNSScreenEventEmitter::OnWillAppear{});
|
|
@@ -348,7 +489,6 @@ namespace react = facebook::react;
|
|
|
348
489
|
}
|
|
349
490
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
350
491
|
// If screen is already unmounted then there will be no event emitter
|
|
351
|
-
// it will be cleaned in prepareForRecycle
|
|
352
492
|
if (_eventEmitter != nullptr) {
|
|
353
493
|
std::dynamic_pointer_cast<const react::RNSScreenEventEmitter>(_eventEmitter)
|
|
354
494
|
->onWillDisappear(react::RNSScreenEventEmitter::OnWillDisappear{});
|
|
@@ -364,7 +504,6 @@ namespace react = facebook::react;
|
|
|
364
504
|
{
|
|
365
505
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
366
506
|
// If screen is already unmounted then there will be no event emitter
|
|
367
|
-
// it will be cleaned in prepareForRecycle
|
|
368
507
|
if (_eventEmitter != nullptr) {
|
|
369
508
|
std::dynamic_pointer_cast<const react::RNSScreenEventEmitter>(_eventEmitter)
|
|
370
509
|
->onAppear(react::RNSScreenEventEmitter::OnAppear{});
|
|
@@ -384,7 +523,6 @@ namespace react = facebook::react;
|
|
|
384
523
|
{
|
|
385
524
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
386
525
|
// If screen is already unmounted then there will be no event emitter
|
|
387
|
-
// it will be cleaned in prepareForRecycle
|
|
388
526
|
if (_eventEmitter != nullptr) {
|
|
389
527
|
std::dynamic_pointer_cast<const react::RNSScreenEventEmitter>(_eventEmitter)
|
|
390
528
|
->onDisappear(react::RNSScreenEventEmitter::OnDisappear{});
|
|
@@ -396,20 +534,38 @@ namespace react = facebook::react;
|
|
|
396
534
|
#endif
|
|
397
535
|
}
|
|
398
536
|
|
|
537
|
+
- (void)notifySheetDetentChangeToIndex:(NSInteger)newDetentIndex isStable:(BOOL)isStable
|
|
538
|
+
{
|
|
539
|
+
#ifdef RCT_NEW_ARCH_ENABLED
|
|
540
|
+
if (_eventEmitter != nullptr) {
|
|
541
|
+
int index = newDetentIndex;
|
|
542
|
+
std::dynamic_pointer_cast<const react::RNSScreenEventEmitter>(_eventEmitter)
|
|
543
|
+
->onSheetDetentChanged(
|
|
544
|
+
react::RNSScreenEventEmitter::OnSheetDetentChanged{.index = index, .isStable = isStable});
|
|
545
|
+
}
|
|
546
|
+
#else
|
|
547
|
+
if (self.onSheetDetentChanged) {
|
|
548
|
+
self.onSheetDetentChanged(@{
|
|
549
|
+
@"index" : @(newDetentIndex),
|
|
550
|
+
@"isStable" : @(YES),
|
|
551
|
+
});
|
|
552
|
+
}
|
|
553
|
+
#endif
|
|
554
|
+
}
|
|
555
|
+
|
|
399
556
|
- (void)notifyHeaderHeightChange:(double)headerHeight
|
|
400
557
|
{
|
|
401
558
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
402
559
|
if (_eventEmitter != nullptr) {
|
|
403
|
-
std::dynamic_pointer_cast<const
|
|
404
|
-
->onHeaderHeightChange(
|
|
405
|
-
facebook::react::RNSScreenEventEmitter::OnHeaderHeightChange{.headerHeight = headerHeight});
|
|
560
|
+
std::dynamic_pointer_cast<const react::RNSScreenEventEmitter>(_eventEmitter)
|
|
561
|
+
->onHeaderHeightChange(react::RNSScreenEventEmitter::OnHeaderHeightChange{.headerHeight = headerHeight});
|
|
406
562
|
}
|
|
407
563
|
|
|
408
564
|
RNSHeaderHeightChangeEvent *event =
|
|
409
565
|
[[RNSHeaderHeightChangeEvent alloc] initWithEventName:@"onHeaderHeightChange"
|
|
410
566
|
reactTag:[NSNumber numberWithInt:self.tag]
|
|
411
567
|
headerHeight:headerHeight];
|
|
412
|
-
[
|
|
568
|
+
[self postNotificationForEventDispatcherObserversWithEvent:event];
|
|
413
569
|
#else
|
|
414
570
|
if (self.onHeaderHeightChange) {
|
|
415
571
|
self.onHeaderHeightChange(@{
|
|
@@ -468,22 +624,13 @@ namespace react = facebook::react;
|
|
|
468
624
|
}
|
|
469
625
|
}
|
|
470
626
|
|
|
471
|
-
|
|
472
|
-
- (RCTSurfaceTouchHandler *)touchHandler
|
|
473
|
-
#else
|
|
474
|
-
- (RCTTouchHandler *)touchHandler
|
|
475
|
-
#endif
|
|
627
|
+
- (nullable RNS_TOUCH_HANDLER_ARCH_TYPE *)touchHandler
|
|
476
628
|
{
|
|
477
629
|
if (_touchHandler != nil) {
|
|
478
630
|
return _touchHandler;
|
|
479
631
|
}
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
parent = parent.superview;
|
|
483
|
-
if (parent != nil) {
|
|
484
|
-
return [parent performSelector:@selector(touchHandler)];
|
|
485
|
-
}
|
|
486
|
-
return nil;
|
|
632
|
+
|
|
633
|
+
return [self rnscreens_findTouchHandlerInAncestorChain];
|
|
487
634
|
}
|
|
488
635
|
|
|
489
636
|
- (void)notifyFinishTransitioning
|
|
@@ -504,7 +651,7 @@ namespace react = facebook::react;
|
|
|
504
651
|
progress:progress
|
|
505
652
|
closing:closing
|
|
506
653
|
goingForward:goingForward];
|
|
507
|
-
[
|
|
654
|
+
[self postNotificationForEventDispatcherObserversWithEvent:event];
|
|
508
655
|
#else
|
|
509
656
|
if (self.onTransitionProgress) {
|
|
510
657
|
self.onTransitionProgress(@{
|
|
@@ -540,12 +687,24 @@ namespace react = facebook::react;
|
|
|
540
687
|
- (BOOL)presentationControllerShouldDismiss:(UIPresentationController *)presentationController
|
|
541
688
|
{
|
|
542
689
|
if (_preventNativeDismiss) {
|
|
543
|
-
[self notifyDismissCancelledWithDismissCount:1];
|
|
544
690
|
return NO;
|
|
545
691
|
}
|
|
546
692
|
return _gestureEnabled;
|
|
547
693
|
}
|
|
548
694
|
|
|
695
|
+
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \
|
|
696
|
+
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
|
|
697
|
+
- (void)presentationControllerDidAttemptToDismiss:(UIPresentationController *)presentationController
|
|
698
|
+
{
|
|
699
|
+
// NOTE(kkafar): We should consider depracating the use of gesture cancel here & align
|
|
700
|
+
// with usePreventRemove API of react-navigation v7.
|
|
701
|
+
[self notifyGestureCancel];
|
|
702
|
+
if (_preventNativeDismiss) {
|
|
703
|
+
[self notifyDismissCancelledWithDismissCount:1];
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
#endif
|
|
707
|
+
|
|
549
708
|
- (void)presentationControllerDidDismiss:(UIPresentationController *)presentationController
|
|
550
709
|
{
|
|
551
710
|
if ([_reactSuperview respondsToSelector:@selector(presentationControllerDidDismiss:)]) {
|
|
@@ -553,13 +712,32 @@ namespace react = facebook::react;
|
|
|
553
712
|
}
|
|
554
713
|
}
|
|
555
714
|
|
|
556
|
-
- (RNSScreenStackHeaderConfig *
|
|
715
|
+
- (nullable RNSScreenStackHeaderConfig *)findHeaderConfig
|
|
557
716
|
{
|
|
717
|
+
// Fast path
|
|
718
|
+
if ([self.reactSubviews.lastObject isKindOfClass:RNSScreenStackHeaderConfig.class]) {
|
|
719
|
+
return (RNSScreenStackHeaderConfig *)self.reactSubviews.lastObject;
|
|
720
|
+
}
|
|
721
|
+
|
|
558
722
|
for (UIView *view in self.reactSubviews) {
|
|
559
723
|
if ([view isKindOfClass:RNSScreenStackHeaderConfig.class]) {
|
|
560
724
|
return (RNSScreenStackHeaderConfig *)view;
|
|
561
725
|
}
|
|
562
726
|
}
|
|
727
|
+
|
|
728
|
+
return nil;
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
/// Looks for RCTScrollView in direct line - goes through the subviews at index 0 down the view hierarchy.
|
|
732
|
+
- (nullable ReactScrollViewBase *)findDirectLineDescendantReactScrollView
|
|
733
|
+
{
|
|
734
|
+
UIView *firstSubview = self;
|
|
735
|
+
while (firstSubview.subviews.count > 0) {
|
|
736
|
+
firstSubview = firstSubview.subviews[0];
|
|
737
|
+
if ([firstSubview isKindOfClass:ReactScrollViewBase.class]) {
|
|
738
|
+
return (ReactScrollViewBase *)firstSubview;
|
|
739
|
+
}
|
|
740
|
+
}
|
|
563
741
|
return nil;
|
|
564
742
|
}
|
|
565
743
|
|
|
@@ -591,75 +769,361 @@ namespace react = facebook::react;
|
|
|
591
769
|
self.controller.modalPresentationStyle == UIModalPresentationOverCurrentContext;
|
|
592
770
|
}
|
|
593
771
|
|
|
594
|
-
|
|
772
|
+
- (void)invalidate
|
|
773
|
+
{
|
|
774
|
+
_controller = nil;
|
|
775
|
+
[_sheetsScrollView removeObserver:self forKeyPath:@"bounds" context:nil];
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
#if !TARGET_OS_TV && !TARGET_OS_VISION
|
|
779
|
+
|
|
780
|
+
- (void)setPropertyForSheet:(UISheetPresentationController *)sheet
|
|
781
|
+
withBlock:(void (^)(void))block
|
|
782
|
+
animate:(BOOL)animate API_AVAILABLE(ios(15.0))
|
|
783
|
+
{
|
|
784
|
+
if (animate) {
|
|
785
|
+
[sheet animateChanges:block];
|
|
786
|
+
} else {
|
|
787
|
+
block();
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
- (void)setAllowedDetentsForSheet:(UISheetPresentationController *)sheet
|
|
792
|
+
to:(NSArray<UISheetPresentationControllerDetent *> *)detents
|
|
793
|
+
animate:(BOOL)animate API_AVAILABLE(ios(15.0))
|
|
794
|
+
{
|
|
795
|
+
[self setPropertyForSheet:sheet
|
|
796
|
+
withBlock:^{
|
|
797
|
+
sheet.detents = detents;
|
|
798
|
+
}
|
|
799
|
+
animate:animate];
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
- (void)setSelectedDetentForSheet:(UISheetPresentationController *)sheet
|
|
803
|
+
to:(UISheetPresentationControllerDetentIdentifier)detent
|
|
804
|
+
animate:(BOOL)animate API_AVAILABLE(ios(15.0))
|
|
805
|
+
{
|
|
806
|
+
if (sheet.selectedDetentIdentifier != detent) {
|
|
807
|
+
[self setPropertyForSheet:sheet
|
|
808
|
+
withBlock:^{
|
|
809
|
+
sheet.selectedDetentIdentifier = detent;
|
|
810
|
+
}
|
|
811
|
+
animate:animate];
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
- (void)setCornerRadiusForSheet:(UISheetPresentationController *)sheet
|
|
816
|
+
to:(CGFloat)radius
|
|
817
|
+
animate:(BOOL)animate API_AVAILABLE(ios(15.0))
|
|
818
|
+
{
|
|
819
|
+
if (sheet.preferredCornerRadius != radius) {
|
|
820
|
+
[self setPropertyForSheet:sheet
|
|
821
|
+
withBlock:^{
|
|
822
|
+
sheet.preferredCornerRadius =
|
|
823
|
+
radius < 0 ? UISheetPresentationControllerAutomaticDimension : radius;
|
|
824
|
+
}
|
|
825
|
+
animate:animate];
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
- (void)setGrabberVisibleForSheet:(UISheetPresentationController *)sheet
|
|
830
|
+
to:(BOOL)visible
|
|
831
|
+
animate:(BOOL)animate API_AVAILABLE(ios(15.0))
|
|
832
|
+
{
|
|
833
|
+
if (sheet.prefersGrabberVisible != visible) {
|
|
834
|
+
[self setPropertyForSheet:sheet
|
|
835
|
+
withBlock:^{
|
|
836
|
+
sheet.prefersGrabberVisible = visible;
|
|
837
|
+
}
|
|
838
|
+
animate:animate];
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
- (void)setLargestUndimmedDetentForSheet:(UISheetPresentationController *)sheet
|
|
843
|
+
to:(UISheetPresentationControllerDetentIdentifier)detent
|
|
844
|
+
animate:(BOOL)animate API_AVAILABLE(ios(15.0))
|
|
845
|
+
{
|
|
846
|
+
if (sheet.largestUndimmedDetentIdentifier != detent) {
|
|
847
|
+
[self setPropertyForSheet:sheet
|
|
848
|
+
withBlock:^{
|
|
849
|
+
sheet.largestUndimmedDetentIdentifier = detent;
|
|
850
|
+
}
|
|
851
|
+
animate:animate];
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_15_0) && \
|
|
856
|
+
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_15_0
|
|
857
|
+
- (NSInteger)detentIndexFromDetentIdentifier:(UISheetPresentationControllerDetentIdentifier)identifier
|
|
858
|
+
API_AVAILABLE(ios(15.0))
|
|
859
|
+
{
|
|
860
|
+
// We first check if we are running on iOS 16+ as the API is different
|
|
861
|
+
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_16_0) && \
|
|
862
|
+
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_0
|
|
863
|
+
if (_sheetAllowedDetents.count > 0) {
|
|
864
|
+
// We should be running on custom detents in this case, thus identifier should be a stringified number.
|
|
865
|
+
return identifier.integerValue;
|
|
866
|
+
} else
|
|
867
|
+
#endif // iOS 16 check
|
|
868
|
+
{
|
|
869
|
+
// We're using system defined identifiers.
|
|
870
|
+
if (_sheetAllowedDetents.count >= 2 || _sheetAllowedDetents.count == 0) {
|
|
871
|
+
if (identifier == UISheetPresentationControllerDetentIdentifierMedium) {
|
|
872
|
+
return 0;
|
|
873
|
+
} else if (identifier == UISheetPresentationControllerDetentIdentifierLarge) {
|
|
874
|
+
return 1;
|
|
875
|
+
} else {
|
|
876
|
+
RCTLogError(@"[RNScreens] Unexpected detent identifier %@", identifier);
|
|
877
|
+
}
|
|
878
|
+
} else {
|
|
879
|
+
// There is only single option.
|
|
880
|
+
return 0;
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
return 0;
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
- (void)sheetPresentationControllerDidChangeSelectedDetentIdentifier:
|
|
887
|
+
(UISheetPresentationController *)sheetPresentationController API_AVAILABLE(ios(15.0))
|
|
888
|
+
{
|
|
889
|
+
UISheetPresentationControllerDetentIdentifier ident = sheetPresentationController.selectedDetentIdentifier;
|
|
890
|
+
[self notifySheetDetentChangeToIndex:[self detentIndexFromDetentIdentifier:ident] isStable:YES];
|
|
891
|
+
}
|
|
892
|
+
#endif // iOS 15 check
|
|
893
|
+
|
|
595
894
|
/**
|
|
596
895
|
* Updates settings for sheet presentation controller.
|
|
597
896
|
* Note that this method should not be called inside `stackPresentation` setter, because on Paper we don't have
|
|
598
|
-
* guarantee that values of all related props had been updated earlier.
|
|
897
|
+
* guarantee that values of all related props had been updated earlier. It should be invoked from `didSetProps`.
|
|
898
|
+
* On Fabric we have control over prop-setting process but it might be reasonable to run it from `finalizeUpdates`.
|
|
599
899
|
*/
|
|
600
|
-
- (void)
|
|
900
|
+
- (void)updateFormSheetPresentationStyle
|
|
601
901
|
{
|
|
902
|
+
if (_stackPresentation != RNSScreenStackPresentationFormSheet) {
|
|
903
|
+
return;
|
|
904
|
+
}
|
|
602
905
|
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_15_0) && \
|
|
603
906
|
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_15_0
|
|
907
|
+
int firstDimmedDetentIndex = _sheetAllowedDetents.count;
|
|
908
|
+
|
|
909
|
+
// Whether we use system (iOS 15) detents or custom (iOS 16+).
|
|
910
|
+
// Custom detents are in use if we are on iOS 16+ and we have at least single detent
|
|
911
|
+
// defined in the detents array. In any other case we do use system defined detents.
|
|
912
|
+
bool systemDetentsInUse = false;
|
|
913
|
+
|
|
604
914
|
if (@available(iOS 15.0, *)) {
|
|
605
915
|
UISheetPresentationController *sheet = _controller.sheetPresentationController;
|
|
606
|
-
if (
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
916
|
+
if (sheet == nil) {
|
|
917
|
+
return;
|
|
918
|
+
}
|
|
919
|
+
sheet.delegate = self;
|
|
920
|
+
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_16_0) && \
|
|
921
|
+
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_0
|
|
922
|
+
if (@available(iOS 16.0, *)) {
|
|
923
|
+
if (_sheetAllowedDetents.count > 0) {
|
|
924
|
+
if (_sheetAllowedDetents.count == 1 && [_sheetAllowedDetents[0] integerValue] == SHEET_FIT_TO_CONTENTS) {
|
|
925
|
+
// This is `fitToContents` case, where sheet should be just high to display its contents.
|
|
926
|
+
// Paper: we do not set anything here, we will set once React computed layout of our React's children, namely
|
|
927
|
+
// RNSScreenContentWrapper, which in case of formSheet presentation style does have exactly the same frame as
|
|
928
|
+
// actual content. The update will be triggered once our child is mounted and laid out by React.
|
|
929
|
+
// Fabric: in this very moment our children are already mounted & laid out. In the very end of this method,
|
|
930
|
+
// after all other configuration is applied we trigger content wrapper to send us update on its frame.
|
|
931
|
+
} else {
|
|
932
|
+
[self setAllowedDetentsForSheet:sheet
|
|
933
|
+
to:[self detentsFromMaxHeightFractions:_sheetAllowedDetents]
|
|
934
|
+
animate:NO];
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
} else
|
|
938
|
+
#endif // Check for iOS >= 16
|
|
939
|
+
{
|
|
940
|
+
systemDetentsInUse = true;
|
|
941
|
+
if (_sheetAllowedDetents.count == 0) {
|
|
942
|
+
[self setAllowedDetentsForSheet:sheet
|
|
943
|
+
to:@[
|
|
944
|
+
UISheetPresentationControllerDetent.mediumDetent,
|
|
945
|
+
UISheetPresentationControllerDetent.largeDetent
|
|
946
|
+
]
|
|
947
|
+
animate:YES];
|
|
948
|
+
} else if (_sheetAllowedDetents.count >= 2) {
|
|
949
|
+
float firstDetentFraction = _sheetAllowedDetents[0].floatValue;
|
|
950
|
+
float secondDetentFraction = _sheetAllowedDetents[1].floatValue;
|
|
951
|
+
firstDimmedDetentIndex = 2;
|
|
952
|
+
|
|
953
|
+
if (firstDetentFraction < secondDetentFraction) {
|
|
954
|
+
[self setAllowedDetentsForSheet:sheet
|
|
955
|
+
to:@[
|
|
956
|
+
UISheetPresentationControllerDetent.mediumDetent,
|
|
957
|
+
UISheetPresentationControllerDetent.largeDetent
|
|
958
|
+
]
|
|
959
|
+
animate:YES];
|
|
960
|
+
} else {
|
|
961
|
+
RCTLogError(@"[RNScreens] The values in sheetAllowedDetents array must be sorted");
|
|
962
|
+
}
|
|
618
963
|
} else {
|
|
619
|
-
|
|
964
|
+
float firstDetentFraction = _sheetAllowedDetents[0].floatValue;
|
|
965
|
+
if (firstDetentFraction == SHEET_FIT_TO_CONTENTS) {
|
|
966
|
+
RCTLogError(@"[RNScreens] Unsupported on iOS versions below 16");
|
|
967
|
+
} else if (firstDetentFraction < 1.0) {
|
|
968
|
+
[self setAllowedDetentsForSheet:sheet to:@[ UISheetPresentationControllerDetent.mediumDetent ] animate:YES];
|
|
969
|
+
[self setSelectedDetentForSheet:sheet to:UISheetPresentationControllerDetentIdentifierMedium animate:YES];
|
|
970
|
+
} else {
|
|
971
|
+
[self setAllowedDetentsForSheet:sheet to:@[ UISheetPresentationControllerDetent.largeDetent ] animate:YES];
|
|
972
|
+
[self setSelectedDetentForSheet:sheet to:UISheetPresentationControllerDetentIdentifierLarge animate:YES];
|
|
973
|
+
}
|
|
620
974
|
}
|
|
975
|
+
}
|
|
621
976
|
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
977
|
+
if (_sheetInitialDetent > 0 && _sheetInitialDetent < _sheetAllowedDetents.count) {
|
|
978
|
+
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_16_0) && \
|
|
979
|
+
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_0
|
|
980
|
+
if (@available(iOS 16.0, *)) {
|
|
981
|
+
UISheetPresentationControllerDetent *detent = sheet.detents[_sheetInitialDetent];
|
|
982
|
+
[self setSelectedDetentForSheet:sheet to:detent.identifier animate:YES];
|
|
983
|
+
} else
|
|
984
|
+
#endif // Check for iOS >= 16
|
|
985
|
+
{
|
|
986
|
+
if (_sheetInitialDetent < 2) {
|
|
987
|
+
[self setSelectedDetentForSheet:sheet to:UISheetPresentationControllerDetentIdentifierLarge animate:YES];
|
|
988
|
+
} else {
|
|
989
|
+
RCTLogError(
|
|
990
|
+
@"[RNScreens] sheetInitialDetent out of bounds, on iOS versions below 16 sheetAllowedDetents is ignored in favor of an array of two system-defined detents");
|
|
628
991
|
}
|
|
629
|
-
}
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
992
|
+
}
|
|
993
|
+
} else if (_sheetInitialDetent != 0) {
|
|
994
|
+
RCTLogError(@"[RNScreens] sheetInitialDetent out of bounds for sheetAllowedDetents array");
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
sheet.prefersScrollingExpandsWhenScrolledToEdge = _sheetExpandsWhenScrolledToEdge;
|
|
998
|
+
[self setGrabberVisibleForSheet:sheet to:_sheetGrabberVisible animate:YES];
|
|
999
|
+
[self setCornerRadiusForSheet:sheet to:_sheetCornerRadius animate:YES];
|
|
1000
|
+
|
|
1001
|
+
// lud - largest undimmed detent
|
|
1002
|
+
// First we try to take value from the prop or default.
|
|
1003
|
+
int ludIndex = _sheetLargestUndimmedDetent != nil ? _sheetLargestUndimmedDetent.intValue : -1;
|
|
1004
|
+
// Rationalize the value in case the user set something that did not make sense.
|
|
1005
|
+
ludIndex = ludIndex >= firstDimmedDetentIndex ? firstDimmedDetentIndex - 1 : ludIndex;
|
|
1006
|
+
if (ludIndex == SHEET_LARGEST_UNDIMMED_DETENT_NONE) {
|
|
1007
|
+
[self setLargestUndimmedDetentForSheet:sheet to:nil animate:YES];
|
|
1008
|
+
} else if (ludIndex >= 0) {
|
|
1009
|
+
if (systemDetentsInUse) {
|
|
1010
|
+
// We're on iOS 15 or do not have custom detents specified by the user.
|
|
1011
|
+
if (firstDimmedDetentIndex == 0 || (firstDimmedDetentIndex == 1 && _sheetAllowedDetents[0].floatValue < 1.0)) {
|
|
1012
|
+
// There are no detents specified or there is exactly one & it is less than 1.0 we default to medium.
|
|
1013
|
+
[self setLargestUndimmedDetentForSheet:sheet
|
|
1014
|
+
to:UISheetPresentationControllerDetentIdentifierMedium
|
|
1015
|
+
animate:YES];
|
|
1016
|
+
} else {
|
|
1017
|
+
[self setLargestUndimmedDetentForSheet:sheet
|
|
1018
|
+
to:UISheetPresentationControllerDetentIdentifierLarge
|
|
1019
|
+
animate:YES];
|
|
635
1020
|
}
|
|
636
|
-
} else if (_sheetAllowedDetents == RNSScreenDetentTypeAll) {
|
|
637
|
-
sheet.detents =
|
|
638
|
-
@[ UISheetPresentationControllerDetent.mediumDetent, UISheetPresentationControllerDetent.largeDetent ];
|
|
639
1021
|
} else {
|
|
640
|
-
|
|
1022
|
+
// We're on iOS 16+ & have custom detents.
|
|
1023
|
+
[self setLargestUndimmedDetentForSheet:sheet to:[NSNumber numberWithInt:ludIndex].stringValue animate:YES];
|
|
641
1024
|
}
|
|
1025
|
+
} else {
|
|
1026
|
+
RCTLogError(@"[RNScreens] Value of sheetLargestUndimmedDetent prop must be >= -1");
|
|
642
1027
|
}
|
|
643
1028
|
}
|
|
644
|
-
|
|
1029
|
+
|
|
1030
|
+
#ifdef RCT_NEW_ARCH_ENABLED
|
|
1031
|
+
// We trigger update from content wrapper, because on Fabric we update props after the children are mounted & laid
|
|
1032
|
+
// out.
|
|
1033
|
+
[self->_contentWrapper triggerDelegateUpdate];
|
|
1034
|
+
#endif // RCT_NEW_ARCH_ENABLED
|
|
1035
|
+
#endif // Check for iOS >= 15
|
|
645
1036
|
}
|
|
646
|
-
|
|
1037
|
+
|
|
1038
|
+
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_16_0) && \
|
|
1039
|
+
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_0
|
|
1040
|
+
|
|
1041
|
+
/**
|
|
1042
|
+
* Creates array of detent objects based on provided `values` & `resolver`. Since we need to name the detents to be able
|
|
1043
|
+
* to later refer to them, this method names the detents by stringifying their indices, e.g. detent on index 2 will be
|
|
1044
|
+
* named "2".
|
|
1045
|
+
*/
|
|
1046
|
+
- (NSArray<UISheetPresentationControllerDetent *> *)
|
|
1047
|
+
detentsFromValues:(NSArray<NSNumber *> *)values
|
|
1048
|
+
withResolver:(CGFloat (^)(id<UISheetPresentationControllerDetentResolutionContext>, NSNumber *))resolver
|
|
1049
|
+
API_AVAILABLE(ios(16.0))
|
|
1050
|
+
{
|
|
1051
|
+
NSMutableArray<UISheetPresentationControllerDetent *> *customDetents =
|
|
1052
|
+
[NSMutableArray arrayWithCapacity:values.count];
|
|
1053
|
+
[values enumerateObjectsUsingBlock:^(NSNumber *value, NSUInteger index, BOOL *stop) {
|
|
1054
|
+
UISheetPresentationControllerDetentIdentifier ident = [[NSNumber numberWithInt:index] stringValue];
|
|
1055
|
+
[customDetents addObject:[UISheetPresentationControllerDetent
|
|
1056
|
+
customDetentWithIdentifier:ident
|
|
1057
|
+
resolver:^CGFloat(
|
|
1058
|
+
id<UISheetPresentationControllerDetentResolutionContext> ctx) {
|
|
1059
|
+
return resolver(ctx, value);
|
|
1060
|
+
}]];
|
|
1061
|
+
}];
|
|
1062
|
+
return customDetents;
|
|
1063
|
+
}
|
|
1064
|
+
|
|
1065
|
+
- (NSArray<UISheetPresentationControllerDetent *> *)detentsFromMaxHeightFractions:(NSArray<NSNumber *> *)fractions
|
|
1066
|
+
API_AVAILABLE(ios(16.0))
|
|
1067
|
+
{
|
|
1068
|
+
return [self
|
|
1069
|
+
detentsFromValues:fractions
|
|
1070
|
+
withResolver:^CGFloat(id<UISheetPresentationControllerDetentResolutionContext> ctx, NSNumber *fraction) {
|
|
1071
|
+
return MIN(ctx.maximumDetentValue, ctx.maximumDetentValue * fraction.floatValue);
|
|
1072
|
+
}];
|
|
1073
|
+
}
|
|
1074
|
+
|
|
1075
|
+
- (NSArray<UISheetPresentationControllerDetent *> *)detentsFromMaxHeights:(NSArray<NSNumber *> *)maxHeights
|
|
1076
|
+
API_AVAILABLE(ios(16.0))
|
|
1077
|
+
{
|
|
1078
|
+
return
|
|
1079
|
+
[self detentsFromValues:maxHeights
|
|
1080
|
+
withResolver:^CGFloat(id<UISheetPresentationControllerDetentResolutionContext> ctx, NSNumber *height) {
|
|
1081
|
+
return MIN(ctx.maximumDetentValue, height.floatValue);
|
|
1082
|
+
}];
|
|
1083
|
+
}
|
|
1084
|
+
|
|
1085
|
+
#endif // Check for iOS >= 16
|
|
1086
|
+
|
|
1087
|
+
#endif // !TARGET_OS_TV && !TARGET_OS_VISION
|
|
647
1088
|
|
|
648
1089
|
#pragma mark - Fabric specific
|
|
649
1090
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
650
1091
|
|
|
1092
|
+
- (void)postNotificationForEventDispatcherObserversWithEvent:(NSObject<RCTEvent> *)event
|
|
1093
|
+
{
|
|
1094
|
+
NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:event, @"event", nil];
|
|
1095
|
+
[[NSNotificationCenter defaultCenter] postNotificationName:@"RCTNotifyEventDispatcherObserversOfEvent_DEPRECATED"
|
|
1096
|
+
object:nil
|
|
1097
|
+
userInfo:userInfo];
|
|
1098
|
+
}
|
|
1099
|
+
|
|
651
1100
|
- (BOOL)hasHeaderConfig
|
|
652
1101
|
{
|
|
653
1102
|
return _config != nil;
|
|
654
1103
|
}
|
|
655
1104
|
|
|
1105
|
+
- (void)willBeUnmountedInUpcomingTransaction
|
|
1106
|
+
{
|
|
1107
|
+
_markedForUnmountInCurrentTransaction = YES;
|
|
1108
|
+
}
|
|
1109
|
+
|
|
656
1110
|
+ (react::ComponentDescriptorProvider)componentDescriptorProvider
|
|
657
1111
|
{
|
|
658
1112
|
return react::concreteComponentDescriptorProvider<react::RNSScreenComponentDescriptor>();
|
|
659
1113
|
}
|
|
660
1114
|
|
|
1115
|
+
+ (BOOL)shouldBeRecycled
|
|
1116
|
+
{
|
|
1117
|
+
return NO;
|
|
1118
|
+
}
|
|
1119
|
+
|
|
661
1120
|
- (void)mountChildComponentView:(UIView<RCTComponentViewProtocol> *)childComponentView index:(NSInteger)index
|
|
662
1121
|
{
|
|
1122
|
+
if ([childComponentView isKindOfClass:RNSScreenContentWrapper.class]) {
|
|
1123
|
+
auto contentWrapper = (RNSScreenContentWrapper *)childComponentView;
|
|
1124
|
+
contentWrapper.delegate = self;
|
|
1125
|
+
_contentWrapper = contentWrapper;
|
|
1126
|
+
}
|
|
663
1127
|
if ([childComponentView isKindOfClass:[RNSScreenStackHeaderConfig class]]) {
|
|
664
1128
|
_config = (RNSScreenStackHeaderConfig *)childComponentView;
|
|
665
1129
|
_config.screenView = self;
|
|
@@ -673,33 +1137,16 @@ namespace react = facebook::react;
|
|
|
673
1137
|
if ([childComponentView isKindOfClass:[RNSScreenStackHeaderConfig class]]) {
|
|
674
1138
|
_config = nil;
|
|
675
1139
|
}
|
|
1140
|
+
if ([childComponentView isKindOfClass:[RNSScreenContentWrapper class]]) {
|
|
1141
|
+
_contentWrapper.delegate = nil;
|
|
1142
|
+
_contentWrapper = nil;
|
|
1143
|
+
}
|
|
676
1144
|
[_reactSubviews removeObject:childComponentView];
|
|
677
1145
|
[super unmountChildComponentView:childComponentView index:index];
|
|
678
1146
|
}
|
|
679
1147
|
|
|
680
1148
|
#pragma mark - RCTComponentViewProtocol
|
|
681
1149
|
|
|
682
|
-
- (void)prepareForRecycle
|
|
683
|
-
{
|
|
684
|
-
[super prepareForRecycle];
|
|
685
|
-
// TODO: Make sure that there is no edge case when this should be uncommented
|
|
686
|
-
// _controller=nil;
|
|
687
|
-
_dismissed = NO;
|
|
688
|
-
_state.reset();
|
|
689
|
-
_touchHandler = nil;
|
|
690
|
-
|
|
691
|
-
// We set this prop to default value here to workaround view-recycling.
|
|
692
|
-
// Let's assume the view has had _stackPresentation == <some modal stack presentation> set
|
|
693
|
-
// before below line was executed. Then, when instantiated again (with the same modal presentation)
|
|
694
|
-
// updateProps:oldProps: method would be called and setter for stack presentation would not be called.
|
|
695
|
-
// This is crucial as in that setter we register `self.controller` as a delegate
|
|
696
|
-
// (UIAdaptivePresentationControllerDelegate) to presentation controller and this leads to buggy modal behaviour as we
|
|
697
|
-
// rely on UIAdaptivePresentationControllerDelegate callbacks. Restoring the default value and then comparing against
|
|
698
|
-
// it in updateProps:oldProps: allows for setter to be called, however if there was some additional logic to execute
|
|
699
|
-
// when stackPresentation is set to "push" the setter would not be triggered.
|
|
700
|
-
_stackPresentation = RNSScreenStackPresentationPush;
|
|
701
|
-
}
|
|
702
|
-
|
|
703
1150
|
- (void)updateProps:(react::Props::Shared const &)props oldProps:(react::Props::Shared const &)oldProps
|
|
704
1151
|
{
|
|
705
1152
|
const auto &oldScreenProps = *std::static_pointer_cast<const react::RNSScreenProps>(_props);
|
|
@@ -707,6 +1154,8 @@ namespace react = facebook::react;
|
|
|
707
1154
|
|
|
708
1155
|
[self setFullScreenSwipeEnabled:newScreenProps.fullScreenSwipeEnabled];
|
|
709
1156
|
|
|
1157
|
+
[self setFullScreenSwipeShadowEnabled:newScreenProps.fullScreenSwipeShadowEnabled];
|
|
1158
|
+
|
|
710
1159
|
[self setGestureEnabled:newScreenProps.gestureEnabled];
|
|
711
1160
|
|
|
712
1161
|
[self setTransitionDuration:[NSNumber numberWithInt:newScreenProps.transitionDuration]];
|
|
@@ -754,21 +1203,21 @@ namespace react = facebook::react;
|
|
|
754
1203
|
[self setSheetExpandsWhenScrolledToEdge:newScreenProps.sheetExpandsWhenScrolledToEdge];
|
|
755
1204
|
|
|
756
1205
|
if (newScreenProps.sheetAllowedDetents != oldScreenProps.sheetAllowedDetents) {
|
|
757
|
-
[self setSheetAllowedDetents:[RNSConvert
|
|
1206
|
+
[self setSheetAllowedDetents:[RNSConvert detentFractionsArrayFromVector:newScreenProps.sheetAllowedDetents]];
|
|
1207
|
+
}
|
|
1208
|
+
|
|
1209
|
+
if (newScreenProps.sheetInitialDetent != oldScreenProps.sheetInitialDetent) {
|
|
1210
|
+
[self setSheetInitialDetent:newScreenProps.sheetInitialDetent];
|
|
758
1211
|
}
|
|
759
1212
|
|
|
760
1213
|
if (newScreenProps.sheetLargestUndimmedDetent != oldScreenProps.sheetLargestUndimmedDetent) {
|
|
761
|
-
[self setSheetLargestUndimmedDetent:
|
|
762
|
-
[RNSConvert RNSScreenDetentTypeFromLargestUndimmedDetent:newScreenProps.sheetLargestUndimmedDetent]];
|
|
1214
|
+
[self setSheetLargestUndimmedDetent:[NSNumber numberWithInt:newScreenProps.sheetLargestUndimmedDetent]];
|
|
763
1215
|
}
|
|
764
1216
|
#endif // !TARGET_OS_TV
|
|
765
1217
|
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
[RNSConvert RNSScreenStackPresentationFromCppEquivalent:newScreenProps.stackPresentation];
|
|
770
|
-
if (newStackPresentation != _stackPresentation) {
|
|
771
|
-
[self setStackPresentation:newStackPresentation];
|
|
1218
|
+
if (newScreenProps.stackPresentation != oldScreenProps.stackPresentation) {
|
|
1219
|
+
[self
|
|
1220
|
+
setStackPresentation:[RNSConvert RNSScreenStackPresentationFromCppEquivalent:newScreenProps.stackPresentation]];
|
|
772
1221
|
}
|
|
773
1222
|
|
|
774
1223
|
if (newScreenProps.stackAnimation != oldScreenProps.stackAnimation) {
|
|
@@ -793,7 +1242,7 @@ namespace react = facebook::react;
|
|
|
793
1242
|
_newLayoutMetrics = layoutMetrics;
|
|
794
1243
|
_oldLayoutMetrics = oldLayoutMetrics;
|
|
795
1244
|
UIViewController *parentVC = self.reactViewController.parentViewController;
|
|
796
|
-
if (parentVC
|
|
1245
|
+
if (parentVC == nil || ![parentVC isKindOfClass:[RNSNavigationController class]]) {
|
|
797
1246
|
[super updateLayoutMetrics:layoutMetrics oldLayoutMetrics:oldLayoutMetrics];
|
|
798
1247
|
}
|
|
799
1248
|
// when screen is mounted under RNSNavigationController it's size is controller
|
|
@@ -808,8 +1257,8 @@ namespace react = facebook::react;
|
|
|
808
1257
|
- (void)finalizeUpdates:(RNComponentViewUpdateMask)updateMask
|
|
809
1258
|
{
|
|
810
1259
|
[super finalizeUpdates:updateMask];
|
|
811
|
-
#if !TARGET_OS_TV
|
|
812
|
-
[self
|
|
1260
|
+
#if !TARGET_OS_TV && !TARGET_OS_VISION
|
|
1261
|
+
[self updateFormSheetPresentationStyle];
|
|
813
1262
|
#endif // !TARGET_OS_TV
|
|
814
1263
|
}
|
|
815
1264
|
|
|
@@ -819,8 +1268,10 @@ namespace react = facebook::react;
|
|
|
819
1268
|
- (void)didSetProps:(NSArray<NSString *> *)changedProps
|
|
820
1269
|
{
|
|
821
1270
|
[super didSetProps:changedProps];
|
|
822
|
-
#if !TARGET_OS_TV
|
|
823
|
-
|
|
1271
|
+
#if !TARGET_OS_TV && !TARGET_OS_VISION
|
|
1272
|
+
if (self.stackPresentation == RNSScreenStackPresentationFormSheet) {
|
|
1273
|
+
[self updateFormSheetPresentationStyle];
|
|
1274
|
+
}
|
|
824
1275
|
#endif // !TARGET_OS_TV
|
|
825
1276
|
}
|
|
826
1277
|
|
|
@@ -845,10 +1296,6 @@ namespace react = facebook::react;
|
|
|
845
1296
|
// subviews
|
|
846
1297
|
}
|
|
847
1298
|
|
|
848
|
-
- (void)invalidate
|
|
849
|
-
{
|
|
850
|
-
_controller = nil;
|
|
851
|
-
}
|
|
852
1299
|
#endif
|
|
853
1300
|
|
|
854
1301
|
@end
|
|
@@ -975,9 +1422,6 @@ Class<RCTComponentViewProtocol> RNSScreenCls(void)
|
|
|
975
1422
|
- (void)viewDidDisappear:(BOOL)animated
|
|
976
1423
|
{
|
|
977
1424
|
[super viewDidDisappear:animated];
|
|
978
|
-
#ifdef RCT_NEW_ARCH_ENABLED
|
|
979
|
-
[self resetViewToScreen];
|
|
980
|
-
#endif
|
|
981
1425
|
if (self.parentViewController == nil && self.presentingViewController == nil) {
|
|
982
1426
|
if (self.screenView.preventNativeDismiss) {
|
|
983
1427
|
// if we want to prevent the native dismiss, we do not send dismissal event,
|
|
@@ -1031,6 +1475,12 @@ Class<RCTComponentViewProtocol> RNSScreenCls(void)
|
|
|
1031
1475
|
}
|
|
1032
1476
|
}
|
|
1033
1477
|
|
|
1478
|
+
- (BOOL)isModalWithHeader
|
|
1479
|
+
{
|
|
1480
|
+
return self.screenView.isModal && self.childViewControllers.count == 1 &&
|
|
1481
|
+
[self.childViewControllers[0] isKindOfClass:UINavigationController.class];
|
|
1482
|
+
}
|
|
1483
|
+
|
|
1034
1484
|
// Checks whether this screen has any child view controllers of type RNSNavigationController.
|
|
1035
1485
|
// Useful for checking if this screen has nested stack or is displayed at the top.
|
|
1036
1486
|
- (BOOL)hasNestedStack
|
|
@@ -1044,33 +1494,9 @@ Class<RCTComponentViewProtocol> RNSScreenCls(void)
|
|
|
1044
1494
|
return NO;
|
|
1045
1495
|
}
|
|
1046
1496
|
|
|
1047
|
-
- (
|
|
1497
|
+
- (CGSize)getStatusBarHeightIsModal:(BOOL)isModal
|
|
1048
1498
|
{
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
// In case where screen is a modal, we want to calculate just its childViewController's height
|
|
1052
|
-
if (isModal && self.childViewControllers.count > 0 &&
|
|
1053
|
-
[self.childViewControllers[0] isKindOfClass:UINavigationController.class]) {
|
|
1054
|
-
UINavigationController *childNavCtr = self.childViewControllers[0];
|
|
1055
|
-
navbarHeight = childNavCtr.navigationBar.frame.size.height;
|
|
1056
|
-
}
|
|
1057
|
-
|
|
1058
|
-
return navbarHeight;
|
|
1059
|
-
}
|
|
1060
|
-
|
|
1061
|
-
- (CGSize)getCalculatedStatusBarHeightIsModal:(BOOL)isModal
|
|
1062
|
-
{
|
|
1063
|
-
#if !TARGET_OS_TV
|
|
1064
|
-
BOOL isDraggableModal = isModal && ![self.screenView isFullscreenModal];
|
|
1065
|
-
BOOL isDraggableModalWithChildViewCtr =
|
|
1066
|
-
isDraggableModal && self.childViewControllers.count > 0 && self.childViewControllers[0] != nil;
|
|
1067
|
-
|
|
1068
|
-
// When modal is floating (we can grab its header), we don't want to calculate status bar in it.
|
|
1069
|
-
// Thus, we return '0' as a height of status bar.
|
|
1070
|
-
if (isDraggableModalWithChildViewCtr || self.screenView.isTransparentModal) {
|
|
1071
|
-
return CGSizeMake(0, 0);
|
|
1072
|
-
}
|
|
1073
|
-
|
|
1499
|
+
#if !TARGET_OS_TV && !TARGET_OS_VISION
|
|
1074
1500
|
CGSize fallbackStatusBarSize = [[UIApplication sharedApplication] statusBarFrame].size;
|
|
1075
1501
|
|
|
1076
1502
|
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \
|
|
@@ -1087,21 +1513,51 @@ Class<RCTComponentViewProtocol> RNSScreenCls(void)
|
|
|
1087
1513
|
#endif /* Check for iOS 13.0 */
|
|
1088
1514
|
|
|
1089
1515
|
#else
|
|
1090
|
-
//
|
|
1516
|
+
// TVOS does not have status bar.
|
|
1091
1517
|
return CGSizeMake(0, 0);
|
|
1092
1518
|
#endif // !TARGET_OS_TV
|
|
1093
1519
|
}
|
|
1094
1520
|
|
|
1521
|
+
- (UINavigationController *)getVisibleNavigationControllerIsModal:(BOOL)isModal
|
|
1522
|
+
{
|
|
1523
|
+
UINavigationController *navctr = self.navigationController;
|
|
1524
|
+
|
|
1525
|
+
if (isModal) {
|
|
1526
|
+
// In case where screen is a modal, we want to calculate childViewController's
|
|
1527
|
+
// navigation bar height instead of the navigation controller from RNSScreen.
|
|
1528
|
+
if (self.isModalWithHeader) {
|
|
1529
|
+
navctr = self.childViewControllers[0];
|
|
1530
|
+
} else {
|
|
1531
|
+
// If the modal does not meet requirements (there's no RNSNavigationController which means that probably it
|
|
1532
|
+
// doesn't have header or there are more than one RNSNavigationController which is invalid) we don't want to
|
|
1533
|
+
// return anything.
|
|
1534
|
+
return nil;
|
|
1535
|
+
}
|
|
1536
|
+
}
|
|
1537
|
+
|
|
1538
|
+
return navctr;
|
|
1539
|
+
}
|
|
1540
|
+
|
|
1095
1541
|
- (CGFloat)calculateHeaderHeightIsModal:(BOOL)isModal
|
|
1096
1542
|
{
|
|
1097
|
-
|
|
1098
|
-
|
|
1543
|
+
UINavigationController *navctr = [self getVisibleNavigationControllerIsModal:isModal];
|
|
1544
|
+
|
|
1545
|
+
// If there's no navigation controller for the modal (or the navigation bar is hidden), we simply don't want to
|
|
1546
|
+
// return header height, as modal possibly does not have header when navigation controller is nil,
|
|
1547
|
+
// and we don't want to count status bar if navigation bar is hidden (inset could be negative).
|
|
1548
|
+
if (navctr == nil || navctr.isNavigationBarHidden) {
|
|
1549
|
+
return 0;
|
|
1550
|
+
}
|
|
1551
|
+
|
|
1552
|
+
CGFloat navbarHeight = navctr.navigationBar.frame.size.height;
|
|
1553
|
+
#if !TARGET_OS_TV
|
|
1554
|
+
CGFloat navbarInset = navctr.navigationBar.frame.origin.y;
|
|
1555
|
+
#else
|
|
1556
|
+
// On TVOS there's no inset of navigation bar.
|
|
1557
|
+
CGFloat navbarInset = 0;
|
|
1558
|
+
#endif // !TARGET_OS_TV
|
|
1099
1559
|
|
|
1100
|
-
|
|
1101
|
-
// We should check if user has rotated its screen, so we're choosing the minimum value between the
|
|
1102
|
-
// width and height.
|
|
1103
|
-
CGFloat statusBarHeight = MIN(statusBarSize.width, statusBarSize.height);
|
|
1104
|
-
return navbarHeight + statusBarHeight;
|
|
1560
|
+
return navbarHeight + navbarInset;
|
|
1105
1561
|
}
|
|
1106
1562
|
|
|
1107
1563
|
- (void)calculateAndNotifyHeaderHeightChangeIsModal:(BOOL)isModal
|
|
@@ -1195,15 +1651,28 @@ Class<RCTComponentViewProtocol> RNSScreenCls(void)
|
|
|
1195
1651
|
UIViewController *lastViewController = [[self childViewControllers] lastObject];
|
|
1196
1652
|
if ([self.presentedViewController isKindOfClass:[RNSScreen class]]) {
|
|
1197
1653
|
lastViewController = self.presentedViewController;
|
|
1654
|
+
|
|
1655
|
+
if (!includingModals) {
|
|
1656
|
+
return nil;
|
|
1657
|
+
}
|
|
1658
|
+
|
|
1198
1659
|
// we don't want to allow controlling of status bar appearance when we present non-fullScreen modal
|
|
1199
1660
|
// and it is not possible if `modalPresentationCapturesStatusBarAppearance` is not set to YES, so even
|
|
1200
1661
|
// if we went into a modal here and ask it, it wouldn't take any effect. For fullScreen modals, the system
|
|
1201
1662
|
// asks them by itself, so we can stop traversing here.
|
|
1202
1663
|
// for screen orientation, we need to start the search again from that modal
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1664
|
+
UIViewController *modalOrChild = [(RNSScreen *)lastViewController findChildVCForConfigAndTrait:trait
|
|
1665
|
+
includingModals:includingModals];
|
|
1666
|
+
if (modalOrChild != nil) {
|
|
1667
|
+
return modalOrChild;
|
|
1668
|
+
}
|
|
1669
|
+
|
|
1670
|
+
// if searched VC was not found, we don't want to search for configs of child VCs any longer,
|
|
1671
|
+
// and we don't want to rely on lastViewController.
|
|
1672
|
+
// That's because the modal did not find a child VC that has an orientation set,
|
|
1673
|
+
// and it doesn't itself have an orientation set. Hence, we fallback to the standard behavior.
|
|
1674
|
+
// Please keep in mind that this behavior might be wrong and could lead to undiscovered bugs.
|
|
1675
|
+
// For more information, see https://github.com/software-mansion/react-native-screens/pull/2008.
|
|
1207
1676
|
}
|
|
1208
1677
|
|
|
1209
1678
|
UIViewController *selfOrNil = [self hasTraitSet:trait] ? self : nil;
|
|
@@ -1366,26 +1835,15 @@ Class<RCTComponentViewProtocol> RNSScreenCls(void)
|
|
|
1366
1835
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
1367
1836
|
#pragma mark - Fabric specific
|
|
1368
1837
|
|
|
1369
|
-
- (void)setViewToSnapshot
|
|
1838
|
+
- (void)setViewToSnapshot
|
|
1370
1839
|
{
|
|
1371
|
-
|
|
1372
|
-
//
|
|
1373
|
-
if (
|
|
1374
|
-
UIView *
|
|
1840
|
+
UIView *superView = self.view.superview;
|
|
1841
|
+
// if we dismissed the view natively, it will already be detached from view hierarchy
|
|
1842
|
+
if (self.view.window != nil) {
|
|
1843
|
+
UIView *snapshot = [self.view snapshotViewAfterScreenUpdates:NO];
|
|
1375
1844
|
[self.view removeFromSuperview];
|
|
1376
1845
|
self.view = snapshot;
|
|
1377
|
-
[superView addSubview:
|
|
1378
|
-
} else {
|
|
1379
|
-
[self.view removeFromSuperview];
|
|
1380
|
-
self.view = snapshot;
|
|
1381
|
-
}
|
|
1382
|
-
}
|
|
1383
|
-
|
|
1384
|
-
- (void)resetViewToScreen
|
|
1385
|
-
{
|
|
1386
|
-
if (self.view != _initialView) {
|
|
1387
|
-
[self.view removeFromSuperview];
|
|
1388
|
-
self.view = _initialView;
|
|
1846
|
+
[superView addSubview:snapshot];
|
|
1389
1847
|
}
|
|
1390
1848
|
}
|
|
1391
1849
|
|
|
@@ -1398,6 +1856,15 @@ Class<RCTComponentViewProtocol> RNSScreenCls(void)
|
|
|
1398
1856
|
// we don't want to send `scrollViewDidEndDecelerating` event to JS before the JS thread is ready
|
|
1399
1857
|
return;
|
|
1400
1858
|
}
|
|
1859
|
+
|
|
1860
|
+
if ([NSStringFromClass([view class]) isEqualToString:@"AVPlayerView"]) {
|
|
1861
|
+
// Traversing through AVPlayerView is an uncommon edge case that causes the disappearing screen
|
|
1862
|
+
// to an excessive traversal through all video player elements
|
|
1863
|
+
// (e.g., for react-native-video, this includes all controls and additional video views).
|
|
1864
|
+
// Thus, we want to avoid unnecessary traversals through these views.
|
|
1865
|
+
return;
|
|
1866
|
+
}
|
|
1867
|
+
|
|
1401
1868
|
if ([view isKindOfClass:[UIScrollView class]] &&
|
|
1402
1869
|
([[(UIScrollView *)view delegate] respondsToSelector:@selector(scrollViewDidEndDecelerating:)])) {
|
|
1403
1870
|
[[(UIScrollView *)view delegate] scrollViewDidEndDecelerating:(id)view];
|
|
@@ -1418,6 +1885,7 @@ RCT_EXPORT_MODULE()
|
|
|
1418
1885
|
RCT_REMAP_VIEW_PROPERTY(activityState, activityStateOrNil, NSNumber)
|
|
1419
1886
|
RCT_EXPORT_VIEW_PROPERTY(customAnimationOnSwipe, BOOL);
|
|
1420
1887
|
RCT_EXPORT_VIEW_PROPERTY(fullScreenSwipeEnabled, BOOL);
|
|
1888
|
+
RCT_EXPORT_VIEW_PROPERTY(fullScreenSwipeShadowEnabled, BOOL);
|
|
1421
1889
|
RCT_EXPORT_VIEW_PROPERTY(gestureEnabled, BOOL)
|
|
1422
1890
|
RCT_EXPORT_VIEW_PROPERTY(gestureResponseDistance, NSDictionary)
|
|
1423
1891
|
RCT_EXPORT_VIEW_PROPERTY(hideKeyboardOnSwipe, BOOL)
|
|
@@ -1437,6 +1905,7 @@ RCT_EXPORT_VIEW_PROPERTY(onTransitionProgress, RCTDirectEventBlock);
|
|
|
1437
1905
|
RCT_EXPORT_VIEW_PROPERTY(onWillAppear, RCTDirectEventBlock);
|
|
1438
1906
|
RCT_EXPORT_VIEW_PROPERTY(onWillDisappear, RCTDirectEventBlock);
|
|
1439
1907
|
RCT_EXPORT_VIEW_PROPERTY(onGestureCancel, RCTDirectEventBlock);
|
|
1908
|
+
RCT_EXPORT_VIEW_PROPERTY(onSheetDetentChanged, RCTDirectEventBlock);
|
|
1440
1909
|
|
|
1441
1910
|
#if !TARGET_OS_TV
|
|
1442
1911
|
RCT_EXPORT_VIEW_PROPERTY(screenOrientation, UIInterfaceOrientationMask)
|
|
@@ -1445,14 +1914,15 @@ RCT_EXPORT_VIEW_PROPERTY(statusBarHidden, BOOL)
|
|
|
1445
1914
|
RCT_EXPORT_VIEW_PROPERTY(statusBarStyle, RNSStatusBarStyle)
|
|
1446
1915
|
RCT_EXPORT_VIEW_PROPERTY(homeIndicatorHidden, BOOL)
|
|
1447
1916
|
|
|
1448
|
-
RCT_EXPORT_VIEW_PROPERTY(sheetAllowedDetents,
|
|
1449
|
-
RCT_EXPORT_VIEW_PROPERTY(sheetLargestUndimmedDetent,
|
|
1917
|
+
RCT_EXPORT_VIEW_PROPERTY(sheetAllowedDetents, NSArray<NSNumber *> *);
|
|
1918
|
+
RCT_EXPORT_VIEW_PROPERTY(sheetLargestUndimmedDetent, NSNumber *);
|
|
1450
1919
|
RCT_EXPORT_VIEW_PROPERTY(sheetGrabberVisible, BOOL);
|
|
1451
1920
|
RCT_EXPORT_VIEW_PROPERTY(sheetCornerRadius, CGFloat);
|
|
1921
|
+
RCT_EXPORT_VIEW_PROPERTY(sheetInitialDetent, NSInteger);
|
|
1452
1922
|
RCT_EXPORT_VIEW_PROPERTY(sheetExpandsWhenScrolledToEdge, BOOL);
|
|
1453
1923
|
#endif
|
|
1454
1924
|
|
|
1455
|
-
#if !TARGET_OS_TV
|
|
1925
|
+
#if !TARGET_OS_TV && !TARGET_OS_VISION
|
|
1456
1926
|
// See:
|
|
1457
1927
|
// 1. https://github.com/software-mansion/react-native-screens/pull/1543
|
|
1458
1928
|
// 2. https://github.com/software-mansion/react-native-screens/pull/1596
|
|
@@ -1475,10 +1945,13 @@ RCT_EXPORT_VIEW_PROPERTY(sheetExpandsWhenScrolledToEdge, BOOL);
|
|
|
1475
1945
|
}
|
|
1476
1946
|
#endif // !TARGET_OS_TV
|
|
1477
1947
|
|
|
1948
|
+
#ifdef RCT_NEW_ARCH_ENABLED
|
|
1949
|
+
#else
|
|
1478
1950
|
- (UIView *)view
|
|
1479
1951
|
{
|
|
1480
1952
|
return [[RNSScreenView alloc] initWithBridge:self.bridge];
|
|
1481
1953
|
}
|
|
1954
|
+
#endif
|
|
1482
1955
|
|
|
1483
1956
|
+ (BOOL)requiresMainQueueSetup
|
|
1484
1957
|
{
|
|
@@ -1517,7 +1990,9 @@ RCT_ENUM_CONVERTER(
|
|
|
1517
1990
|
@"simple_push" : @(RNSScreenStackAnimationSimplePush),
|
|
1518
1991
|
@"slide_from_bottom" : @(RNSScreenStackAnimationSlideFromBottom),
|
|
1519
1992
|
@"slide_from_right" : @(RNSScreenStackAnimationDefault),
|
|
1520
|
-
@"slide_from_left" : @(
|
|
1993
|
+
@"slide_from_left" : @(RNSScreenStackAnimationSlideFromLeft),
|
|
1994
|
+
@"ios_from_right" : @(RNSScreenStackAnimationDefault),
|
|
1995
|
+
@"ios_from_left" : @(RNSScreenStackAnimationSlideFromLeft),
|
|
1521
1996
|
}),
|
|
1522
1997
|
RNSScreenStackAnimationDefault,
|
|
1523
1998
|
integerValue)
|
|
@@ -1597,3 +2072,7 @@ RCT_ENUM_CONVERTER(
|
|
|
1597
2072
|
#endif
|
|
1598
2073
|
|
|
1599
2074
|
@end
|
|
2075
|
+
|
|
2076
|
+
// So that the define-macro is not leaked out of this file.
|
|
2077
|
+
// This one is defined in very top of the file depending on RN architecture.
|
|
2078
|
+
#undef ReactScrollViewBase
|