react-native-screens 4.12.0 → 4.13.0
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/RNScreens.podspec +29 -2
- package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +4 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt +9 -1
- package/android/src/main/java/com/swmansion/rnscreens/ScreenFragmentWrapper.kt +0 -1
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +4 -4
- package/android/src/main/java/com/swmansion/rnscreens/ScreensModule.kt +1 -1
- package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/DimmingView.kt +4 -4
- package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/DimmingViewManager.kt +8 -2
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenAnimationDelegate.kt +1 -2
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenEventEmitter.kt +16 -13
- package/android/src/main/java/com/swmansion/rnscreens/gamma/common/BaseEventEmitter.kt +22 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/common/FragmentProviding.kt +11 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/common/NamingAwareEventType.kt +13 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/helpers/EventHelpers.kt +6 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/helpers/FragmentManagerHelper.kt +76 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/helpers/SystemDrawable.kt +33 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreen.kt +101 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenDelegate.kt +17 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenEventEmitter.kt +46 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenFragment.kt +37 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenViewManager.kt +178 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabsHost.kt +433 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabsHostEventEmitter.kt +14 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabsHostViewManager.kt +177 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/event/TabScreenDidAppearEvent.kt +30 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/event/TabScreenDidDisappearEvent.kt +30 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/event/TabScreenWillAppearEvent.kt +30 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/event/TabScreenWillDisappearEvent.kt +30 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/event/TabsHostNativeFocusChangeEvent.kt +36 -0
- package/android/src/main/java/com/swmansion/rnscreens/stack/views/ChildDrawingOrderStrategyImpl.kt +0 -1
- package/android/src/main/java/com/swmansion/rnscreens/transition/ExternalBoundaryValuesEvaluator.kt +9 -2
- package/android/src/main/java/com/swmansion/rnscreens/utils/FragmentTransactionKt.kt +4 -1
- package/android/src/main/jni/rnscreens.h +1 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsManagerDelegate.java +76 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsManagerInterface.java +33 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerDelegate.java +97 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerInterface.java +40 -0
- package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledHeaderConfigViewGroup.kt +2 -2
- package/android/src/versioned/backgroundcolor/76/ViewBackgroundUtils.kt +0 -1
- package/android/src/versioned/backgroundcolor/latest/ViewBackgroundUtils.kt +0 -3
- package/android/src/versioned/pointerevents/77/com/swmansion/rnscreens/PointerEventsBoxNoneImpl.kt +1 -1
- package/android/src/versioned/pointerevents/latest/com/swmansion/rnscreens/PointerEventsBoxNoneImpl.kt +1 -1
- package/common/cpp/react/renderer/components/rnscreens/RNSBottomTabsComponentDescriptor.h +31 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSBottomTabsShadowNode.cpp +20 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSBottomTabsShadowNode.h +32 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSBottomTabsState.cpp +22 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSBottomTabsState.h +44 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.cpp +8 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSSplitViewScreenComponentDescriptor.h +40 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSSplitViewScreenShadowNode.cpp +13 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSSplitViewScreenShadowNode.h +36 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSSplitViewScreenState.h +32 -0
- package/cpp/RNScreensTurboModule.h +5 -0
- package/ios/RNSEnums.h +6 -0
- package/ios/RNSScreen.h +2 -1
- package/ios/RNSScreen.mm +48 -1
- package/ios/RNSScreenContainer.mm +6 -0
- package/ios/RNSScreenStack.h +3 -1
- package/ios/RNSScreenStack.mm +39 -2
- package/ios/RNSScreenStackHeaderConfig.mm +1 -1
- package/ios/RNSScrollViewBehaviorOverriding.h +24 -0
- package/ios/RNSScrollViewFinder.h +13 -0
- package/ios/RNSScrollViewFinder.mm +22 -0
- package/ios/RNSScrollViewHelper.h +10 -0
- package/ios/RNSScrollViewHelper.mm +15 -0
- package/ios/RNScreens-Bridging-Header.h +4 -0
- package/ios/UIScrollView+RNScreens.h +14 -0
- package/ios/UIScrollView+RNScreens.mm +15 -0
- package/ios/bottom-tabs/RCTConvert+RNSBottomTabs.h +18 -0
- package/ios/bottom-tabs/RCTConvert+RNSBottomTabs.mm +25 -0
- package/ios/bottom-tabs/RNSBottomTabsHostComponentView.h +80 -0
- package/ios/bottom-tabs/RNSBottomTabsHostComponentView.mm +486 -0
- package/ios/bottom-tabs/RNSBottomTabsHostComponentViewManager.h +11 -0
- package/ios/bottom-tabs/RNSBottomTabsHostComponentViewManager.mm +48 -0
- package/ios/bottom-tabs/RNSBottomTabsHostEventEmitter.h +53 -0
- package/ios/bottom-tabs/RNSBottomTabsHostEventEmitter.mm +57 -0
- package/ios/bottom-tabs/RNSBottomTabsScreenComponentView.h +95 -0
- package/ios/bottom-tabs/RNSBottomTabsScreenComponentView.mm +492 -0
- package/ios/bottom-tabs/RNSBottomTabsScreenComponentViewManager.h +9 -0
- package/ios/bottom-tabs/RNSBottomTabsScreenComponentViewManager.mm +55 -0
- package/ios/bottom-tabs/RNSBottomTabsScreenEventEmitter.h +53 -0
- package/ios/bottom-tabs/RNSBottomTabsScreenEventEmitter.mm +106 -0
- package/ios/bottom-tabs/RNSBottomTabsSpecialEffectsSupporting.h +17 -0
- package/ios/bottom-tabs/RNSTabBarAppearanceCoordinator.h +34 -0
- package/ios/bottom-tabs/RNSTabBarAppearanceCoordinator.mm +243 -0
- package/ios/bottom-tabs/RNSTabBarAppearanceProvider.h +23 -0
- package/ios/bottom-tabs/RNSTabBarController.h +132 -0
- package/ios/bottom-tabs/RNSTabBarController.mm +206 -0
- package/ios/bottom-tabs/RNSTabBarControllerDelegate.h +9 -0
- package/ios/bottom-tabs/RNSTabBarControllerDelegate.mm +63 -0
- package/ios/bottom-tabs/RNSTabsScreenViewController.h +42 -0
- package/ios/bottom-tabs/RNSTabsScreenViewController.mm +105 -0
- package/ios/bottom-tabs/extensions/RNSBottomTabsHostComponentView+RNSImageLoader.h +21 -0
- package/ios/bottom-tabs/extensions/RNSBottomTabsHostComponentView+RNSImageLoader.mm +22 -0
- package/ios/bridging/RNSReactBaseView.h +31 -0
- package/ios/bridging/RNSReactBaseView.mm +5 -0
- package/ios/bridging/Swift-Bridging.h +7 -0
- package/ios/conversion/RNSConversions-BottomTabs.mm +216 -0
- package/ios/conversion/RNSConversions-SplitView.mm +63 -0
- package/ios/conversion/RNSConversions.h +53 -0
- package/ios/gamma/ReactMountingTransactionObserving.swift +7 -0
- package/ios/gamma/split-view/RNSSplitViewHostComponentView.h +29 -0
- package/ios/gamma/split-view/RNSSplitViewHostComponentView.mm +209 -0
- package/ios/gamma/split-view/RNSSplitViewHostComponentViewManager.h +11 -0
- package/ios/gamma/split-view/RNSSplitViewHostComponentViewManager.mm +7 -0
- package/ios/gamma/split-view/RNSSplitViewHostController.swift +98 -0
- package/ios/gamma/split-view/RNSSplitViewNavigationController.swift +31 -0
- package/ios/gamma/split-view/RNSSplitViewScreenComponentView.h +24 -0
- package/ios/gamma/split-view/RNSSplitViewScreenComponentView.mm +106 -0
- package/ios/gamma/split-view/RNSSplitViewScreenComponentViewManager.h +11 -0
- package/ios/gamma/split-view/RNSSplitViewScreenComponentViewManager.mm +7 -0
- package/ios/gamma/split-view/RNSSplitViewScreenController.swift +86 -0
- package/ios/gamma/split-view/RNSSplitViewScreenShadowStateProxy.h +35 -0
- package/ios/gamma/split-view/RNSSplitViewScreenShadowStateProxy.mm +56 -0
- package/ios/gamma/stack/RNSScreenStackHostComponentView.h +16 -0
- package/ios/gamma/stack/RNSScreenStackHostComponentView.mm +143 -0
- package/ios/gamma/stack/RNSScreenStackHostComponentViewManager.h +11 -0
- package/ios/gamma/stack/RNSScreenStackHostComponentViewManager.mm +7 -0
- package/ios/gamma/stack/RNSStackController.swift +65 -0
- package/ios/gamma/stack/RNSStackScreenComponentEventEmitter.h +37 -0
- package/ios/gamma/stack/RNSStackScreenComponentEventEmitter.mm +60 -0
- package/ios/gamma/stack/RNSStackScreenComponentView.h +36 -0
- package/ios/gamma/stack/RNSStackScreenComponentView.mm +124 -0
- package/ios/gamma/stack/RNSStackScreenComponentViewManager.h +11 -0
- package/ios/gamma/stack/RNSStackScreenComponentViewManager.mm +7 -0
- package/ios/gamma/stack/RNSStackScreenController.swift +56 -0
- package/ios/utils/NSString+RNSUtility.h +17 -0
- package/ios/utils/NSString+RNSUtility.mm +37 -0
- package/lib/commonjs/components/BottomTabs.js +54 -0
- package/lib/commonjs/components/BottomTabs.js.map +1 -0
- package/lib/commonjs/components/BottomTabsScreen.js +149 -0
- package/lib/commonjs/components/BottomTabsScreen.js.map +1 -0
- package/lib/commonjs/components/gamma/ScreenStackHost.js +27 -0
- package/lib/commonjs/components/gamma/ScreenStackHost.js.map +1 -0
- package/lib/commonjs/components/gamma/SplitViewHost.js +57 -0
- package/lib/commonjs/components/gamma/SplitViewHost.js.map +1 -0
- package/lib/commonjs/components/gamma/SplitViewScreen.js +22 -0
- package/lib/commonjs/components/gamma/SplitViewScreen.js.map +1 -0
- package/lib/commonjs/components/gamma/StackScreen.js +51 -0
- package/lib/commonjs/components/gamma/StackScreen.js.map +1 -0
- package/lib/commonjs/fabric/BottomTabsNativeComponent.js +19 -0
- package/lib/commonjs/fabric/BottomTabsNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/BottomTabsScreenNativeComponent.js +14 -0
- package/lib/commonjs/fabric/BottomTabsScreenNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/gamma/ScreenStackHostNativeComponent.js +11 -0
- package/lib/commonjs/fabric/gamma/ScreenStackHostNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/gamma/SplitViewHostNativeComponent.js +11 -0
- package/lib/commonjs/fabric/gamma/SplitViewHostNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/gamma/SplitViewScreenNativeComponent.js +13 -0
- package/lib/commonjs/fabric/gamma/SplitViewScreenNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/gamma/StackScreenNativeComponent.js +12 -0
- package/lib/commonjs/fabric/gamma/StackScreenNativeComponent.js.map +1 -0
- package/lib/commonjs/flags.js +70 -0
- package/lib/commonjs/flags.js.map +1 -0
- package/lib/commonjs/index.js +66 -3
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/utils.js +0 -28
- package/lib/commonjs/utils.js.map +1 -1
- package/lib/module/components/BottomTabs.js +48 -0
- package/lib/module/components/BottomTabs.js.map +1 -0
- package/lib/module/components/BottomTabsScreen.js +144 -0
- package/lib/module/components/BottomTabsScreen.js.map +1 -0
- package/lib/module/components/gamma/ScreenStackHost.js +20 -0
- package/lib/module/components/gamma/ScreenStackHost.js.map +1 -0
- package/lib/module/components/gamma/SplitViewHost.js +50 -0
- package/lib/module/components/gamma/SplitViewHost.js.map +1 -0
- package/lib/module/components/gamma/SplitViewScreen.js +15 -0
- package/lib/module/components/gamma/SplitViewScreen.js.map +1 -0
- package/lib/module/components/gamma/StackScreen.js +44 -0
- package/lib/module/components/gamma/StackScreen.js.map +1 -0
- package/lib/module/fabric/BottomTabsNativeComponent.js +15 -0
- package/lib/module/fabric/BottomTabsNativeComponent.js.map +1 -0
- package/lib/module/fabric/BottomTabsScreenNativeComponent.js +12 -0
- package/lib/module/fabric/BottomTabsScreenNativeComponent.js.map +1 -0
- package/lib/module/fabric/gamma/ScreenStackHostNativeComponent.js +5 -0
- package/lib/module/fabric/gamma/ScreenStackHostNativeComponent.js.map +1 -0
- package/lib/module/fabric/gamma/SplitViewHostNativeComponent.js +5 -0
- package/lib/module/fabric/gamma/SplitViewHostNativeComponent.js.map +1 -0
- package/lib/module/fabric/gamma/SplitViewScreenNativeComponent.js +7 -0
- package/lib/module/fabric/gamma/SplitViewScreenNativeComponent.js.map +1 -0
- package/lib/module/fabric/gamma/StackScreenNativeComponent.js +8 -0
- package/lib/module/fabric/gamma/StackScreenNativeComponent.js.map +1 -0
- package/lib/module/flags.js +64 -0
- package/lib/module/flags.js.map +1 -0
- package/lib/module/index.js +16 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/utils.js +0 -27
- package/lib/module/utils.js.map +1 -1
- package/lib/typescript/components/BottomTabs.d.ts +30 -0
- package/lib/typescript/components/BottomTabs.d.ts.map +1 -0
- package/lib/typescript/components/BottomTabsScreen.d.ts +56 -0
- package/lib/typescript/components/BottomTabsScreen.d.ts.map +1 -0
- package/lib/typescript/components/gamma/ScreenStackHost.d.ts +13 -0
- package/lib/typescript/components/gamma/ScreenStackHost.d.ts.map +1 -0
- package/lib/typescript/components/gamma/SplitViewHost.d.ts +13 -0
- package/lib/typescript/components/gamma/SplitViewHost.d.ts.map +1 -0
- package/lib/typescript/components/gamma/SplitViewScreen.d.ts +13 -0
- package/lib/typescript/components/gamma/SplitViewScreen.d.ts.map +1 -0
- package/lib/typescript/components/gamma/StackScreen.d.ts +21 -0
- package/lib/typescript/components/gamma/StackScreen.d.ts.map +1 -0
- package/lib/typescript/fabric/BottomTabsNativeComponent.d.ts +31 -0
- package/lib/typescript/fabric/BottomTabsNativeComponent.d.ts.map +1 -0
- package/lib/typescript/fabric/BottomTabsScreenNativeComponent.d.ts +51 -0
- package/lib/typescript/fabric/BottomTabsScreenNativeComponent.d.ts.map +1 -0
- package/lib/typescript/fabric/gamma/ScreenStackHostNativeComponent.d.ts +7 -0
- package/lib/typescript/fabric/gamma/ScreenStackHostNativeComponent.d.ts.map +1 -0
- package/lib/typescript/fabric/gamma/SplitViewHostNativeComponent.d.ts +16 -0
- package/lib/typescript/fabric/gamma/SplitViewHostNativeComponent.d.ts.map +1 -0
- package/lib/typescript/fabric/gamma/SplitViewScreenNativeComponent.d.ts +7 -0
- package/lib/typescript/fabric/gamma/SplitViewScreenNativeComponent.d.ts.map +1 -0
- package/lib/typescript/fabric/gamma/StackScreenNativeComponent.d.ts +15 -0
- package/lib/typescript/fabric/gamma/StackScreenNativeComponent.d.ts.map +1 -0
- package/lib/typescript/flags.d.ts +45 -0
- package/lib/typescript/flags.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +14 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/utils.d.ts +0 -26
- package/lib/typescript/utils.d.ts.map +1 -1
- package/package.json +34 -6
- package/react-native.config.js +2 -1
- package/src/components/BottomTabs.tsx +115 -0
- package/src/components/BottomTabsScreen.tsx +291 -0
- package/src/components/gamma/ScreenStackHost.tsx +32 -0
- package/src/components/gamma/SplitViewHost.tsx +84 -0
- package/src/components/gamma/SplitViewScreen.tsx +26 -0
- package/src/components/gamma/StackScreen.tsx +64 -0
- package/src/fabric/BottomTabsNativeComponent.ts +82 -0
- package/src/fabric/BottomTabsScreenNativeComponent.ts +107 -0
- package/src/fabric/gamma/ScreenStackHostNativeComponent.ts +8 -0
- package/src/fabric/gamma/SplitViewHostNativeComponent.ts +39 -0
- package/src/fabric/gamma/SplitViewScreenNativeComponent.ts +10 -0
- package/src/fabric/gamma/StackScreenNativeComponent.ts +25 -0
- package/src/flags.ts +72 -0
- package/src/index.tsx +18 -1
- package/src/utils.ts +0 -28
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
#import "RNSTabBarController.h"
|
|
2
|
+
#import <React/RCTAssert.h>
|
|
3
|
+
#import <React/RCTLog.h>
|
|
4
|
+
|
|
5
|
+
@implementation RNSTabBarController {
|
|
6
|
+
NSArray<RNSTabsScreenViewController *> *_Nullable _tabScreenControllers;
|
|
7
|
+
|
|
8
|
+
#if !RCT_NEW_ARCH_ENABLED
|
|
9
|
+
BOOL _isControllerFlushBlockScheduled;
|
|
10
|
+
#endif // !RCT_NEW_ARCH_ENABLED
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
- (instancetype)init
|
|
14
|
+
{
|
|
15
|
+
if (self = [super init]) {
|
|
16
|
+
_tabScreenControllers = nil;
|
|
17
|
+
_tabBarAppearanceCoordinator = [RNSTabBarAppearanceCoordinator new];
|
|
18
|
+
_tabsHostComponentView = nil;
|
|
19
|
+
|
|
20
|
+
#if !RCT_NEW_ARCH_ENABLED
|
|
21
|
+
_isControllerFlushBlockScheduled = NO;
|
|
22
|
+
#endif // !RCT_NEW_ARCH_ENABLED
|
|
23
|
+
}
|
|
24
|
+
return self;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
- (instancetype)initWithTabsHostComponentView:(nullable RNSBottomTabsHostComponentView *)tabsHostComponentView
|
|
28
|
+
{
|
|
29
|
+
if (self = [self init]) {
|
|
30
|
+
_tabsHostComponentView = tabsHostComponentView;
|
|
31
|
+
}
|
|
32
|
+
return self;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
|
|
36
|
+
{
|
|
37
|
+
NSLog(@"TabBar: %@ didSelectItem: %@", tabBar, item);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
#pragma mark-- Signals
|
|
41
|
+
|
|
42
|
+
- (void)childViewControllersHaveChangedTo:(NSArray<RNSTabsScreenViewController *> *)reactChildControllers
|
|
43
|
+
{
|
|
44
|
+
_tabScreenControllers = reactChildControllers;
|
|
45
|
+
self.needsUpdateOfReactChildrenControllers = true;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
- (void)setNeedsUpdateOfReactChildrenControllers:(bool)needsReactChildrenUpdate
|
|
49
|
+
{
|
|
50
|
+
_needsUpdateOfReactChildrenControllers = true;
|
|
51
|
+
self.needsUpdateOfSelectedTab = true;
|
|
52
|
+
#if !RCT_NEW_ARCH_ENABLED
|
|
53
|
+
[self scheduleControllerUpdateIfNeeded];
|
|
54
|
+
#endif // !RCT_NEW_ARCH_ENABLED
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
- (void)setNeedsUpdateOfSelectedTab:(bool)needsSelectedTabUpdate
|
|
58
|
+
{
|
|
59
|
+
_needsUpdateOfSelectedTab = needsSelectedTabUpdate;
|
|
60
|
+
#if !RCT_NEW_ARCH_ENABLED
|
|
61
|
+
[self scheduleControllerUpdateIfNeeded];
|
|
62
|
+
#endif // !RCT_NEW_ARCH_ENABLED
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
- (void)setNeedsUpdateOfTabBarAppearance:(bool)needsUpdateOfTabBarAppearance
|
|
66
|
+
{
|
|
67
|
+
_needsUpdateOfTabBarAppearance = needsUpdateOfTabBarAppearance;
|
|
68
|
+
#if !RCT_NEW_ARCH_ENABLED
|
|
69
|
+
[self scheduleControllerUpdateIfNeeded];
|
|
70
|
+
#endif // !RCT_NEW_ARCH_ENABLED
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
#pragma mark-- RNSReactTransactionObserving
|
|
74
|
+
|
|
75
|
+
- (void)reactMountingTransactionWillMount
|
|
76
|
+
{
|
|
77
|
+
NSLog(@"TabBarCtrl mountintTransactionWillMount");
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
- (void)reactMountingTransactionDidMount
|
|
81
|
+
{
|
|
82
|
+
NSLog(@"TabBarCtrl mountintTransactionDidMount running updates");
|
|
83
|
+
[self updateReactChildrenControllersIfNeeded];
|
|
84
|
+
[self updateSelectedViewControllerIfNeeded];
|
|
85
|
+
[self updateTabBarAppearanceIfNeeded];
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
#pragma mark-- Signals related
|
|
89
|
+
|
|
90
|
+
- (void)updateReactChildrenControllersIfNeeded
|
|
91
|
+
{
|
|
92
|
+
if (_needsUpdateOfReactChildrenControllers) {
|
|
93
|
+
[self updateReactChildrenControllers];
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
- (void)updateReactChildrenControllers
|
|
98
|
+
{
|
|
99
|
+
NSLog(@"TabBarCtrl updateReactChildrenControllers");
|
|
100
|
+
_needsUpdateOfReactChildrenControllers = false;
|
|
101
|
+
|
|
102
|
+
if (_tabScreenControllers == nil) {
|
|
103
|
+
RCTLogWarn(@"[RNScreens] Attempt to update react children while the _updatedChildren array is nil!");
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
[self setViewControllers:_tabScreenControllers animated:[[self viewControllers] count] != 0];
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
- (void)updateSelectedViewControllerIfNeeded
|
|
111
|
+
{
|
|
112
|
+
if (_needsUpdateOfSelectedTab) {
|
|
113
|
+
[self updateSelectedViewController];
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
- (void)updateSelectedViewController
|
|
118
|
+
{
|
|
119
|
+
NSLog(@"TabBarCtrl updateSelectedViewController");
|
|
120
|
+
_needsUpdateOfSelectedTab = false;
|
|
121
|
+
|
|
122
|
+
#if !defined(NDEBUG)
|
|
123
|
+
[self assertExactlyOneFocusedTab];
|
|
124
|
+
#endif
|
|
125
|
+
|
|
126
|
+
RNSTabsScreenViewController *_Nullable selectedViewController = nil;
|
|
127
|
+
for (RNSTabsScreenViewController *tabViewController in self.viewControllers) {
|
|
128
|
+
NSLog(
|
|
129
|
+
@"Update Selected View Controller [%ld] isFocused %d",
|
|
130
|
+
tabViewController.tabScreenComponentView.tag,
|
|
131
|
+
tabViewController.tabScreenComponentView.isSelectedScreen);
|
|
132
|
+
if (tabViewController.tabScreenComponentView.isSelectedScreen == true) {
|
|
133
|
+
selectedViewController = tabViewController;
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
RCTAssert(selectedViewController != nil, @"[RNScreens] No selected view controller!");
|
|
139
|
+
|
|
140
|
+
NSLog(@"Change selected view controller to: %@", selectedViewController);
|
|
141
|
+
|
|
142
|
+
[selectedViewController.tabScreenComponentView overrideScrollViewBehaviorInFirstDescendantChainIfNeeded];
|
|
143
|
+
[self setSelectedViewController:selectedViewController];
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
- (void)updateTabBarAppearanceIfNeeded
|
|
147
|
+
{
|
|
148
|
+
if (_needsUpdateOfTabBarAppearance) {
|
|
149
|
+
[self updateTabBarAppearance];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
- (void)updateTabBarAppearance
|
|
154
|
+
{
|
|
155
|
+
NSLog(@"TabBarCtrl updateTabBarAppearance");
|
|
156
|
+
_needsUpdateOfTabBarAppearance = false;
|
|
157
|
+
|
|
158
|
+
[_tabBarAppearanceCoordinator updateAppearanceOfTabBar:[self tabBar]
|
|
159
|
+
withHostComponentView:self.tabsHostComponentView
|
|
160
|
+
tabScreenControllers:_tabScreenControllers
|
|
161
|
+
imageLoader:[self.tabsHostComponentView reactImageLoader]];
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
#if !defined(NDEBUG)
|
|
165
|
+
- (void)assertExactlyOneFocusedTab
|
|
166
|
+
{
|
|
167
|
+
int selectedCount = 0;
|
|
168
|
+
for (RNSTabsScreenViewController *tabViewController in _tabScreenControllers) {
|
|
169
|
+
if (tabViewController.tabScreenComponentView.isSelectedScreen) {
|
|
170
|
+
++selectedCount;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
RCTAssert(
|
|
174
|
+
selectedCount == 1, @"[RNScreens] Invariant violation. Expected exactly 1 focused tab, got: %d", selectedCount);
|
|
175
|
+
}
|
|
176
|
+
#endif
|
|
177
|
+
|
|
178
|
+
#if !RCT_NEW_ARCH_ENABLED
|
|
179
|
+
|
|
180
|
+
#pragma mark - LEGACY Paper scheduling methods
|
|
181
|
+
|
|
182
|
+
// TODO: These could be moved to separate scheduler class
|
|
183
|
+
|
|
184
|
+
- (void)scheduleControllerUpdateIfNeeded
|
|
185
|
+
{
|
|
186
|
+
if (_isControllerFlushBlockScheduled) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
_isControllerFlushBlockScheduled = YES;
|
|
191
|
+
|
|
192
|
+
auto *__weak weakSelf = self;
|
|
193
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
194
|
+
auto *strongSelf = weakSelf;
|
|
195
|
+
if (strongSelf == nil) {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
strongSelf->_isControllerFlushBlockScheduled = NO;
|
|
199
|
+
[strongSelf reactMountingTransactionWillMount];
|
|
200
|
+
[strongSelf reactMountingTransactionDidMount];
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
#endif // !RCT_NEW_ARCH_ENABLED
|
|
205
|
+
|
|
206
|
+
@end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#import "RNSTabBarControllerDelegate.h"
|
|
2
|
+
#import <React/RCTAssert.h>
|
|
3
|
+
#import "RNSTabBarController.h"
|
|
4
|
+
#import "RNSTabsScreenViewController.h"
|
|
5
|
+
|
|
6
|
+
@implementation RNSTabBarControllerDelegate
|
|
7
|
+
|
|
8
|
+
- (BOOL)tabBarController:(UITabBarController *)tabBarController
|
|
9
|
+
shouldSelectViewController:(UIViewController *)viewController
|
|
10
|
+
{
|
|
11
|
+
// TODO: This will crash with "More" view controller.
|
|
12
|
+
RCTAssert(
|
|
13
|
+
[tabBarController isKindOfClass:RNSTabBarController.class],
|
|
14
|
+
@"[RNScreens] Unexpected type of controller: %@",
|
|
15
|
+
tabBarController.class);
|
|
16
|
+
RCTAssert(
|
|
17
|
+
[viewController isKindOfClass:RNSTabsScreenViewController.class],
|
|
18
|
+
@"[RNScreens] Unexpected type of controller: %@",
|
|
19
|
+
viewController.class);
|
|
20
|
+
|
|
21
|
+
RNSTabBarController *tabBarCtrl = static_cast<RNSTabBarController *>(tabBarController);
|
|
22
|
+
RNSTabsScreenViewController *tabScreenCtrl = static_cast<RNSTabsScreenViewController *>(viewController);
|
|
23
|
+
|
|
24
|
+
bool repeatedSelectionHandledNatively = false;
|
|
25
|
+
|
|
26
|
+
// Detect repeated selection and inform tabScreenController
|
|
27
|
+
if ([tabBarCtrl selectedViewController] == tabScreenCtrl) {
|
|
28
|
+
repeatedSelectionHandledNatively = [tabScreenCtrl tabScreenSelectedRepeatedly];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// TODO: send an event with information about event being handled natively
|
|
32
|
+
if (!repeatedSelectionHandledNatively) {
|
|
33
|
+
[tabBarCtrl.tabsHostComponentView
|
|
34
|
+
emitOnNativeFocusChangeRequestSelectedTabScreen:tabScreenCtrl.tabScreenComponentView];
|
|
35
|
+
|
|
36
|
+
// TODO: handle overrideScrollViewBehaviorInFirstDescendantChainIfNeeded for natively-driven tabs
|
|
37
|
+
return ![self shouldPreventNativeTabChangeWithinTabBarController:tabBarCtrl];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// As we're selecting the same controller, returning both true and false works here.
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
- (void)tabBarController:(UITabBarController *)tabBarController
|
|
45
|
+
didSelectViewController:(UIViewController *)viewController
|
|
46
|
+
{
|
|
47
|
+
RCTAssert(
|
|
48
|
+
[tabBarController isKindOfClass:RNSTabBarController.class],
|
|
49
|
+
@"[RNScreens] Unexpected type of controller: %@",
|
|
50
|
+
tabBarController.class);
|
|
51
|
+
RCTAssert(
|
|
52
|
+
[viewController isKindOfClass:RNSTabsScreenViewController.class],
|
|
53
|
+
@"[RNScreens] Unexpected type of controller: %@",
|
|
54
|
+
viewController.class);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
- (bool)shouldPreventNativeTabChangeWithinTabBarController:(nonnull RNSTabBarController *)tabBarCtrl
|
|
58
|
+
{
|
|
59
|
+
// This handles the tabsHostComponentView nullability
|
|
60
|
+
return [tabBarCtrl.tabsHostComponentView experimental_controlNavigationStateInJS] ?: NO;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#import <UIKit/UIKit.h>
|
|
2
|
+
#import "RNSBottomTabsScreenComponentView.h"
|
|
3
|
+
#import "RNSBottomTabsSpecialEffectsSupporting.h"
|
|
4
|
+
|
|
5
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
6
|
+
|
|
7
|
+
@interface RNSTabsScreenViewController : UIViewController
|
|
8
|
+
|
|
9
|
+
@property (nonatomic, strong, readonly, nullable) RNSBottomTabsScreenComponentView *tabScreenComponentView;
|
|
10
|
+
@property (nonatomic, weak, readonly, nullable) id<RNSBottomTabsSpecialEffectsSupporting> tabsSpecialEffectsDelegate;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Tell the controller that the tab screen it owns has got its react-props-focus changed.
|
|
14
|
+
*/
|
|
15
|
+
- (void)tabScreenFocusHasChanged;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Tell the controller that the tab screen it owns has got its react-props related to appearance changed.
|
|
19
|
+
*/
|
|
20
|
+
- (void)tabItemAppearanceHasChanged;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Tell the controller that the tab item related to this controller has been selected again after being presented.
|
|
24
|
+
* Returns boolean indicating whether the action has been handled.
|
|
25
|
+
*/
|
|
26
|
+
- (bool)tabScreenSelectedRepeatedly;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Set new special effects delegate.
|
|
30
|
+
*/
|
|
31
|
+
- (void)setTabsSpecialEffectsDelegate:(nonnull id<RNSBottomTabsSpecialEffectsSupporting>)delegate;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Inform the controller about resignation from being special effects delegate. If resignation comes from current
|
|
35
|
+
* tabsSpecialEffectsDelegate, this method sets tabsSpecialEffectsDelegate to nil. If tabsSpecialEffectsDelegate has
|
|
36
|
+
* already changed (to other delegate or nil), this method does nothing.
|
|
37
|
+
*/
|
|
38
|
+
- (void)clearTabsSpecialEffectsDelegateIfNeeded:(nonnull id<RNSBottomTabsSpecialEffectsSupporting>)delegate;
|
|
39
|
+
|
|
40
|
+
@end
|
|
41
|
+
|
|
42
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
#import "RNSTabsScreenViewController.h"
|
|
2
|
+
#import "RNSScrollViewFinder.h"
|
|
3
|
+
#import "RNSTabBarController.h"
|
|
4
|
+
#import "UIScrollView+RNScreens.h"
|
|
5
|
+
|
|
6
|
+
@implementation RNSTabsScreenViewController
|
|
7
|
+
|
|
8
|
+
- (nullable RNSTabBarController *)findTabBarController
|
|
9
|
+
{
|
|
10
|
+
return static_cast<RNSTabBarController *_Nullable>(self.tabBarController);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
- (nullable RNSBottomTabsScreenComponentView *)tabScreenComponentView
|
|
14
|
+
{
|
|
15
|
+
return static_cast<RNSBottomTabsScreenComponentView *>(self.view);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
- (void)tabScreenFocusHasChanged
|
|
19
|
+
{
|
|
20
|
+
NSLog(
|
|
21
|
+
@"TabScreen [%ld] changed focus: %d",
|
|
22
|
+
self.tabScreenComponentView.tag,
|
|
23
|
+
self.tabScreenComponentView.isSelectedScreen);
|
|
24
|
+
|
|
25
|
+
// The focus of owned tab has been updated from react. We tell the parent controller that it should update the
|
|
26
|
+
// container.
|
|
27
|
+
[[self findTabBarController] setNeedsUpdateOfSelectedTab:true];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
- (void)tabItemAppearanceHasChanged
|
|
31
|
+
{
|
|
32
|
+
[[self findTabBarController] setNeedsUpdateOfTabBarAppearance:true];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
- (void)viewWillAppear:(BOOL)animated
|
|
36
|
+
{
|
|
37
|
+
[self.tabScreenComponentView.reactEventEmitter emitOnWillAppear];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
- (void)viewDidAppear:(BOOL)animated
|
|
41
|
+
{
|
|
42
|
+
[self.tabScreenComponentView.reactEventEmitter emitOnDidAppear];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
- (void)viewWillDisappear:(BOOL)animated
|
|
46
|
+
{
|
|
47
|
+
[self.tabScreenComponentView.reactEventEmitter emitOnWillDisappear];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
- (void)viewDidDisappear:(BOOL)animated
|
|
51
|
+
{
|
|
52
|
+
[self.tabScreenComponentView.reactEventEmitter emitOnDidDisappear];
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
- (void)didMoveToParentViewController:(UIViewController *)parent
|
|
56
|
+
{
|
|
57
|
+
NSLog(@"TabScreen [%ld] ctrl moved to parent: %@", self.tabScreenComponentView.tag, parent);
|
|
58
|
+
|
|
59
|
+
if (parent == nil) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
RCTAssert(
|
|
64
|
+
[parent isKindOfClass:RNSTabBarController.class],
|
|
65
|
+
@"[RNScreens] TabScreenViewController added to parent of unexpected type: %@",
|
|
66
|
+
parent.class);
|
|
67
|
+
|
|
68
|
+
RNSTabBarController *tabBarCtrl = [self findTabBarController];
|
|
69
|
+
|
|
70
|
+
RCTAssert(
|
|
71
|
+
tabBarCtrl != nil, @"[RNScreens] nullish tabBarCtrl after TabScreenViewController has been added to parent");
|
|
72
|
+
|
|
73
|
+
[tabBarCtrl setNeedsUpdateOfTabBarAppearance:true];
|
|
74
|
+
[tabBarCtrl updateTabBarAppearanceIfNeeded];
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
- (void)setTabsSpecialEffectsDelegate:(id<RNSBottomTabsSpecialEffectsSupporting>)delegate
|
|
78
|
+
{
|
|
79
|
+
RCTAssert(
|
|
80
|
+
delegate != nil,
|
|
81
|
+
@"[RNScreens] can't set special effects delegate to nil. Use clearTabsSpecialEffectsDelegateIfNeeded instead.");
|
|
82
|
+
_tabsSpecialEffectsDelegate = delegate;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
- (void)clearTabsSpecialEffectsDelegateIfNeeded:(id<RNSBottomTabsSpecialEffectsSupporting>)delegate
|
|
86
|
+
{
|
|
87
|
+
if (_tabsSpecialEffectsDelegate == delegate) {
|
|
88
|
+
_tabsSpecialEffectsDelegate = nil;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
- (bool)tabScreenSelectedRepeatedly
|
|
93
|
+
{
|
|
94
|
+
if ([self tabsSpecialEffectsDelegate] != nil) {
|
|
95
|
+
return [[self tabsSpecialEffectsDelegate] onRepeatedTabSelectionOfTabScreenController:self];
|
|
96
|
+
} else if (self.tabScreenComponentView.shouldUseRepeatedTabSelectionScrollToTopSpecialEffect) {
|
|
97
|
+
UIScrollView *scrollView =
|
|
98
|
+
[RNSScrollViewFinder findScrollViewInFirstDescendantChainFrom:[self tabScreenComponentView]];
|
|
99
|
+
return [scrollView rnscreens_scrollToTop];
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
@end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#import "RNSBottomTabsHostComponentView.h"
|
|
2
|
+
|
|
3
|
+
#if defined(__cplusplus) && RCT_NEW_ARCH_ENABLED
|
|
4
|
+
#import "RNSBottomTabsShadowNode.h"
|
|
5
|
+
#endif // defined(__cplusplus) && RCT_NEW_ARCH_ENABLED
|
|
6
|
+
|
|
7
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
8
|
+
|
|
9
|
+
#if defined(__cplusplus) && RCT_NEW_ARCH_ENABLED
|
|
10
|
+
|
|
11
|
+
@class RCTImageLoader;
|
|
12
|
+
|
|
13
|
+
@interface RNSBottomTabsHostComponentView (RNSImageLoader)
|
|
14
|
+
|
|
15
|
+
- (nullable RCTImageLoader *)retrieveImageLoaderFromState:(facebook::react::RNSBottomTabsShadowNode::ConcreteState::Shared)state;
|
|
16
|
+
|
|
17
|
+
@end
|
|
18
|
+
|
|
19
|
+
#endif // defined(__cplusplus) && RCT_NEW_ARCH_ENABLED
|
|
20
|
+
|
|
21
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#import "RNSBottomTabsHostComponentView+RNSImageLoader.h"
|
|
2
|
+
|
|
3
|
+
#if RCT_NEW_ARCH_ENABLED
|
|
4
|
+
|
|
5
|
+
#import <React/RCTImageLoader.h>
|
|
6
|
+
#import <react/utils/ManagedObjectWrapper.h>
|
|
7
|
+
|
|
8
|
+
@implementation RNSBottomTabsHostComponentView (RNSImageLoader)
|
|
9
|
+
|
|
10
|
+
- (nullable RCTImageLoader *)retrieveImageLoaderFromState:(facebook::react::RNSBottomTabsShadowNode::ConcreteState::Shared)receivedState
|
|
11
|
+
{
|
|
12
|
+
if (auto imgLoaderPtr = receivedState.get()->getData().getImageLoader().lock()) {
|
|
13
|
+
return react::unwrapManagedObject(imgLoaderPtr);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
RCTLogWarn(@"[RNScreens] unable to retrieve RCTImageLoader");
|
|
17
|
+
return nil;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
@end
|
|
21
|
+
|
|
22
|
+
#endif // RCT_NEW_ARCH_ENABLED
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Hide C++ symbols from C compiler used when building Swift module
|
|
2
|
+
#if defined(__cplusplus)
|
|
3
|
+
|
|
4
|
+
#pragma mark - New architecture definitions
|
|
5
|
+
#if RCT_NEW_ARCH_ENABLED
|
|
6
|
+
|
|
7
|
+
#import <React/RCTViewComponentView.h>
|
|
8
|
+
|
|
9
|
+
@interface RNSReactBaseView : RCTViewComponentView
|
|
10
|
+
@end
|
|
11
|
+
|
|
12
|
+
#else
|
|
13
|
+
#pragma mark - Legacy architecture definitions
|
|
14
|
+
|
|
15
|
+
#import <React/RCTView.h>
|
|
16
|
+
|
|
17
|
+
@interface RNSReactBaseView : RCTView
|
|
18
|
+
@end
|
|
19
|
+
|
|
20
|
+
#endif // RCT_NEW_ARCH_ENABLED
|
|
21
|
+
|
|
22
|
+
#else
|
|
23
|
+
|
|
24
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
25
|
+
|
|
26
|
+
@interface RNSReactBaseView : UIView
|
|
27
|
+
@end
|
|
28
|
+
|
|
29
|
+
NS_ASSUME_NONNULL_END
|
|
30
|
+
|
|
31
|
+
#endif // __cplusplus
|