From 67b5798aa795235576f56c63ef7053247ba0a377 Mon Sep 17 00:00:00 2001 From: Sergei Butko Date: Fri, 3 Sep 2021 14:14:17 +0300 Subject: [PATCH] Add popToRoot option to bottomTab on Android (#7244) --- .../reactnativenavigation/options/BottomTabOptions.java | 4 ++++ .../viewcontrollers/bottomtabs/BottomTabsController.java | 2 +- lib/src/interfaces/Options.ts | 5 +++++ website/docs/api/options-bottomTab.mdx | 8 ++++++++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/android/app/src/main/java/com/reactnativenavigation/options/BottomTabOptions.java b/lib/android/app/src/main/java/com/reactnativenavigation/options/BottomTabOptions.java index e36301d9e13..24e22b0a994 100644 --- a/lib/android/app/src/main/java/com/reactnativenavigation/options/BottomTabOptions.java +++ b/lib/android/app/src/main/java/com/reactnativenavigation/options/BottomTabOptions.java @@ -43,6 +43,7 @@ public static BottomTabOptions parse(Context context, TypefaceLoader typefaceMan options.selectedFontSize = NumberParser.parse(json, "selectedFontSize"); options.dotIndicator = DotIndicatorOptions.parse(context, json.optJSONObject("dotIndicator")); options.selectTabOnPress = BoolParser.parse(json, "selectTabOnPress"); + options.popToRoot = BoolParser.parse(json, "popToRoot"); return options; } @@ -64,6 +65,7 @@ public static BottomTabOptions parse(Context context, TypefaceLoader typefaceMan public Number fontSize = new NullNumber(); public Number selectedFontSize = new NullNumber(); public Bool selectTabOnPress = new NullBool(); + public Bool popToRoot = new NullBool(); public FontOptions font = new FontOptions(); @@ -87,6 +89,7 @@ void mergeWith(final BottomTabOptions other) { font.mergeWith(other.font); if (other.dotIndicator.hasValue()) dotIndicator = other.dotIndicator; if (other.selectTabOnPress.hasValue()) selectTabOnPress = other.selectTabOnPress; + if (other.popToRoot.hasValue()) popToRoot = other.popToRoot; } void mergeWithDefault(final BottomTabOptions defaultOptions) { @@ -109,6 +112,7 @@ void mergeWithDefault(final BottomTabOptions defaultOptions) { if (!testId.hasValue()) testId = defaultOptions.testId; if (!dotIndicator.hasValue()) dotIndicator = defaultOptions.dotIndicator; if (!selectTabOnPress.hasValue()) selectTabOnPress = defaultOptions.selectTabOnPress; + if (!popToRoot.hasValue()) popToRoot = defaultOptions.popToRoot; } diff --git a/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsController.java b/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsController.java index d973e29b7fd..1842b53b88c 100644 --- a/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsController.java +++ b/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsController.java @@ -183,7 +183,7 @@ public boolean onTabSelected(int index, boolean wasSelected) { } } - if (wasSelected && stack instanceof StackController) { + if (options.popToRoot.get(false) && wasSelected && stack instanceof StackController) { ((StackController) stack).popToRoot(Options.EMPTY, new CommandListenerAdapter()); } diff --git a/lib/src/interfaces/Options.ts b/lib/src/interfaces/Options.ts index 19695c29ff1..edfaf62cbd6 100644 --- a/lib/src/interfaces/Options.ts +++ b/lib/src/interfaces/Options.ts @@ -1005,6 +1005,11 @@ export interface OptionsBottomTab { * instead it will emit a bottomTabPressedEvent */ selectTabOnPress?: boolean; + /** + * Pop to root of stack by tapping on already selected tab + * #### (Android specific) + */ + popToRoot?: boolean; } export interface SideMenuSide { diff --git a/website/docs/api/options-bottomTab.mdx b/website/docs/api/options-bottomTab.mdx index c857076061a..a9df54180b0 100644 --- a/website/docs/api/options-bottomTab.mdx +++ b/website/docs/api/options-bottomTab.mdx @@ -17,6 +17,14 @@ const options = { | ------- | -------- | -------- | | boolean | No | Both | +## `popToRoot` + +Pop to root of stack by tapping on already selected tab. + +| Type | Required | Platform | +| ------- | -------- | --------- | +| boolean | No | Android | + ## `badge` | Type | Required | Platform |