@react-navigation/native#CommonActions TypeScript Examples
The following examples show how to use
@react-navigation/native#CommonActions.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: navigation.ts From hive-keychain-mobile with MIT License | 6 votes |
resetStackAndNavigate = (name: string) => {
if (navigator)
navigator.dispatch({
...CommonActions.reset({
index: 0,
routes: [{name}],
}),
});
}
Example #2
Source File: navigationService.ts From react-native-template with MIT License | 6 votes |
navigateAndReset = <T extends object>(name: Screens, params?: T) => {
if (isMountedRef.current && navigationRef.current) {
// Perform navigation if the app has mounted
navigationRef.current.dispatch(
CommonActions.reset({
routes: [{ name, params }],
})
)
} else {
throw new Error(ERROR_NOT_INIT)
}
}
Example #3
Source File: navigationService.ts From react-native-template with MIT License | 6 votes |
reset = <T extends object>(routes: { name: Screens, params?: T }[], index: number) => {
if (isMountedRef.current && navigationRef.current) {
navigationRef.current.dispatch(
CommonActions.reset({
index,
routes,
})
)
} else {
throw new Error(ERROR_NOT_INIT)
}
}
Example #4
Source File: AnimatedTabBar.tsx From curved-bottom-navigation-bar with MIT License | 4 votes |
AnimatedTabBarComponent = (props: AnimatedTabBarProps) => {
// props
const {
navigation,
tabs,
descriptors,
state,
duration = DEFAULT_ITEM_ANIMATION_DURATION,
barColor = TAB_BAR_COLOR,
dotSize = SIZE_DOT,
barHeight = TAB_BAR_HEIGHT,
dotColor = TAB_BAR_COLOR,
titleShown = false,
barWidth,
} = props;
// variables
const {
routes,
index: navigationIndex,
key: navigationKey,
} = useMemo(() => {
return state;
}, [state]);
// reanimated
const selectedIndex = useSharedValue(0);
// callbacks
const getRouteTitle = useCallback(
(route: Route<string>) => {
const { options } = descriptors[route.key];
// eslint-disable-next-line no-nested-ternary
return options.tabBarLabel !== undefined &&
typeof options.tabBarLabel === 'string'
? options.tabBarLabel
: options.title !== undefined
? options.title
: route.name;
},
[descriptors]
);
const getRouteTabConfigs = useCallback(
(route: Route<string>) => {
return tabs[route.name];
},
[tabs]
);
const getRoutes = useCallback(() => {
return routes.map((route) => ({
key: route.key,
title: getRouteTitle(route),
...getRouteTabConfigs(route),
}));
}, [routes, getRouteTitle, getRouteTabConfigs]);
const handleSelectedIndexChange = useCallback(
(index: number) => {
const { key, name } = routes[index];
const event = navigation.emit({
type: 'tabPress',
target: key,
canPreventDefault: true,
});
if (!event.defaultPrevented) {
navigation.dispatch({
...CommonActions.navigate(name),
target: navigationKey,
});
}
},
[routes, navigation, navigationKey]
);
// effects
useEffect(() => {
selectedIndex.value = navigationIndex;
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [navigationIndex]);
useAnimatedReaction(
() => selectedIndex.value,
(nextSelected, prevSelected) => {
if (nextSelected !== prevSelected) {
runOnJS(handleSelectedIndexChange)(nextSelected);
}
},
[selectedIndex, handleSelectedIndexChange]
);
// render
return (
<CurvedTabBar
isRtl={I18nManager.isRTL}
barWidth={barWidth}
titleShown={titleShown}
dotColor={dotColor}
barHeight={barHeight}
dotSize={dotSize}
tabBarColor={barColor}
selectedIndex={selectedIndex}
navigationIndex={navigationIndex}
routes={getRoutes()}
duration={duration}
/>
);
}
Example #5
Source File: BottomTabBar.tsx From nlw2-proffy with MIT License | 4 votes |
export default function BottomTabBar({
state,
navigation,
descriptors,
activeBackgroundColor,
activeTintColor,
adaptive = true,
allowFontScaling,
inactiveBackgroundColor,
inactiveTintColor,
keyboardHidesTabBar = false,
labelPosition,
labelStyle,
iconStyle,
safeAreaInsets,
showLabel,
style,
tabStyle,
}: Props) {
const { colors } = useTheme();
const buildLink = useLinkBuilder();
const focusedRoute = state.routes[state.index];
const focusedDescriptor = descriptors[focusedRoute.key];
const focusedOptions = focusedDescriptor.options;
const dimensions = useWindowDimensions();
const isKeyboardShown = useIsKeyboardShown();
const shouldShowTabBar =
focusedOptions.tabBarVisible !== false &&
!(keyboardHidesTabBar && isKeyboardShown);
const visibilityAnimationConfigRef = React.useRef(
focusedOptions.tabBarVisibilityAnimationConfig
);
React.useEffect(() => {
visibilityAnimationConfigRef.current =
focusedOptions.tabBarVisibilityAnimationConfig;
});
const [isTabBarHidden, setIsTabBarHidden] = React.useState(!shouldShowTabBar);
const [visible] = React.useState(
() => new Animated.Value(shouldShowTabBar ? 1 : 0)
);
React.useEffect(() => {
const visibilityAnimationConfig = visibilityAnimationConfigRef.current;
if (shouldShowTabBar) {
const animation =
visibilityAnimationConfig?.show?.animation === 'spring'
? Animated.spring
: Animated.timing;
animation(visible, {
toValue: 1,
useNativeDriver,
duration: 250,
...visibilityAnimationConfig?.show?.config,
}).start(({ finished }) => {
if (finished) {
setIsTabBarHidden(false);
}
});
} else {
setIsTabBarHidden(true);
const animation =
visibilityAnimationConfig?.hide?.animation === 'spring'
? Animated.spring
: Animated.timing;
animation(visible, {
toValue: 0,
useNativeDriver,
duration: 200,
...visibilityAnimationConfig?.hide?.config,
}).start();
}
}, [visible, shouldShowTabBar]);
const [layout, setLayout] = React.useState({
height: 0,
width: dimensions.width,
});
const handleLayout = (e: LayoutChangeEvent) => {
const { height, width } = e.nativeEvent.layout;
setLayout((layout) => {
if (height === layout.height && width === layout.width) {
return layout;
} else {
return {
height,
width,
};
}
});
};
const { routes } = state;
const shouldUseHorizontalLabels = () => {
if (labelPosition) {
return labelPosition === 'beside-icon';
}
if (!adaptive) {
return false;
}
if (layout.width >= 768) {
// Screen size matches a tablet
let maxTabItemWidth = DEFAULT_MAX_TAB_ITEM_WIDTH;
const flattenedStyle = StyleSheet.flatten(tabStyle);
if (flattenedStyle) {
if (typeof flattenedStyle.width === 'number') {
maxTabItemWidth = flattenedStyle.width;
} else if (typeof flattenedStyle.maxWidth === 'number') {
maxTabItemWidth = flattenedStyle.maxWidth;
}
}
return routes.length * maxTabItemWidth <= layout.width;
} else {
const isLandscape = dimensions.width > dimensions.height;
return isLandscape;
}
};
const defaultInsets = useSafeArea();
const insets = {
top: safeAreaInsets?.top ?? defaultInsets.top,
right: safeAreaInsets?.right ?? defaultInsets.right,
bottom: safeAreaInsets?.bottom ?? defaultInsets.bottom,
left: safeAreaInsets?.left ?? defaultInsets.left,
};
const paddingBottom = Math.max(
insets.bottom - Platform.select({ ios: 4, default: 0 }),
0
);
return (
<Animated.View
style={[
styles.tabBar,
{
backgroundColor: colors.card,
borderTopColor: colors.border,
},
{
transform: [
{
translateY: visible.interpolate({
inputRange: [0, 1],
outputRange: [layout.height + paddingBottom, 0],
}),
},
],
// Absolutely position the tab bar so that the content is below it
// This is needed to avoid gap at bottom when the tab bar is hidden
position: isTabBarHidden ? 'absolute' : (null as any),
},
{
height: DEFAULT_TABBAR_HEIGHT + paddingBottom,
paddingBottom,
paddingHorizontal: Math.max(insets.left, insets.right),
},
style,
]}
pointerEvents={isTabBarHidden ? 'none' : 'auto'}
>
<View style={styles.content} onLayout={handleLayout}>
{routes.map((route, index) => {
const focused = index === state.index;
const { options } = descriptors[route.key];
const onPress = () => {
const event = navigation.emit({
type: 'tabPress',
target: route.key,
canPreventDefault: true,
});
if (!focused && !event.defaultPrevented) {
navigation.dispatch({
...CommonActions.navigate(route.name),
target: state.key,
});
}
};
const onLongPress = () => {
navigation.emit({
type: 'tabLongPress',
target: route.key,
});
};
const label =
options.tabBarLabel !== undefined
? options.tabBarLabel
: options.title !== undefined
? options.title
: route.name;
const accessibilityLabel =
options.tabBarAccessibilityLabel !== undefined
? options.tabBarAccessibilityLabel
: typeof label === 'string'
? `${label}, tab, ${index + 1} of ${routes.length}`
: undefined;
return (
<NavigationContext.Provider
key={route.key}
value={descriptors[route.key].navigation}
>
<NavigationRouteContext.Provider value={route}>
<BottomTabItem
route={route}
focused={focused}
horizontal={shouldUseHorizontalLabels()}
onPress={onPress}
onLongPress={onLongPress}
accessibilityLabel={accessibilityLabel}
to={buildLink(route.name, route.params)}
testID={options.tabBarTestID}
allowFontScaling={allowFontScaling}
activeTintColor={activeTintColor}
inactiveTintColor={inactiveTintColor}
activeBackgroundColor={activeBackgroundColor}
inactiveBackgroundColor={inactiveBackgroundColor}
button={options.tabBarButton}
icon={options.tabBarIcon}
badge={options.tabBarBadge}
label={label}
showLabel={showLabel}
labelStyle={labelStyle}
iconStyle={iconStyle}
style={tabStyle}
/>
</NavigationRouteContext.Provider>
</NavigationContext.Provider>
);
})}
</View>
</Animated.View>
);
}