packages/@fbcmobile-ui/Services/NavigationService.js (65 lines of code) (raw):
/**
 * Copyright (c) Facebook, Inc. and its affiliates.
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @flow strict-local
 * @format
 */
'use strict';
import {NavigationActions, StackActions} from 'react-navigation';
import type {NavigationParams} from 'react-navigation';
/**
 * The navigation is implemented as a service so that it can be used outside of
 * components, for example in sagas.
 *
 * @see https://reactnavigation.org/docs/en/navigating-without-navigation-prop.html
 */
export type AlertType = 'info' | 'warn' | 'error' | 'success';
export type DropdownType = ?{
  alertWithType: (type: AlertType, title: string, message: string) => void,
};
let navigator;
let dropDownAlert: DropdownType;
function setDropDownAlert(ref?: DropdownType) {
  dropDownAlert = ref;
}
function alert(type: AlertType, title: string, message: string = '') {
  dropDownAlert && dropDownAlert.alertWithType(type, title, message);
}
function getNavigator() {
  return navigator;
}
/**
 * This function is called when the RootScreen is created to set the navigator instance to use.
 */
function setTopLevelNavigator(navigatorRef: any) {
  navigator = navigatorRef;
}
/**
 * Call this function when you want to navigate to a specific route.
 *
 * @param routeName The name of the route to navigate to. Routes are defined in
 * RootScreen using createStackNavigator()
 * @param params Route parameters.
 */
function navigate(routeName: string, params?: NavigationParams) {
  navigator.dispatch(
    NavigationActions.navigate({
      routeName,
      params,
    }),
  );
}
/**
 * Call this function when you want to push a screen while in a StackNavigator.
 *
 * @param routeName The name of the route to navigate to.
 * @param params Route parameters
 */
function push(routeName: string, params?: NavigationParams) {
  navigator.dispatch(
    StackActions.push({
      routeName,
      params,
    }),
  );
}
/**
 * Call this function when you want to pop a screen while in a StackNavigator.
 *
 * @param n The number of screens to pop off the stack.
 */
function pop(n?: number) {
  navigator.dispatch(StackActions.pop({n}));
}
/**
 * Call this function when you want to navigate to a specific route AND reset the
 * navigation history.
 *
 * That means the user cannot go back. This is useful for example to redirect from
 * a splashscreen to the main screen: the user should not be able to go back to the splashscreen.
 *
 * @param routeName The name of the route to navigate to. Routes are defined in RootScreen
 * using createStackNavigator()
 * @param params Route parameters.
 */
function navigateAndReset(routeName: string, params: NavigationParams) {
  navigator.dispatch(
    StackActions.reset({
      index: 0,
      key: null,
      actions: [
        NavigationActions.navigate({
          routeName,
          params,
        }),
      ],
    }),
  );
}
export default {
  dropDownAlert,
  alert,
  setDropDownAlert,
  navigate,
  push,
  pop,
  navigateAndReset,
  setTopLevelNavigator,
  getNavigator,
};