Skip to content

Instantly share code, notes, and snippets.

@cbrevik
Last active November 11, 2020 09:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cbrevik/558d95d89faed7589e2641aae65240ce to your computer and use it in GitHub Desktop.
Save cbrevik/558d95d89faed7589e2641aae65240ce to your computer and use it in GitHub Desktop.
createDismissableStackNavigator -- hacky but working
import * as React from 'react';
import {
useNavigationBuilder,
createNavigatorFactory,
StackRouter,
DefaultNavigatorOptions,
StackRouterOptions,
DefaultRouterOptions,
ParamListBase,
useRoute,
useNavigation,
} from '@react-navigation/native';
import {
StackNavigationOptions,
StackNavigationProp,
StackView,
} from '@react-navigation/stack';
export type DismissableStackNavigationProp<
ParamList extends ParamListBase,
RouteName extends keyof ParamList = string
> = {dismiss(params?: object): void} & StackNavigationProp<
ParamList,
RouteName
>;
function DismissableStackRouter(
options: DefaultRouterOptions & {dismissToScreen: string},
) {
const router = StackRouter(options);
return {
...router,
actionCreators: {
...router.actionCreators,
dismiss(params?: object) {
return {
type: 'NAVIGATE',
payload: {name: options.dismissToScreen, params},
};
},
},
};
}
const DismissableStackNavigator: React.FC<
DefaultNavigatorOptions<StackNavigationOptions> &
StackRouterOptions & {dismissToScreen: string}
> = ({initialRouteName, children, screenOptions, dismissToScreen, ...rest}) => {
const {state, descriptors, navigation} = useNavigationBuilder(
DismissableStackRouter,
{
initialRouteName,
children,
screenOptions,
dismissToScreen,
},
);
return (
<StackView
{...rest}
state={state}
navigation={navigation}
descriptors={descriptors}
/>
);
};
export default createNavigatorFactory(DismissableStackNavigator);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment