package com.reactnativenavigation.bridge;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
import com.reactnativenavigation.controllers.NavigationCommandsHandler;
import com.reactnativenavigation.params.ContextualMenuParams;
import com.reactnativenavigation.params.FabParams;
import com.reactnativenavigation.params.LightBoxParams;
import com.reactnativenavigation.params.SlidingOverlayParams;
import com.reactnativenavigation.params.SnackbarParams;
import com.reactnativenavigation.params.TitleBarButtonParams;
import com.reactnativenavigation.params.TitleBarLeftButtonParams;
import com.reactnativenavigation.params.parsers.ContextualMenuParamsParser;
import com.reactnativenavigation.params.parsers.FabParamsParser;
import com.reactnativenavigation.params.parsers.LightBoxParamsParser;
import com.reactnativenavigation.params.parsers.SlidingOverlayParamsParser;
import com.reactnativenavigation.params.parsers.SnackbarParamsParser;
import com.reactnativenavigation.params.parsers.TitleBarButtonParamsParser;
import com.reactnativenavigation.params.parsers.TitleBarLeftButtonParamsParser;
import com.reactnativenavigation.views.SideMenu.Side;
import java.util.List;
/**
* The basic abstract components we will expose:
* BottomTabs (app) - boolean
* TopBar (per screen)
* - TitleBar
* - - RightButtons
* - - LeftButton
* - TopTabs (segmented control / view pager tabs)
* DeviceStatusBar (app) (colors are per screen)
* AndroidNavigationBar (app) (colors are per screen)
* SideMenu (app) - boolean, (menu icon is screen-based)
*/
public class NavigationReactModule extends ReactContextBaseJavaModule {
public static final String NAME = "NavigationReactModule";
public NavigationReactModule(ReactApplicationContext reactContext) {
super(reactContext);
}
@Override
public String getName() {
return NAME;
}
@ReactMethod
public void startApp(final ReadableMap params) {
NavigationCommandsHandler.startApp(BundleConverter.toBundle(params));
}
@ReactMethod
public void setScreenTitleBarTitle(String screenInstanceId, String title) {
NavigationCommandsHandler.setScreenTitleBarTitle(screenInstanceId, title);
}
@ReactMethod
public void setScreenTitleBarSubtitle(String screenInstanceId, String subtitle) {
NavigationCommandsHandler.setScreenTitleBarSubtitle(screenInstanceId, subtitle);
}
@ReactMethod
public void setScreenButtons(String screenInstanceId, String navigatorEventId,
ReadableArray rightButtonsParams, ReadableMap leftButtonParams, ReadableMap fab) {
if (rightButtonsParams != null) {
setScreenTitleBarRightButtons(screenInstanceId, navigatorEventId, rightButtonsParams);
}
if (leftButtonParams != null) {
setScreenTitleBarLeftButton(screenInstanceId, navigatorEventId, leftButtonParams);
}
if (fab != null) {
setScreenFab(screenInstanceId, navigatorEventId, fab);
}
}
private void setScreenTitleBarRightButtons(String screenInstanceId, String navigatorEventId, ReadableArray rightButtonsParams) {
List<TitleBarButtonParams> rightButtons = new TitleBarButtonParamsParser()
.parseButtons(BundleConverter.toBundle(rightButtonsParams));
NavigationCommandsHandler.setScreenTitleBarRightButtons(screenInstanceId, navigatorEventId, rightButtons);
}
private void setScreenTitleBarLeftButton(String screenInstanceId, String navigatorEventId, ReadableMap leftButtonParams) {
TitleBarLeftButtonParams leftButton = new TitleBarLeftButtonParamsParser()
.parseSingleButton(BundleConverter.toBundle(leftButtonParams));
NavigationCommandsHandler.setScreenTitleBarLeftButtons(screenInstanceId, navigatorEventId, leftButton);
}
private void setScreenFab(String screenInstanceId, String navigatorEventId, ReadableMap fab) {
FabParams fabParams = new FabParamsParser().parse(BundleConverter.toBundle(fab), navigatorEventId, screenInstanceId);
NavigationCommandsHandler.setScreenFab(screenInstanceId, navigatorEventId, fabParams);
}
@ReactMethod
public void setScreenStyle(String screenInstanceId, ReadableMap style) {
NavigationCommandsHandler.setScreenStyle(screenInstanceId, BundleConverter.toBundle(style));
}
@ReactMethod
public void setBottomTabBadgeByIndex(Integer index, String badge) {
NavigationCommandsHandler.setBottomTabBadgeByIndex(index, badge);
}
@ReactMethod
public void setBottomTabBadgeByNavigatorId(String navigatorId, String badge) {
NavigationCommandsHandler.setBottomTabBadgeByNavigatorId(navigatorId, badge);
}
@ReactMethod
public void setBottomTabButtonByIndex(Integer index, final ReadableMap params) {
NavigationCommandsHandler.setBottomTabButtonByIndex(index, BundleConverter.toBundle(params));
}
@ReactMethod
public void setBottomTabButtonByNavigatorId(String navigatorId, final ReadableMap params) {
NavigationCommandsHandler.setBottomTabButtonByNavigatorId(navigatorId, BundleConverter.toBundle(params));
}
@ReactMethod
public void selectBottomTabByTabIndex(Integer index) {
NavigationCommandsHandler.selectBottomTabByTabIndex(index);
}
@ReactMethod
public void selectBottomTabByNavigatorId(String navigatorId) {
NavigationCommandsHandler.selectBottomTabByNavigatorId(navigatorId);
}
@ReactMethod
public void selectTopTabByTabIndex(String screenInstanceId, int index) {
NavigationCommandsHandler.selectTopTabByTabIndex(screenInstanceId, index);
}
@ReactMethod
public void selectTopTabByScreen(String screenInstanceId) {
NavigationCommandsHandler.selectTopTabByScreen(screenInstanceId);
}
@ReactMethod
public void toggleSideMenuVisible(boolean animated, String side) {
NavigationCommandsHandler.toggleSideMenuVisible(animated, Side.fromString(side));
}
@ReactMethod
public void setSideMenuVisible(boolean animated, boolean visible, String side) {
NavigationCommandsHandler.setSideMenuVisible(animated, visible, Side.fromString(side));
}
@ReactMethod
public void toggleTopBarVisible(final ReadableMap params) {
}
@ReactMethod
public void setTopBarVisible(String screenInstanceId, boolean hidden, boolean animated) {
NavigationCommandsHandler.setTopBarVisible(screenInstanceId, hidden, animated);
}
@ReactMethod
public void toggleBottomTabsVisible(final ReadableMap params) {
}
@ReactMethod
public void setBottomTabsVisible(boolean hidden, boolean animated) {
NavigationCommandsHandler.setBottomTabsVisible(hidden, animated);
}
@ReactMethod
public void push(final ReadableMap params) {
NavigationCommandsHandler.push(BundleConverter.toBundle(params));
}
@ReactMethod
public void pop(final ReadableMap params) {
NavigationCommandsHandler.pop(BundleConverter.toBundle(params));
}
@ReactMethod
public void popToRoot(final ReadableMap params) {
NavigationCommandsHandler.popToRoot(BundleConverter.toBundle(params));
}
@ReactMethod
public void newStack(final ReadableMap params) {
NavigationCommandsHandler.newStack(BundleConverter.toBundle(params));
}
@ReactMethod
public void showModal(final ReadableMap params) {
NavigationCommandsHandler.showModal(BundleConverter.toBundle(params));
}
@ReactMethod
public void showLightBox(final ReadableMap params) {
LightBoxParams lbp = new LightBoxParamsParser(BundleConverter.toBundle(params)).parse();
NavigationCommandsHandler.showLightBox(lbp);
}
@ReactMethod
public void dismissLightBox() {
NavigationCommandsHandler.dismissLightBox();
}
@ReactMethod
public void dismissAllModals() {
NavigationCommandsHandler.dismissAllModals();
}
@ReactMethod
public void dismissTopModal() {
NavigationCommandsHandler.dismissTopModal();
}
@ReactMethod
public void showSlidingOverlay(final ReadableMap params) {
SlidingOverlayParams slidingOverlayParams = new SlidingOverlayParamsParser().parse(BundleConverter.toBundle(params));
NavigationCommandsHandler.showSlidingOverlay(slidingOverlayParams);
}
@ReactMethod
public void hideSlidingOverlay(final ReadableMap params) {
NavigationCommandsHandler.hideSlidingOverlay();
}
@ReactMethod
public void showSnackbar(final ReadableMap params) {
SnackbarParams snackbarParams = new SnackbarParamsParser().parse(BundleConverter.toBundle(params));
NavigationCommandsHandler.showSnackbar(snackbarParams);
}
@ReactMethod
public void dismissSnackbar() {
NavigationCommandsHandler.dismissSnackbar();
}
@ReactMethod
public void showContextualMenu(final String screenInstanceId, final ReadableMap params, final Callback onButtonClicked) {
ContextualMenuParams contextualMenuParams =
new ContextualMenuParamsParser().parse(BundleConverter.toBundle(params));
NavigationCommandsHandler.showContextualMenu(screenInstanceId, contextualMenuParams, onButtonClicked);
}
@ReactMethod
public void dismissContextualMenu(String screenInstanceId) {
NavigationCommandsHandler.dismissContextualMenu(screenInstanceId);
}
@ReactMethod
public void getOrientation(Promise promise) {
NavigationCommandsHandler.getOrientation(promise);
}
}