react-navigation-helpers
Version:
Easy to use React Navigation with these helpers for React Navigation on React Native
112 lines (94 loc) • 3.18 kB
text/typescript
import * as React from "react";
import {
createNavigationContainerRef,
StackActions,
TabActions,
} from "@react-navigation/native";
interface RefObject<T> {
current: T | null;
}
export type NavigationEvent =
| "transitionStart"
| "transitionEnd"
| "gestureStart"
| "gestureEnd"
| "gestureCancel"
| string;
const listeners: Record<string, ((...args: any[]) => void)[]> = {};
const removeNavigationListener = (
event: string,
callback: (...args: any[]) => void,
) => {
if (listeners[event]) {
listeners[event] = listeners[event].filter((cb) => cb !== callback);
}
};
const executeNavigationListeners = (eventName: string, ...args: any) => {
if (listeners[eventName]) {
listeners[eventName].forEach((fn) => fn(...args));
}
};
export const addNavigationListener = (
event: NavigationEvent,
callback: any,
): (() => void) => {
listeners[event] = listeners[event] || [];
listeners[event].push(callback);
return () => removeNavigationListener(event, callback);
};
export const isReadyRef: RefObject<boolean> = React.createRef<boolean>();
export const navigationRef = createNavigationContainerRef();
export const navigationListenerProps = {
onTransitionEnd: (props, ...args) =>
executeNavigationListeners("transitionEnd", ...args),
onTransitionStart: (props, ...args) =>
executeNavigationListeners("transitionStart", ...args),
onGestureStart: (props, ...args) =>
executeNavigationListeners("gestureStart", ...args),
onGestureEnd: (props, ...args) =>
executeNavigationListeners("gestureEnd", ...args),
onGestureCancel: (props, ...args) =>
executeNavigationListeners("gestureCancel", ...args),
};
export const navigate = (routeName: string, params?: any) => {
if (isReadyRef.current && navigationRef && navigationRef.current) {
// @ts-ignore
navigationRef?.current?.navigate(routeName, params);
}
};
export const push = (routeName: string, params?: any) => {
if (isReadyRef.current && navigationRef && navigationRef.current) {
navigationRef.current.dispatch(StackActions.push(routeName, params));
}
};
export const goBack = () => {
if (isReadyRef.current && navigationRef && navigationRef.current) {
navigationRef.current.goBack();
}
};
export const pop = (...args: any) => {
if (isReadyRef.current && navigationRef && navigationRef.current) {
navigationRef.current?.dispatch(StackActions.pop(...args));
}
};
export const popToTop = () => {
if (isReadyRef.current && navigationRef && navigationRef.current) {
// Perform navigation if the app has mounted
navigationRef.current?.dispatch(StackActions.popToTop());
}
};
export const reset = (params: any) => {
if (isReadyRef.current && navigationRef && navigationRef.current) {
navigationRef.current?.reset(params);
}
};
export const replace = (params: any) => {
if (isReadyRef.current && navigationRef && navigationRef.current) {
navigationRef.current?.dispatch(StackActions.replace(params));
}
};
export const jumpTo = (params: any) => {
if (isReadyRef.current && navigationRef && navigationRef.current) {
navigationRef.current?.dispatch(TabActions.jumpTo(params));
}
};