// Type definitions for react-navigation 1.0 // Project: https://github.com/react-community/react-navigation // Definitions by: Huhuanming // mhcgrq // fangpenlin // abrahambotros // petejkim // Kyle Roach // phanalpha // charlesfamu // Tim Wang // Qibang Sun // Sergei Butko: // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped // TypeScript Version: 2.6 /** * BEGIN FLOW TYPEDEFINITION.JS PORT * Reference: https://github.com/react-community/react-navigation/tree/52a2846e77119148320bcea83b8982a8bc6acce3 * * NOTE: Please update the commit/link above when updating to a new Flow * TypeDefinition.js reference, so we can conveniently just look at diffs on * TypeDefinition.js between this latest reference point and the one you are * using when making new updates. */ import * as React from 'react'; import { Animated, TextStyle, ViewStyle, StyleProp, } from 'react-native'; // @todo when we split types into common, native and web, // we can properly change Animated.Value to its real value export type AnimatedValue = any; export type HeaderMode = 'float' | 'screen' | 'none'; export interface HeaderProps extends NavigationSceneRendererProps { mode: HeaderMode; router: NavigationRouter< NavigationState, NavigationAction, NavigationStackScreenOptions >; getScreenDetails: (navigationScene: NavigationScene) => NavigationScreenDetails< NavigationStackScreenOptions >; style: StyleProp; } /** * NavigationState is a tree of routes for a single navigator, where each child * route may either be a NavigationScreenRoute or a NavigationRouterRoute. * NavigationScreenRoute represents a leaf screen, while the * NavigationRouterRoute represents the state of a child navigator. * * NOTE: NavigationState is a state tree local to a single navigator and * its child navigators (via the routes field). * If we're in navigator nested deep inside the app, the state will only be the * state for that navigator. * The state for the root navigator of our app represents the whole navigation * state for the whole app. */ export interface NavigationState { /** * Index refers to the active child route in the routes array. */ index: number; routes: any[]; } export type NavigationRoute = NavigationLeafRoute | NavigationStateRoute; export interface NavigationLeafRoute { /** * React's key used by some navigators. No need to specify these manually, * they will be defined by the router. */ key: string; /** * For example 'Home'. * This is used as a key in a route config when creating a navigator. */ routeName: string; /** * Path is an advanced feature used for deep linking and on the web. */ path?: string; /** * Params passed to this route when navigating to it, * e.g. `{ car_id: 123 }` in a route that displays a car. */ params: Params; } export interface NavigationStateRoute extends NavigationLeafRoute { index: number; routes: Array>; } export type NavigationScreenOptionsGetter = ( navigation: NavigationScreenProp, Action>, screenProps?: { [key: string]: any } ) => Options; export interface NavigationRouter { /** * The reducer that outputs the new navigation state for a given action, with * an optional previous state. When the action is considered handled but the * state is unchanged, the output state is null. */ getStateForAction: (action: Action, lastState: (State | null)) => (State | null); /** * Maps a URI-like string to an action. This can be mapped to a state * using `getStateForAction`. */ getActionForPathAndParams: ( path: string, params?: NavigationParams ) => (Action | null); getPathAndParamsForState: ( state: State ) => { path: string, params?: NavigationParams, }; getComponentForRouteName: (routeName: string) => NavigationComponent; getComponentForState: (state: State) => NavigationComponent; /** * Gets the screen navigation options for a given screen. * * For example, we could get the config for the 'Foo' screen when the * `navigation.state` is: * * {routeName: 'Foo', key: '123'} */ getScreenOptions: NavigationScreenOptionsGetter; } export type NavigationScreenOption = T | (( navigation: NavigationScreenProp, NavigationAction>, config: T ) => T); export interface NavigationScreenDetails { options: T; state: NavigationRoute; navigation: NavigationScreenProp, NavigationAction>; } export interface NavigationScreenOptions { title?: string; } export interface NavigationScreenConfigProps { navigation: NavigationScreenProp, NavigationAction>; screenProps: { [key: string]: any }; } export type NavigationScreenConfig = Options | (NavigationScreenConfigProps & ((navigationOptionsContainer: { navigationOptions: NavigationScreenProp< NavigationRoute, NavigationAction >, }) => Options)); export type NavigationComponent = NavigationScreenComponent | NavigationNavigator; export interface NavigationScreenComponent extends React.ComponentClass { navigationOptions?: NavigationScreenConfig; } export interface NavigationNavigator extends React.ComponentClass { router?: NavigationRouter; navigationOptions?: NavigationScreenConfig; } export interface NavigationParams { [key: string]: any; } export interface NavigationNavigateActionPayload { routeName: string; params?: NavigationParams; // The action to run inside the sub-router action?: NavigationNavigateAction; } export interface NavigationNavigateAction extends NavigationNavigateActionPayload { type: 'Navigation/NAVIGATE'; } export interface NavigationBackActionPayload { key?: string | null; } export interface NavigationBackAction extends NavigationBackActionPayload { type: 'Navigation/BACK'; } export interface NavigationSetParamsActionPayload { // The key of the route where the params should be set key: string; // The new params to merge into the existing route params params?: NavigationParams; } export interface NavigationSetParamsAction extends NavigationSetParamsActionPayload { type: 'Navigation/SET_PARAMS'; } export interface NavigationInitActionPayload { params?: NavigationParams; } export interface NavigationInitAction extends NavigationInitActionPayload { type: 'Navigation/INIT'; } export interface NavigationResetActionPayload { index: number; key?: string | null; actions: NavigationNavigateAction[]; } export interface NavigationResetAction extends NavigationResetActionPayload { type: 'Navigation/RESET'; } export interface NavigationUriActionPayload { uri: string; } export interface NavigationUriAction extends NavigationUriActionPayload { type: 'Navigation/URI'; } export interface NavigationStackViewConfig { mode?: 'card' | 'modal'; headerMode?: HeaderMode; cardStyle?: StyleProp; transitionConfig?: () => TransitionConfig; onTransitionStart?: () => void; onTransitionEnd?: () => void; } export type NavigationStackScreenOptions = NavigationScreenOptions & { header?: (React.ReactElement | ((headerProps: HeaderProps) => React.ReactElement)) | null; headerTitle?: string | React.ReactElement; headerTitleStyle?: StyleProp; headerTintColor?: string; headerLeft?: React.ReactElement; headerBackTitle?: string | null; headerTruncatedBackTitle?: string; headerBackTitleStyle?: StyleProp; headerPressColorAndroid?: string; headerRight?: React.ReactElement; headerStyle?: StyleProp; gesturesEnabled?: boolean; gestureResponseDistance?: { vertical?: number; horizontal?: number }; }; export interface NavigationStackRouterConfig { initialRouteName?: string; initialRouteParams?: NavigationParams; paths?: NavigationPathsConfig; navigationOptions?: NavigationScreenConfig; } export type NavigationStackAction = NavigationInitAction | NavigationNavigateAction | NavigationBackAction | NavigationSetParamsAction | NavigationResetAction; export type NavigationTabAction = NavigationInitAction | NavigationNavigateAction | NavigationBackAction; export type NavigationAction = NavigationInitAction | NavigationStackAction | NavigationTabAction; export type NavigationRouteConfig = T & { navigationOptions?: NavigationScreenConfig, path?: string, }; export type NavigationScreenRouteConfig = { screen: NavigationComponent, } | { getScreen: () => NavigationComponent, }; export interface NavigationPathsConfig { [routeName: string]: string; } export interface NavigationTabRouterConfig { initialRouteName?: string; paths?: NavigationPathsConfig; navigationOptions?: NavigationScreenConfig; order?: string[]; // todo: type these as the real route names rather than 'string' // Does the back button cause the router to switch to the initial tab backBehavior?: 'none' | 'initialRoute'; // defaults `initialRoute` } export interface TabScene { route: NavigationRoute; focused: boolean; index: number; tintColor?: string; } export interface NavigationTabScreenOptions extends NavigationScreenOptions { tabBarIcon?: React.ReactElement | ((options: { tintColor: (string | null), focused: boolean }) => (React.ReactElement< any > | null)); tabBarLabel?: string | React.ReactElement | ((options: { tintColor: (string | null), focused: boolean }) => (React.ReactElement< any > | string | null)); tabBarVisible?: boolean; tabBarTestIDProps?: { testID?: string, accessibilityLabel?: string }; tabBarOnPress?: (options: { scene: TabScene, jumpToIndex: (index: number) => void }) => void; } export interface NavigationDrawerScreenOptions extends NavigationScreenOptions { drawerIcon?: React.ReactElement | ((options: { tintColor: (string | null), focused: boolean }) => (React.ReactElement< any > | null)); drawerLabel?: string | React.ReactElement | ((options: { tintColor: (string | null), focused: boolean }) => (React.ReactElement< any > | null)); } export interface NavigationRouteConfigMap { [routeName: string]: NavigationRouteConfig; } export type NavigationDispatch = (action: A) => boolean; export interface NavigationProp { state: S; dispatch: NavigationDispatch; } export interface NavigationScreenProp { state: S; dispatch: NavigationDispatch; goBack: (routeKey?: (string | null)) => boolean; navigate: ( routeName: string, params?: NavigationParams, action?: NavigationAction ) => boolean; setParams: (newParams: NavigationParams) => boolean; } export interface NavigationNavigatorProps { navigation?: NavigationProp; screenProps?: { [key: string]: any }; navigationOptions?: any; } /** * Gestures, Animations, and Interpolators */ export type NavigationGestureDirection = 'horizontal' | 'vertical'; export interface NavigationLayout { height: AnimatedValue; initHeight: number; initWidth: number; isMeasured: boolean; width: AnimatedValue; } export interface NavigationScene { index: number; isActive: boolean; isStale: boolean; key: string; route: NavigationRoute; } export interface NavigationTransitionProps { // The layout of the screen container layout: NavigationLayout; // The destination navigation state of the transition navigation: NavigationScreenProp; // The progressive index of the transitioner's navigation state. position: AnimatedValue; // The value that represents the progress of the transition when navigation // state changes from one to another. Its numberic value will range from 0 // to 1. // progress.__getAnimatedValue() < 1 : transtion is happening. // progress.__getAnimatedValue() == 1 : transtion completes. progress: AnimatedValue; // All the scenes of the transitioner. scenes: NavigationScene[]; // The active scene, corresponding to the route at // `navigation.state.routes[navigation.state.index]`. When rendering // NavigationSceneRendererPropsIndex, the scene does not refer to the active // scene, but instead the scene that is being rendered. The index always // is the index of the scene scene: NavigationScene; index: number; screenProps?: { [key: string]: any }; } // The scene renderer props are nearly identical to the props used for rendering // a transition. The exception is that the passed scene is not the active scene // but is instead the scene that the renderer should render content for. export type NavigationSceneRendererProps = NavigationTransitionProps; export interface NavigationTransitionSpec { duration?: number; // An easing function from `Easing`. easing?: (t: number) => number; // A timing function such as `Animated.timing`. timing?: (value: AnimatedValue, config: any) => any; } /** * Describes a visual transition from one screen to another. */ export interface TransitionConfig { // The basics properties of the animation, such as duration and easing transitionSpec?: NavigationTransitionSpec; // How to animate position and opacity of the screen // based on the value generated by the transitionSpec screenInterpolator?: (props: NavigationSceneRendererProps) => any; } export type NavigationAnimationSetter = ( position: AnimatedValue, newState: NavigationState, lastState: NavigationState ) => void; export type NavigationSceneRenderer = () => (React.ReactElement | null); export type NavigationStyleInterpolator = ( props: NavigationSceneRendererProps ) => ViewStyle; export interface LayoutEvent { nativeEvent: { layout: { x: number, y: number, width: number, height: number, }, }; } /** * END FLOW TYPEDEFINITION.JS PORT */ /** * BEGIN MANUAL DEFINITIONS OUTSIDE OF TYPEDEFINITION.JS */ // From navigators/NavigatorTypes.js export type NavigatorType = | 'react-navigation/STACK' | 'react-navigation/TABS' | 'react-navigation/DRAWER'; // From addNavigatorHelpers.js export function addNavigationHelpers(navigation: NavigationProp): NavigationScreenProp; // From createNavigationContainer.js export interface NavigationContainerProps { uriPrefix?: string | RegExp; onNavigationStateChange?: ( prevNavigationState: NavigationState, nextNavigationState: NavigationState, action: NavigationAction, ) => void; style?: StyleProp; } export interface NavigationContainer extends React.ComponentClass< NavigationContainerProps & NavigationNavigatorProps > { router: NavigationRouter; screenProps: { [key: string]: any }; navigationOptions: any; state: { nav: NavigationState | null }; } export interface StackNavigatorConfig extends NavigationStackViewConfig, NavigationStackRouterConfig { containerOptions?: any; } // Return createNavigationContainer export function StackNavigator( routeConfigMap: NavigationRouteConfigMap, stackConfig?: StackNavigatorConfig, ): NavigationContainer; // DrawerItems export const DrawerItems: React.ComponentType; /** * Drawer Navigator */ export interface DrawerViewConfig { drawerBackgroundColor?: string; drawerWidth?: number; drawerPosition?: 'left' | 'right'; contentComponent?: React.ComponentType; contentOptions?: any; style?: StyleProp; } export interface DrawerNavigatorConfig extends NavigationTabRouterConfig, DrawerViewConfig { containerConfig?: any; contentOptions?: { activeTintColor?: string, activeBackgroundColor?: string, inactiveTintColor?: string, inactiveBackgroundColor?: string, style?: StyleProp, labelStyle?: StyleProp, }; } export function DrawerNavigator( routeConfigMap: NavigationRouteConfigMap, drawerConfig?: DrawerNavigatorConfig, ): NavigationContainer; /** * Tab Navigator */ // From views/TabView/TabView.js export interface TabViewConfig { tabBarComponent?: React.ComponentType; tabBarPosition?: 'top' | 'bottom'; tabBarOptions?: { activeTintColor?: string, allowFontScaling?: boolean, activeBackgroundColor?: string, inactiveTintColor?: string, inactiveBackgroundColor?: string, showLabel?: boolean, style?: StyleProp, labelStyle?: StyleProp, // Top showIcon?: boolean, upperCaseLabel?: boolean, pressColor?: string, pressOpacity?: number, scrollEnabled?: boolean, tabStyle?: StyleProp, indicatorStyle?: StyleProp, }; swipeEnabled?: boolean; animationEnabled?: boolean; lazy?: boolean; } // From navigators/TabNavigator.js export interface TabNavigatorConfig extends NavigationTabRouterConfig, TabViewConfig { initialLayout?: { height: number, width: number }; } // From navigators/TabNavigator.js export function TabNavigator( routeConfigMap: NavigationRouteConfigMap, drawConfig?: TabNavigatorConfig, ): NavigationContainer; export const TabBarTop: React.ComponentType; export const TabBarBottom: React.ComponentType; /** * NavigationActions */ export namespace NavigationActions { const BACK: 'Navigation/BACK'; const INIT: 'Navigation/INIT'; const NAVIGATE: 'Navigation/NAVIGATE'; const RESET: 'Navigation/RESET'; const SET_PARAMS: 'Navigation/SET_PARAMS'; const URI: 'Navigation/URI'; function init(options?: NavigationInitActionPayload): NavigationInitAction; function navigate(options: NavigationNavigateActionPayload): NavigationNavigateAction; function reset(options: NavigationResetActionPayload): NavigationResetAction; function back(options?: NavigationBackActionPayload): NavigationBackAction; function setParams(options: NavigationSetParamsActionPayload): NavigationSetParamsAction; } /** * Transitioner * @desc From react-navigation/src/views/Transitioner.js */ export interface TransitionerProps { configureTransition: ( transitionProps: NavigationTransitionProps, prevTransitionProps?: NavigationTransitionProps ) => NavigationTransitionSpec; navigation: NavigationScreenProp; onTransitionEnd?: () => void; onTransitionStart?: () => void; render: ( transitionProps: NavigationTransitionProps, prevTransitionProps?: NavigationTransitionProps ) => any; style?: StyleProp; } export interface TransitionerState { layout: NavigationLayout; position: Animated.Value; progress: Animated.Value; scenes: NavigationScene[]; } export class Transitioner extends React.Component< TransitionerProps, TransitionerState > { } /** * Tab Router * * @desc from react-navigation/src/routers/TabRouter.js */ export function TabRouter( routeConfigs: NavigationRouteConfigMap, config: NavigationTabRouterConfig ): NavigationRouter; /** * Stack Router * * @desc from react-navigation/src/routers/StackRouter.js */ export function StackRouter( routeConfigs: NavigationRouteConfigMap, config: NavigationTabRouterConfig ): NavigationRouter; /** * Create Navigator * * @see https://github.com/react-community/react-navigation/blob/master/src/navigators/createNavigator.js */ export function createNavigator( router: NavigationRouter, routeConfigs?: NavigationRouteConfigMap, navigatorConfig?: {} | null, navigatorType?: NavigatorType ): (NavigationView: React.ComponentClass) => NavigationNavigator; /** * Create an HOC that injects the navigation and manages the navigation state * in case it's not passed from above. * This allows to use e.g. the StackNavigator and TabNavigator as root-level * components. * * @see https://github.com/react-community/react-navigation/blob/master/src/createNavigationContainer.js */ export function createNavigationContainer( Component: NavigationNavigator ): NavigationContainer; /** * END MANUAL DEFINITIONS OUTSIDE OF TYPEDEFINITION.JS */ /** * BEGIN CUSTOM CONVENIENCE INTERFACES */ export interface NavigationScreenProps { navigation: NavigationScreenProp, NavigationAction>; screenProps?: { [key: string]: any }; navigationOptions?: NavigationScreenConfig; } /** * END CUSTOM CONVENIENCE INTERFACES */ /* * Header */ // src/views/HeaderBackButton.js export interface HeaderBackButtonProps { onPress?: () => void; pressColorAndroid?: string; title?: string; titleStyle?: StyleProp; tintColor?: string; truncatedTitle?: string; width?: number; } export const HeaderBackButton: React.ComponentClass; /** * Header Component */ export const Header: React.ComponentClass;