From 93b18884504b9d4e60c35fd7976530f7cb9da8e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oskar=20Kwas=CC=81niewski?= Date: Fri, 21 Mar 2025 14:58:49 +0100 Subject: [PATCH 1/2] fix: memoise callbacks --- .../react-native-bottom-tabs/src/TabView.tsx | 53 ++++++++++++++----- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/packages/react-native-bottom-tabs/src/TabView.tsx b/packages/react-native-bottom-tabs/src/TabView.tsx index 8863c792..3854669c 100644 --- a/packages/react-native-bottom-tabs/src/TabView.tsx +++ b/packages/react-native-bottom-tabs/src/TabView.tsx @@ -1,5 +1,10 @@ import React from 'react'; -import type { TabViewItems } from './TabViewNativeComponent'; +import type { + OnNativeLayout, + OnPageSelectedEventData, + OnTabBarMeasured, + TabViewItems, +} from './TabViewNativeComponent'; import { type ColorValue, Image, @@ -279,6 +284,35 @@ const TabView = ({ onIndexChange(index); }); + const handleTabLongPress = React.useCallback( + ({ nativeEvent: { key } }: { nativeEvent: OnPageSelectedEventData }) => { + const index = trimmedRoutes.findIndex((route) => route.key === key); + onTabLongPress?.(index); + }, + [trimmedRoutes, onTabLongPress] + ); + + const handlePageSelected = React.useCallback( + ({ nativeEvent: { key } }: { nativeEvent: OnPageSelectedEventData }) => { + jumpTo(key); + }, + [jumpTo] + ); + + const handleTabBarMeasured = React.useCallback( + ({ nativeEvent: { height } }: { nativeEvent: OnTabBarMeasured }) => { + setTabBarHeight(height); + }, + [setTabBarHeight] + ); + + const handleNativeLayout = React.useCallback( + ({ nativeEvent: { width, height } }: { nativeEvent: OnNativeLayout }) => { + setMeasuredDimensions({ width, height }); + }, + [setMeasuredDimensions] + ); + return ( ({ icons={renderCustomTabBar ? undefined : resolvedIconAssets} selectedPage={focusedKey} tabBarHidden={!!renderCustomTabBar} - onTabLongPress={({ nativeEvent: { key } }) => { - const index = trimmedRoutes.findIndex((route) => route.key === key); - onTabLongPress?.(index); - }} - onPageSelected={({ nativeEvent: { key } }) => { - jumpTo(key); - }} - onTabBarMeasured={({ nativeEvent: { height } }) => { - setTabBarHeight(height); - }} - onNativeLayout={({ nativeEvent: { width, height } }) => { - setMeasuredDimensions({ width, height }); - }} + onTabLongPress={handleTabLongPress} + onPageSelected={handlePageSelected} + onTabBarMeasured={handleTabBarMeasured} + onNativeLayout={handleNativeLayout} hapticFeedbackEnabled={hapticFeedbackEnabled} activeTintColor={activeTintColor} inactiveTintColor={inactiveTintColor} From 5b88c879e2cdaddc66eb2f6d4d6c5d045ee7e8ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oskar=20Kwas=CC=81niewski?= Date: Fri, 21 Mar 2025 14:59:02 +0100 Subject: [PATCH 2/2] fix: move SceneMap outside of the component --- apps/example/src/Examples/FourTabs.tsx | 14 +++++++------- apps/example/src/Examples/Labeled.tsx | 14 +++++++------- apps/example/src/Examples/SFSymbols.tsx | 12 ++++++------ apps/example/src/Examples/ThreeTabs.tsx | 12 ++++++------ apps/example/src/Examples/TintColors.tsx | 15 +++++++-------- 5 files changed, 33 insertions(+), 34 deletions(-) diff --git a/apps/example/src/Examples/FourTabs.tsx b/apps/example/src/Examples/FourTabs.tsx index 44802668..93ed60ff 100644 --- a/apps/example/src/Examples/FourTabs.tsx +++ b/apps/example/src/Examples/FourTabs.tsx @@ -16,6 +16,13 @@ interface Props { activeIndicatorColor?: ColorValue; } +const renderScene = SceneMap({ + article: Article, + albums: Albums, + contacts: Contacts, + chat: Chat, +}); + export default function FourTabs({ disablePageAnimations = false, scrollEdgeAppearance = 'default', @@ -53,13 +60,6 @@ export default function FourTabs({ }, ]); - const renderScene = SceneMap({ - article: Article, - albums: Albums, - contacts: Contacts, - chat: Chat, - }); - return (