@react-navigation/core
Version:
Core utilities for building navigators
145 lines • 7.08 kB
TypeScript
import type { NavigationState, ParamListBase } from '@react-navigation/routers';
import * as React from 'react';
import type { DefaultNavigatorOptions, EventMapBase, NavigationListBase, NavigatorTypeBagBase, PathConfig, RouteConfigComponent, RouteConfigProps, RouteGroupConfig } from './types';
export type { StaticParamList } from './types';
type StaticRouteConfig<ParamList extends ParamListBase, RouteName extends keyof ParamList, State extends NavigationState, ScreenOptions extends {}, EventMap extends EventMapBase, Navigation> = RouteConfigProps<ParamList, RouteName, State, ScreenOptions, EventMap, Navigation> & RouteConfigComponent<ParamList, RouteName>;
export type StaticConfigScreens<ParamList extends ParamListBase, State extends NavigationState, ScreenOptions extends {}, EventMap extends EventMapBase, NavigationList extends NavigationListBase<ParamList>> = {
[RouteName in keyof ParamList]: React.ComponentType<any> | StaticNavigation<any, any, any> | (Omit<StaticRouteConfig<ParamList, RouteName, State, ScreenOptions, EventMap, NavigationList[RouteName]>, 'name' | 'component' | 'getComponent' | 'children'> & {
/**
* Callback to determine whether the screen should be rendered or not.
* This can be useful for conditional rendering of screens,
* e.g. - if you want to render a different screen for logged in users.
*
* You can use a custom hook to use custom logic to determine the return value.
*
* @example
* ```js
* if: useIsLoggedIn
* ```
*/
if?: () => boolean;
/**
* Linking config for the screen.
* This can be a string to specify the path, or an object with more options.
*
* @example
* ```js
* linking: {
* path: 'profile/:id',
* exact: true,
* },
* ```
*/
linking?: PathConfig<ParamList> | string;
/**
* Static navigation config or Component to render for the screen.
*/
screen: StaticNavigation<any, any, any> | React.ComponentType<any>;
});
};
export type StaticConfigGroup<ParamList extends ParamListBase, State extends NavigationState, ScreenOptions extends {}, EventMap extends EventMapBase, NavigationList extends NavigationListBase<ParamList>> = Omit<RouteGroupConfig<ParamList, ScreenOptions, NavigationList[keyof ParamList]>, 'screens' | 'children'> & {
/**
* Callback to determine whether the screens in the group should be rendered or not.
* This can be useful for conditional rendering of group of screens.
*/
if?: () => boolean;
/**
* Static navigation config or Component to render for the screen.
*/
screens: StaticConfigScreens<ParamList, State, ScreenOptions, EventMap, NavigationList>;
};
export type StaticConfig<Bag extends NavigatorTypeBagBase> = StaticConfigInternal<Bag['ParamList'], Bag['NavigatorID'], Bag['State'], Bag['ScreenOptions'], Bag['EventMap'], Bag['NavigationList'], Bag['Navigator']>;
type StaticConfigInternal<ParamList extends ParamListBase, NavigatorID extends string | undefined, State extends NavigationState, ScreenOptions extends {}, EventMap extends EventMapBase, NavigationList extends NavigationListBase<ParamList>, Navigator extends React.ComponentType<any>> = Omit<Omit<React.ComponentProps<Navigator>, keyof DefaultNavigatorOptions<ParamListBase, string | undefined, NavigationState, {}, EventMapBase, NavigationList[keyof ParamList]>> & DefaultNavigatorOptions<ParamList, NavigatorID, State, ScreenOptions, EventMap, NavigationList[keyof ParamList]>, 'screens' | 'children'> & ({
/**
* Screens to render in the navigator and their configuration.
*/
screens: StaticConfigScreens<ParamList, State, ScreenOptions, EventMap, NavigationList>;
/**
* Groups of screens to render in the navigator and their configuration.
*/
groups?: {
[key: string]: StaticConfigGroup<ParamList, State, ScreenOptions, EventMap, NavigationList>;
};
} | {
/**
* Screens to render in the navigator and their configuration.
*/
screens?: StaticConfigScreens<ParamList, State, ScreenOptions, EventMap, NavigationList>;
/**
* Groups of screens to render in the navigator and their configuration.
*/
groups: {
[key: string]: StaticConfigGroup<ParamList, State, ScreenOptions, EventMap, NavigationList>;
};
});
/**
* Props for a screen component which is rendered by a static navigator.
* Takes the route params as a generic argument.
*/
export type StaticScreenProps<T extends Record<string, unknown> | undefined> = {
route: {
params: T;
};
};
type StaticNavigationBase = {
config: StaticConfig<NavigatorTypeBagBase>;
getComponent: () => React.ComponentType<{}>;
};
export type StaticNavigation<NavigatorProps, GroupProps, ScreenProps> = StaticNavigationBase & {
Navigator: React.ComponentType<NavigatorProps>;
Group: React.ComponentType<GroupProps>;
Screen: React.ComponentType<ScreenProps>;
};
/**
* Create a component that renders a navigator based on the static configuration.
*
* @param tree Static navigation config.
* @param displayName Name of the component to be displayed in React DevTools.
* @returns A component which renders the navigator.
*/
export declare function createComponentForStaticNavigation<T extends {
Navigator: React.ComponentType<any>;
Group: React.ComponentType<any>;
Screen: React.ComponentType<any>;
config: StaticConfig<NavigatorTypeBagBase>;
}>(tree: T, displayName: string): React.ComponentType<Omit<React.ComponentProps<T['Navigator']>, 'children'>>;
/**
* Create a component that renders a navigator based on the static configuration.
*
* @deprecated Use `tree.getComponent()` instead.
*/
export declare function createComponentForStaticNavigationDeprecated(tree: StaticNavigation<any, any, any>): React.ComponentType<{}>;
type TreeForPathConfig = {
config: {
initialRouteName?: string;
screens?: StaticConfigScreens<ParamListBase, NavigationState, {}, EventMapBase, Record<string, unknown>>;
groups?: {
[key: string]: {
screens: StaticConfigScreens<ParamListBase, NavigationState, {}, EventMapBase, Record<string, unknown>>;
};
};
};
};
/**
* Create a path config object from a static navigation config for deep linking.
*
* @param tree Static navigation config.
* @param options Additional options from `linking.config`.
* @param auto Whether to automatically generate paths for leaf screens.
* @returns Path config object to use in linking config.
*
* @example
* ```js
* const config = {
* screens: {
* Home: {
* screens: createPathConfigForStaticNavigation(HomeTabs),
* },
* },
* };
* ```
*/
export declare function createPathConfigForStaticNavigation(tree: TreeForPathConfig, options?: {
initialRouteName?: string;
}, auto?: boolean): {} | undefined;
//# sourceMappingURL=StaticNavigation.d.ts.map