react-native-tab-view 3.3.0 → 3.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/{LICENSE.md → LICENSE} +0 -0
  2. package/README.md +5 -36
  3. package/lib/commonjs/PagerViewAdapter.js.map +1 -1
  4. package/lib/commonjs/PanResponderAdapter.js +1 -1
  5. package/lib/commonjs/PanResponderAdapter.js.map +1 -1
  6. package/lib/commonjs/SceneMap.js.map +1 -1
  7. package/lib/commonjs/SceneView.js.map +1 -1
  8. package/lib/commonjs/TabBar.js +42 -9
  9. package/lib/commonjs/TabBar.js.map +1 -1
  10. package/lib/commonjs/TabBarIndicator.js +4 -4
  11. package/lib/commonjs/TabBarIndicator.js.map +1 -1
  12. package/lib/commonjs/TabBarItem.js.map +1 -1
  13. package/lib/commonjs/TabView.js +2 -2
  14. package/lib/commonjs/TabView.js.map +1 -1
  15. package/lib/commonjs/index.js +3 -3
  16. package/lib/commonjs/index.js.map +1 -1
  17. package/lib/module/PagerViewAdapter.js.map +1 -1
  18. package/lib/module/PanResponderAdapter.js +2 -2
  19. package/lib/module/PanResponderAdapter.js.map +1 -1
  20. package/lib/module/SceneMap.js.map +1 -1
  21. package/lib/module/SceneView.js +1 -1
  22. package/lib/module/SceneView.js.map +1 -1
  23. package/lib/module/TabBar.js +41 -10
  24. package/lib/module/TabBar.js.map +1 -1
  25. package/lib/module/TabBarIndicator.js +5 -5
  26. package/lib/module/TabBarIndicator.js.map +1 -1
  27. package/lib/module/TabBarItem.js.map +1 -1
  28. package/lib/module/TabView.js +2 -2
  29. package/lib/module/TabView.js.map +1 -1
  30. package/lib/module/index.js +2 -2
  31. package/lib/module/index.js.map +1 -1
  32. package/lib/typescript/{Pager.android.d.ts → src/Pager.android.d.ts} +0 -0
  33. package/lib/typescript/{Pager.d.ts → src/Pager.d.ts} +0 -0
  34. package/lib/typescript/{Pager.ios.d.ts → src/Pager.ios.d.ts} +0 -0
  35. package/lib/typescript/{PagerViewAdapter.d.ts → src/PagerViewAdapter.d.ts} +1 -1
  36. package/lib/typescript/{PanResponderAdapter.d.ts → src/PanResponderAdapter.d.ts} +1 -1
  37. package/lib/typescript/{PlatformPressable.d.ts → src/PlatformPressable.d.ts} +0 -0
  38. package/lib/typescript/{SceneMap.d.ts → src/SceneMap.d.ts} +0 -0
  39. package/lib/typescript/{SceneView.d.ts → src/SceneView.d.ts} +1 -1
  40. package/lib/typescript/{TabBar.d.ts → src/TabBar.d.ts} +5 -4
  41. package/lib/typescript/{TabBarIndicator.d.ts → src/TabBarIndicator.d.ts} +1 -1
  42. package/lib/typescript/{TabBarItem.d.ts → src/TabBarItem.d.ts} +2 -2
  43. package/lib/typescript/{TabView.d.ts → src/TabView.d.ts} +1 -1
  44. package/lib/typescript/{index.d.ts → src/index.d.ts} +7 -7
  45. package/lib/typescript/{types.d.ts → src/types.d.ts} +0 -0
  46. package/lib/typescript/{useAnimatedValue.d.ts → src/useAnimatedValue.d.ts} +0 -0
  47. package/package.json +28 -60
  48. package/src/PagerViewAdapter.tsx +5 -4
  49. package/src/PanResponderAdapter.tsx +10 -9
  50. package/src/SceneMap.tsx +1 -0
  51. package/src/SceneView.tsx +3 -2
  52. package/src/TabBar.tsx +59 -14
  53. package/src/TabBarIndicator.tsx +11 -8
  54. package/src/TabBarItem.tsx +5 -4
  55. package/src/TabView.tsx +6 -5
  56. package/src/index.tsx +7 -12
File without changes
package/README.md CHANGED
@@ -1,14 +1,7 @@
1
1
  # React Native Tab View
2
2
 
3
- [![Build Status][build-badge]][build]
4
- [![Version][version-badge]][package]
5
- [![MIT License][license-badge]][license]
6
-
7
3
  A cross-platform Tab View component for React Native. Implemented using [`react-native-pager-view`](https://github.com/callstack/react-native-viewpager) on Android & iOS, and [PanResponder](https://reactnative.dev/docs/panresponder) on Web, macOS, and Windows.
8
4
 
9
- - [Run the example app to see it in action](https://expo.io/@satya164/react-native-tab-view-demos).
10
- - Checkout the [example/](https://github.com/satya164/react-native-tab-view/tree/main/example) folder for source code.
11
-
12
5
  ## Features
13
6
 
14
7
  - Smooth animations and gestures
@@ -20,7 +13,7 @@ A cross-platform Tab View component for React Native. Implemented using [`react-
20
13
 
21
14
  ## Demo
22
15
 
23
- <a href="https://raw.githubusercontent.com/satya164/react-native-tab-view/main/demo/demo.mp4"><img src="https://raw.githubusercontent.com/satya164/react-native-tab-view/main/demo/demo.gif" width="360"></a>
16
+ <a href="https://github.com/react-navigation/react-navigation/blob/main/packages/react-native-tab-view/demo/demo.gif"><img src="https://github.com/react-navigation/react-navigation/blob/main/packages/react-native-tab-view/demo/demo.gif" width="360"></a>
24
17
 
25
18
  ## React Native Compatibility
26
19
 
@@ -530,6 +523,10 @@ Style to apply to the tab bar container.
530
523
 
531
524
  Define a spacing between tabs.
532
525
 
526
+ ##### `testID`
527
+
528
+ Test id for the tabBar. Can be used for scrolling the tab bar in tests
529
+
533
530
  ## Using with other libraries
534
531
 
535
532
  ### [React Navigation](https://github.com/react-navigation/react-navigation)
@@ -646,31 +643,3 @@ Nesting the `TabView` inside a vertical `ScrollView` will disable the optimizati
646
643
  ### Use `lazy` and `renderLazyPlaceholder` props to render routes as needed
647
644
 
648
645
  The `lazy` option is disabled by default to provide a smoother tab switching experience, but you can enable it and provide a placeholder component for a better lazy loading experience. Enabling `lazy` can improve initial load performance by rendering routes only when they come into view. Refer the [prop reference](#lazy) for more details.
649
-
650
- ## Contributing
651
-
652
- While developing, you can run the [example app](/example/README.md) to test your changes.
653
-
654
- Make sure your code passes TypeScript and ESLint. Run the following to verify:
655
-
656
- ```sh
657
- yarn typescript
658
- yarn lint
659
- ```
660
-
661
- To fix formatting errors, run the following:
662
-
663
- ```sh
664
- yarn lint -- --fix
665
- ```
666
-
667
- Remember to add tests for your change if possible.
668
-
669
- <!-- badges -->
670
-
671
- [build-badge]: https://img.shields.io/circleci/project/github/satya164/react-native-tab-view/main.svg?style=flat-square
672
- [build]: https://circleci.com/gh/satya164/react-native-tab-view
673
- [version-badge]: https://img.shields.io/npm/v/react-native-tab-view.svg?style=flat-square
674
- [package]: https://www.npmjs.com/package/react-native-tab-view
675
- [license-badge]: https://img.shields.io/npm/l/react-native-tab-view.svg?style=flat-square
676
- [license]: https://opensource.org/licenses/MIT
@@ -1 +1 @@
1
- {"version":3,"names":["AnimatedViewPager","Animated","createAnimatedComponent","ViewPager","PagerViewAdapter","keyboardDismissMode","swipeEnabled","navigationState","onIndexChange","onSwipeStart","onSwipeEnd","children","style","animationEnabled","rest","index","listenersRef","React","useRef","pagerRef","indexRef","navigationStateRef","position","useAnimatedValue","offset","useEffect","current","jumpTo","useCallback","key","routes","findIndex","route","setPage","setPageWithoutAnimation","setValue","Keyboard","dismiss","onPageScrollStateChanged","state","pageScrollState","nativeEvent","subscription","addListener","value","next","Math","ceil","floor","forEach","listener","removeListener","addEnterListener","push","indexOf","splice","memoizedPosition","useMemo","add","render","styles","container","event","useNativeDriver","e","StyleSheet","create","flex"],"sources":["PagerViewAdapter.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Animated, Keyboard, StyleSheet } from 'react-native';\nimport ViewPager, {\n PageScrollStateChangedNativeEvent,\n} from 'react-native-pager-view';\nimport useAnimatedValue from './useAnimatedValue';\nimport type {\n NavigationState,\n Route,\n Listener,\n EventEmitterProps,\n PagerProps,\n} from './types';\n\nconst AnimatedViewPager = Animated.createAnimatedComponent(ViewPager);\n\ntype Props<T extends Route> = PagerProps & {\n onIndexChange: (index: number) => void;\n navigationState: NavigationState<T>;\n children: (\n props: EventEmitterProps & {\n // Animated value which represents the state of current index\n // It can include fractional digits as it represents the intermediate value\n position: Animated.AnimatedInterpolation;\n // Function to actually render the content of the pager\n // The parent component takes care of rendering\n render: (children: React.ReactNode) => React.ReactNode;\n // Callback to call when switching the tab\n // The tab switch animation is performed even if the index in state is unchanged\n jumpTo: (key: string) => void;\n }\n ) => React.ReactElement;\n};\n\nexport default function PagerViewAdapter<T extends Route>({\n keyboardDismissMode = 'auto',\n swipeEnabled = true,\n navigationState,\n onIndexChange,\n onSwipeStart,\n onSwipeEnd,\n children,\n style,\n animationEnabled,\n ...rest\n}: Props<T>) {\n const { index } = navigationState;\n\n const listenersRef = React.useRef<Listener[]>([]);\n\n const pagerRef = React.useRef<ViewPager>();\n const indexRef = React.useRef<number>(index);\n const navigationStateRef = React.useRef(navigationState);\n\n const position = useAnimatedValue(index);\n const offset = useAnimatedValue(0);\n\n React.useEffect(() => {\n navigationStateRef.current = navigationState;\n });\n\n const jumpTo = React.useCallback(\n (key: string) => {\n const index = navigationStateRef.current.routes.findIndex(\n (route: { key: string }) => route.key === key\n );\n\n if (animationEnabled) {\n pagerRef.current?.setPage(index);\n } else {\n pagerRef.current?.setPageWithoutAnimation(index);\n position.setValue(index);\n }\n },\n [animationEnabled, position]\n );\n\n React.useEffect(() => {\n if (keyboardDismissMode === 'auto') {\n Keyboard.dismiss();\n }\n\n if (indexRef.current !== index) {\n if (animationEnabled) {\n pagerRef.current?.setPage(index);\n } else {\n pagerRef.current?.setPageWithoutAnimation(index);\n position.setValue(index);\n }\n }\n }, [keyboardDismissMode, index, animationEnabled, position]);\n\n const onPageScrollStateChanged = (\n state: PageScrollStateChangedNativeEvent\n ) => {\n const { pageScrollState } = state.nativeEvent;\n\n switch (pageScrollState) {\n case 'idle':\n onSwipeEnd?.();\n return;\n case 'dragging': {\n const subscription = offset.addListener(({ value }) => {\n const next =\n index + (value > 0 ? Math.ceil(value) : Math.floor(value));\n\n if (next !== index) {\n listenersRef.current.forEach((listener) => listener(next));\n }\n\n offset.removeListener(subscription);\n });\n\n onSwipeStart?.();\n return;\n }\n }\n };\n\n const addEnterListener = React.useCallback((listener: Listener) => {\n listenersRef.current.push(listener);\n\n return () => {\n const index = listenersRef.current.indexOf(listener);\n\n if (index > -1) {\n listenersRef.current.splice(index, 1);\n }\n };\n }, []);\n\n const memoizedPosition = React.useMemo(\n () => Animated.add(position, offset),\n [offset, position]\n );\n\n return children({\n position: memoizedPosition,\n addEnterListener,\n jumpTo,\n render: (children) => (\n <AnimatedViewPager\n {...rest}\n ref={pagerRef}\n style={[styles.container, style]}\n initialPage={index}\n keyboardDismissMode={\n keyboardDismissMode === 'auto' ? 'on-drag' : keyboardDismissMode\n }\n onPageScroll={Animated.event(\n [\n {\n nativeEvent: {\n position: position,\n offset: offset,\n },\n },\n ],\n { useNativeDriver: true }\n )}\n onPageSelected={(e) => {\n const index = e.nativeEvent.position;\n indexRef.current = index;\n onIndexChange(index);\n }}\n onPageScrollStateChanged={onPageScrollStateChanged}\n scrollEnabled={swipeEnabled}\n >\n {children}\n </AnimatedViewPager>\n ),\n });\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"names":["AnimatedViewPager","Animated","createAnimatedComponent","ViewPager","PagerViewAdapter","keyboardDismissMode","swipeEnabled","navigationState","onIndexChange","onSwipeStart","onSwipeEnd","children","style","animationEnabled","rest","index","listenersRef","React","useRef","pagerRef","indexRef","navigationStateRef","position","useAnimatedValue","offset","useEffect","current","jumpTo","useCallback","key","routes","findIndex","route","setPage","setPageWithoutAnimation","setValue","Keyboard","dismiss","onPageScrollStateChanged","state","pageScrollState","nativeEvent","subscription","addListener","value","next","Math","ceil","floor","forEach","listener","removeListener","addEnterListener","push","indexOf","splice","memoizedPosition","useMemo","add","render","styles","container","event","useNativeDriver","e","StyleSheet","create","flex"],"sources":["PagerViewAdapter.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Animated, Keyboard, StyleSheet } from 'react-native';\nimport ViewPager, {\n PageScrollStateChangedNativeEvent,\n} from 'react-native-pager-view';\n\nimport type {\n EventEmitterProps,\n Listener,\n NavigationState,\n PagerProps,\n Route,\n} from './types';\nimport useAnimatedValue from './useAnimatedValue';\n\nconst AnimatedViewPager = Animated.createAnimatedComponent(ViewPager);\n\ntype Props<T extends Route> = PagerProps & {\n onIndexChange: (index: number) => void;\n navigationState: NavigationState<T>;\n children: (\n props: EventEmitterProps & {\n // Animated value which represents the state of current index\n // It can include fractional digits as it represents the intermediate value\n position: Animated.AnimatedInterpolation;\n // Function to actually render the content of the pager\n // The parent component takes care of rendering\n render: (children: React.ReactNode) => React.ReactNode;\n // Callback to call when switching the tab\n // The tab switch animation is performed even if the index in state is unchanged\n jumpTo: (key: string) => void;\n }\n ) => React.ReactElement;\n};\n\nexport default function PagerViewAdapter<T extends Route>({\n keyboardDismissMode = 'auto',\n swipeEnabled = true,\n navigationState,\n onIndexChange,\n onSwipeStart,\n onSwipeEnd,\n children,\n style,\n animationEnabled,\n ...rest\n}: Props<T>) {\n const { index } = navigationState;\n\n const listenersRef = React.useRef<Listener[]>([]);\n\n const pagerRef = React.useRef<ViewPager>();\n const indexRef = React.useRef<number>(index);\n const navigationStateRef = React.useRef(navigationState);\n\n const position = useAnimatedValue(index);\n const offset = useAnimatedValue(0);\n\n React.useEffect(() => {\n navigationStateRef.current = navigationState;\n });\n\n const jumpTo = React.useCallback(\n (key: string) => {\n const index = navigationStateRef.current.routes.findIndex(\n (route: { key: string }) => route.key === key\n );\n\n if (animationEnabled) {\n pagerRef.current?.setPage(index);\n } else {\n pagerRef.current?.setPageWithoutAnimation(index);\n position.setValue(index);\n }\n },\n [animationEnabled, position]\n );\n\n React.useEffect(() => {\n if (keyboardDismissMode === 'auto') {\n Keyboard.dismiss();\n }\n\n if (indexRef.current !== index) {\n if (animationEnabled) {\n pagerRef.current?.setPage(index);\n } else {\n pagerRef.current?.setPageWithoutAnimation(index);\n position.setValue(index);\n }\n }\n }, [keyboardDismissMode, index, animationEnabled, position]);\n\n const onPageScrollStateChanged = (\n state: PageScrollStateChangedNativeEvent\n ) => {\n const { pageScrollState } = state.nativeEvent;\n\n switch (pageScrollState) {\n case 'idle':\n onSwipeEnd?.();\n return;\n case 'dragging': {\n const subscription = offset.addListener(({ value }) => {\n const next =\n index + (value > 0 ? Math.ceil(value) : Math.floor(value));\n\n if (next !== index) {\n listenersRef.current.forEach((listener) => listener(next));\n }\n\n offset.removeListener(subscription);\n });\n\n onSwipeStart?.();\n return;\n }\n }\n };\n\n const addEnterListener = React.useCallback((listener: Listener) => {\n listenersRef.current.push(listener);\n\n return () => {\n const index = listenersRef.current.indexOf(listener);\n\n if (index > -1) {\n listenersRef.current.splice(index, 1);\n }\n };\n }, []);\n\n const memoizedPosition = React.useMemo(\n () => Animated.add(position, offset),\n [offset, position]\n );\n\n return children({\n position: memoizedPosition,\n addEnterListener,\n jumpTo,\n render: (children) => (\n <AnimatedViewPager\n {...rest}\n ref={pagerRef}\n style={[styles.container, style]}\n initialPage={index}\n keyboardDismissMode={\n keyboardDismissMode === 'auto' ? 'on-drag' : keyboardDismissMode\n }\n onPageScroll={Animated.event(\n [\n {\n nativeEvent: {\n position: position,\n offset: offset,\n },\n },\n ],\n { useNativeDriver: true }\n )}\n onPageSelected={(e) => {\n const index = e.nativeEvent.position;\n indexRef.current = index;\n onIndexChange(index);\n }}\n onPageScrollStateChanged={onPageScrollStateChanged}\n scrollEnabled={swipeEnabled}\n >\n {children}\n </AnimatedViewPager>\n ),\n });\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n});\n"],"mappings":"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"}
@@ -205,7 +205,7 @@ function PanResponderAdapter(_ref) {
205
205
 
206
206
  const position = React.useMemo(() => layout.width ? _reactNative.Animated.divide(panX, -layout.width) : null, [layout.width, panX]);
207
207
  return children({
208
- position: position ?? new _reactNative.Animated.Value(index),
208
+ position: position !== null && position !== void 0 ? position : new _reactNative.Animated.Value(index),
209
209
  addEnterListener,
210
210
  jumpTo,
211
211
  render: children => /*#__PURE__*/React.createElement(_reactNative.Animated.View, _extends({
@@ -1 +1 @@
1
- {"version":3,"names":["DEAD_ZONE","DefaultTransitionSpec","timing","Animated","spring","stiffness","damping","mass","overshootClamping","PanResponderAdapter","layout","keyboardDismissMode","swipeEnabled","navigationState","onIndexChange","onSwipeStart","onSwipeEnd","children","style","animationEnabled","routes","index","panX","useAnimatedValue","listenersRef","React","useRef","navigationStateRef","layoutRef","onIndexChangeRef","currentIndexRef","pendingIndexRef","swipeVelocityThreshold","swipeDistanceThreshold","width","jumpToIndex","useCallback","animate","offset","current","transitionConfig","parallel","toValue","useNativeDriver","start","finished","undefined","setValue","useEffect","Keyboard","dismiss","isMovingHorizontally","_","gestureState","Math","abs","dx","dy","vx","vy","canMoveScreen","event","diffX","I18nManager","isRTL","length","startGesture","stopAnimation","setOffset","_value","respondToGesture","position","_offset","next","ceil","floor","forEach","listener","finishGesture","flattenOffset","currentIndex","nextIndex","round","min","max","isFinite","addEnterListener","push","indexOf","splice","jumpTo","key","findIndex","route","panResponder","PanResponder","create","onMoveShouldSetPanResponder","onMoveShouldSetPanResponderCapture","onPanResponderGrant","onPanResponderMove","onPanResponderTerminate","onPanResponderRelease","onPanResponderTerminationRequest","maxTranslate","translateX","multiply","interpolate","inputRange","outputRange","extrapolate","useMemo","divide","Value","render","styles","sheet","transform","panHandlers","Children","map","child","i","focused","StyleSheet","absoluteFill","flex","flexDirection","alignItems"],"sources":["PanResponderAdapter.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n Animated,\n PanResponder,\n Keyboard,\n StyleSheet,\n GestureResponderEvent,\n PanResponderGestureState,\n I18nManager,\n View,\n} from 'react-native';\nimport useAnimatedValue from './useAnimatedValue';\nimport type {\n NavigationState,\n Route,\n Layout,\n EventEmitterProps,\n PagerProps,\n Listener,\n} from './types';\n\ntype Props<T extends Route> = PagerProps & {\n layout: Layout;\n onIndexChange: (index: number) => void;\n navigationState: NavigationState<T>;\n children: (\n props: EventEmitterProps & {\n // Animated value which represents the state of current index\n // It can include fractional digits as it represents the intermediate value\n position: Animated.AnimatedInterpolation;\n // Function to actually render the content of the pager\n // The parent component takes care of rendering\n render: (children: React.ReactNode) => React.ReactNode;\n // Callback to call when switching the tab\n // The tab switch animation is performed even if the index in state is unchanged\n jumpTo: (key: string) => void;\n }\n ) => React.ReactElement;\n};\n\nconst DEAD_ZONE = 12;\n\nconst DefaultTransitionSpec = {\n timing: Animated.spring,\n stiffness: 1000,\n damping: 500,\n mass: 3,\n overshootClamping: true,\n};\n\nexport default function PanResponderAdapter<T extends Route>({\n layout,\n keyboardDismissMode = 'auto',\n swipeEnabled = true,\n navigationState,\n onIndexChange,\n onSwipeStart,\n onSwipeEnd,\n children,\n style,\n animationEnabled = false,\n}: Props<T>) {\n const { routes, index } = navigationState;\n\n const panX = useAnimatedValue(0);\n\n const listenersRef = React.useRef<Listener[]>([]);\n\n const navigationStateRef = React.useRef(navigationState);\n const layoutRef = React.useRef(layout);\n const onIndexChangeRef = React.useRef(onIndexChange);\n\n const currentIndexRef = React.useRef(index);\n const pendingIndexRef = React.useRef<number>();\n\n const swipeVelocityThreshold = 0.15;\n const swipeDistanceThreshold = layout.width / 1.75;\n\n const jumpToIndex = React.useCallback(\n (index: number, animate = animationEnabled) => {\n const offset = -index * layoutRef.current.width;\n\n const { timing, ...transitionConfig } = DefaultTransitionSpec;\n\n if (animate) {\n Animated.parallel([\n timing(panX, {\n ...transitionConfig,\n toValue: offset,\n useNativeDriver: false,\n }),\n ]).start(({ finished }) => {\n if (finished) {\n onIndexChangeRef.current(index);\n pendingIndexRef.current = undefined;\n }\n });\n pendingIndexRef.current = index;\n } else {\n panX.setValue(offset);\n onIndexChangeRef.current(index);\n pendingIndexRef.current = undefined;\n }\n },\n [animationEnabled, panX]\n );\n\n React.useEffect(() => {\n navigationStateRef.current = navigationState;\n layoutRef.current = layout;\n onIndexChangeRef.current = onIndexChange;\n });\n\n React.useEffect(() => {\n const offset = -navigationStateRef.current.index * layout.width;\n\n panX.setValue(offset);\n }, [layout.width, panX]);\n\n React.useEffect(() => {\n if (keyboardDismissMode === 'auto') {\n Keyboard.dismiss();\n }\n\n if (layout.width && currentIndexRef.current !== index) {\n currentIndexRef.current = index;\n jumpToIndex(index);\n }\n }, [jumpToIndex, keyboardDismissMode, layout.width, index]);\n\n const isMovingHorizontally = (\n _: GestureResponderEvent,\n gestureState: PanResponderGestureState\n ) => {\n return (\n Math.abs(gestureState.dx) > Math.abs(gestureState.dy * 2) &&\n Math.abs(gestureState.vx) > Math.abs(gestureState.vy * 2)\n );\n };\n\n const canMoveScreen = (\n event: GestureResponderEvent,\n gestureState: PanResponderGestureState\n ) => {\n if (swipeEnabled === false) {\n return false;\n }\n\n const diffX = I18nManager.isRTL ? -gestureState.dx : gestureState.dx;\n\n return (\n isMovingHorizontally(event, gestureState) &&\n ((diffX >= DEAD_ZONE && currentIndexRef.current > 0) ||\n (diffX <= -DEAD_ZONE && currentIndexRef.current < routes.length - 1))\n );\n };\n\n const startGesture = () => {\n onSwipeStart?.();\n\n if (keyboardDismissMode === 'on-drag') {\n Keyboard.dismiss();\n }\n\n panX.stopAnimation();\n // @ts-expect-error: _value is private, but docs use it as well\n panX.setOffset(panX._value);\n };\n\n const respondToGesture = (\n _: GestureResponderEvent,\n gestureState: PanResponderGestureState\n ) => {\n const diffX = I18nManager.isRTL ? -gestureState.dx : gestureState.dx;\n\n if (\n // swiping left\n (diffX > 0 && index <= 0) ||\n // swiping right\n (diffX < 0 && index >= routes.length - 1)\n ) {\n return;\n }\n\n if (layout.width) {\n // @ts-expect-error: _offset is private, but docs use it as well\n const position = (panX._offset + diffX) / -layout.width;\n const next =\n position > index ? Math.ceil(position) : Math.floor(position);\n\n if (next !== index) {\n listenersRef.current.forEach((listener) => listener(next));\n }\n }\n\n panX.setValue(diffX);\n };\n\n const finishGesture = (\n _: GestureResponderEvent,\n gestureState: PanResponderGestureState\n ) => {\n panX.flattenOffset();\n\n onSwipeEnd?.();\n\n const currentIndex =\n typeof pendingIndexRef.current === 'number'\n ? pendingIndexRef.current\n : currentIndexRef.current;\n\n let nextIndex = currentIndex;\n\n if (\n Math.abs(gestureState.dx) > Math.abs(gestureState.dy) &&\n Math.abs(gestureState.vx) > Math.abs(gestureState.vy) &&\n (Math.abs(gestureState.dx) > swipeDistanceThreshold ||\n Math.abs(gestureState.vx) > swipeVelocityThreshold)\n ) {\n nextIndex = Math.round(\n Math.min(\n Math.max(\n 0,\n I18nManager.isRTL\n ? currentIndex + gestureState.dx / Math.abs(gestureState.dx)\n : currentIndex - gestureState.dx / Math.abs(gestureState.dx)\n ),\n routes.length - 1\n )\n );\n\n currentIndexRef.current = nextIndex;\n }\n\n if (!isFinite(nextIndex)) {\n nextIndex = currentIndex;\n }\n\n jumpToIndex(nextIndex, true);\n };\n\n // TODO: use the listeners\n const addEnterListener = React.useCallback((listener: Listener) => {\n listenersRef.current.push(listener);\n\n return () => {\n const index = listenersRef.current.indexOf(listener);\n\n if (index > -1) {\n listenersRef.current.splice(index, 1);\n }\n };\n }, []);\n\n const jumpTo = React.useCallback(\n (key: string) => {\n const index = navigationStateRef.current.routes.findIndex(\n (route: { key: string }) => route.key === key\n );\n\n jumpToIndex(index);\n },\n [jumpToIndex]\n );\n\n const panResponder = PanResponder.create({\n onMoveShouldSetPanResponder: canMoveScreen,\n onMoveShouldSetPanResponderCapture: canMoveScreen,\n onPanResponderGrant: startGesture,\n onPanResponderMove: respondToGesture,\n onPanResponderTerminate: finishGesture,\n onPanResponderRelease: finishGesture,\n onPanResponderTerminationRequest: () => true,\n });\n\n const maxTranslate = layout.width * (routes.length - 1);\n const translateX = Animated.multiply(\n panX.interpolate({\n inputRange: [-maxTranslate, 0],\n outputRange: [-maxTranslate, 0],\n extrapolate: 'clamp',\n }),\n I18nManager.isRTL ? -1 : 1\n );\n\n const position = React.useMemo(\n () => (layout.width ? Animated.divide(panX, -layout.width) : null),\n [layout.width, panX]\n );\n\n return children({\n position: position ?? new Animated.Value(index),\n addEnterListener,\n jumpTo,\n render: (children) => (\n <Animated.View\n style={[\n styles.sheet,\n layout.width\n ? {\n width: routes.length * layout.width,\n transform: [{ translateX }],\n }\n : null,\n style,\n ]}\n {...panResponder.panHandlers}\n >\n {React.Children.map(children, (child, i) => {\n const route = routes[i];\n const focused = i === index;\n\n return (\n <View\n key={route.key}\n style={\n layout.width\n ? { width: layout.width }\n : focused\n ? StyleSheet.absoluteFill\n : null\n }\n >\n {focused || layout.width ? child : null}\n </View>\n );\n })}\n </Animated.View>\n ),\n });\n}\n\nconst styles = StyleSheet.create({\n sheet: {\n flex: 1,\n flexDirection: 'row',\n alignItems: 'stretch',\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"names":["DEAD_ZONE","DefaultTransitionSpec","timing","Animated","spring","stiffness","damping","mass","overshootClamping","PanResponderAdapter","layout","keyboardDismissMode","swipeEnabled","navigationState","onIndexChange","onSwipeStart","onSwipeEnd","children","style","animationEnabled","routes","index","panX","useAnimatedValue","listenersRef","React","useRef","navigationStateRef","layoutRef","onIndexChangeRef","currentIndexRef","pendingIndexRef","swipeVelocityThreshold","swipeDistanceThreshold","width","jumpToIndex","useCallback","animate","offset","current","transitionConfig","parallel","toValue","useNativeDriver","start","finished","undefined","setValue","useEffect","Keyboard","dismiss","isMovingHorizontally","_","gestureState","Math","abs","dx","dy","vx","vy","canMoveScreen","event","diffX","I18nManager","isRTL","length","startGesture","stopAnimation","setOffset","_value","respondToGesture","position","_offset","next","ceil","floor","forEach","listener","finishGesture","flattenOffset","currentIndex","nextIndex","round","min","max","isFinite","addEnterListener","push","indexOf","splice","jumpTo","key","findIndex","route","panResponder","PanResponder","create","onMoveShouldSetPanResponder","onMoveShouldSetPanResponderCapture","onPanResponderGrant","onPanResponderMove","onPanResponderTerminate","onPanResponderRelease","onPanResponderTerminationRequest","maxTranslate","translateX","multiply","interpolate","inputRange","outputRange","extrapolate","useMemo","divide","Value","render","styles","sheet","transform","panHandlers","Children","map","child","i","focused","StyleSheet","absoluteFill","flex","flexDirection","alignItems"],"sources":["PanResponderAdapter.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n Animated,\n GestureResponderEvent,\n I18nManager,\n Keyboard,\n PanResponder,\n PanResponderGestureState,\n StyleSheet,\n View,\n} from 'react-native';\n\nimport type {\n EventEmitterProps,\n Layout,\n Listener,\n NavigationState,\n PagerProps,\n Route,\n} from './types';\nimport useAnimatedValue from './useAnimatedValue';\n\ntype Props<T extends Route> = PagerProps & {\n layout: Layout;\n onIndexChange: (index: number) => void;\n navigationState: NavigationState<T>;\n children: (\n props: EventEmitterProps & {\n // Animated value which represents the state of current index\n // It can include fractional digits as it represents the intermediate value\n position: Animated.AnimatedInterpolation;\n // Function to actually render the content of the pager\n // The parent component takes care of rendering\n render: (children: React.ReactNode) => React.ReactNode;\n // Callback to call when switching the tab\n // The tab switch animation is performed even if the index in state is unchanged\n jumpTo: (key: string) => void;\n }\n ) => React.ReactElement;\n};\n\nconst DEAD_ZONE = 12;\n\nconst DefaultTransitionSpec = {\n timing: Animated.spring,\n stiffness: 1000,\n damping: 500,\n mass: 3,\n overshootClamping: true,\n};\n\nexport default function PanResponderAdapter<T extends Route>({\n layout,\n keyboardDismissMode = 'auto',\n swipeEnabled = true,\n navigationState,\n onIndexChange,\n onSwipeStart,\n onSwipeEnd,\n children,\n style,\n animationEnabled = false,\n}: Props<T>) {\n const { routes, index } = navigationState;\n\n const panX = useAnimatedValue(0);\n\n const listenersRef = React.useRef<Listener[]>([]);\n\n const navigationStateRef = React.useRef(navigationState);\n const layoutRef = React.useRef(layout);\n const onIndexChangeRef = React.useRef(onIndexChange);\n\n const currentIndexRef = React.useRef(index);\n const pendingIndexRef = React.useRef<number>();\n\n const swipeVelocityThreshold = 0.15;\n const swipeDistanceThreshold = layout.width / 1.75;\n\n const jumpToIndex = React.useCallback(\n (index: number, animate = animationEnabled) => {\n const offset = -index * layoutRef.current.width;\n\n const { timing, ...transitionConfig } = DefaultTransitionSpec;\n\n if (animate) {\n Animated.parallel([\n timing(panX, {\n ...transitionConfig,\n toValue: offset,\n useNativeDriver: false,\n }),\n ]).start(({ finished }) => {\n if (finished) {\n onIndexChangeRef.current(index);\n pendingIndexRef.current = undefined;\n }\n });\n pendingIndexRef.current = index;\n } else {\n panX.setValue(offset);\n onIndexChangeRef.current(index);\n pendingIndexRef.current = undefined;\n }\n },\n [animationEnabled, panX]\n );\n\n React.useEffect(() => {\n navigationStateRef.current = navigationState;\n layoutRef.current = layout;\n onIndexChangeRef.current = onIndexChange;\n });\n\n React.useEffect(() => {\n const offset = -navigationStateRef.current.index * layout.width;\n\n panX.setValue(offset);\n }, [layout.width, panX]);\n\n React.useEffect(() => {\n if (keyboardDismissMode === 'auto') {\n Keyboard.dismiss();\n }\n\n if (layout.width && currentIndexRef.current !== index) {\n currentIndexRef.current = index;\n jumpToIndex(index);\n }\n }, [jumpToIndex, keyboardDismissMode, layout.width, index]);\n\n const isMovingHorizontally = (\n _: GestureResponderEvent,\n gestureState: PanResponderGestureState\n ) => {\n return (\n Math.abs(gestureState.dx) > Math.abs(gestureState.dy * 2) &&\n Math.abs(gestureState.vx) > Math.abs(gestureState.vy * 2)\n );\n };\n\n const canMoveScreen = (\n event: GestureResponderEvent,\n gestureState: PanResponderGestureState\n ) => {\n if (swipeEnabled === false) {\n return false;\n }\n\n const diffX = I18nManager.isRTL ? -gestureState.dx : gestureState.dx;\n\n return (\n isMovingHorizontally(event, gestureState) &&\n ((diffX >= DEAD_ZONE && currentIndexRef.current > 0) ||\n (diffX <= -DEAD_ZONE && currentIndexRef.current < routes.length - 1))\n );\n };\n\n const startGesture = () => {\n onSwipeStart?.();\n\n if (keyboardDismissMode === 'on-drag') {\n Keyboard.dismiss();\n }\n\n panX.stopAnimation();\n // @ts-expect-error: _value is private, but docs use it as well\n panX.setOffset(panX._value);\n };\n\n const respondToGesture = (\n _: GestureResponderEvent,\n gestureState: PanResponderGestureState\n ) => {\n const diffX = I18nManager.isRTL ? -gestureState.dx : gestureState.dx;\n\n if (\n // swiping left\n (diffX > 0 && index <= 0) ||\n // swiping right\n (diffX < 0 && index >= routes.length - 1)\n ) {\n return;\n }\n\n if (layout.width) {\n // @ts-expect-error: _offset is private, but docs use it as well\n const position = (panX._offset + diffX) / -layout.width;\n const next =\n position > index ? Math.ceil(position) : Math.floor(position);\n\n if (next !== index) {\n listenersRef.current.forEach((listener) => listener(next));\n }\n }\n\n panX.setValue(diffX);\n };\n\n const finishGesture = (\n _: GestureResponderEvent,\n gestureState: PanResponderGestureState\n ) => {\n panX.flattenOffset();\n\n onSwipeEnd?.();\n\n const currentIndex =\n typeof pendingIndexRef.current === 'number'\n ? pendingIndexRef.current\n : currentIndexRef.current;\n\n let nextIndex = currentIndex;\n\n if (\n Math.abs(gestureState.dx) > Math.abs(gestureState.dy) &&\n Math.abs(gestureState.vx) > Math.abs(gestureState.vy) &&\n (Math.abs(gestureState.dx) > swipeDistanceThreshold ||\n Math.abs(gestureState.vx) > swipeVelocityThreshold)\n ) {\n nextIndex = Math.round(\n Math.min(\n Math.max(\n 0,\n I18nManager.isRTL\n ? currentIndex + gestureState.dx / Math.abs(gestureState.dx)\n : currentIndex - gestureState.dx / Math.abs(gestureState.dx)\n ),\n routes.length - 1\n )\n );\n\n currentIndexRef.current = nextIndex;\n }\n\n if (!isFinite(nextIndex)) {\n nextIndex = currentIndex;\n }\n\n jumpToIndex(nextIndex, true);\n };\n\n // TODO: use the listeners\n const addEnterListener = React.useCallback((listener: Listener) => {\n listenersRef.current.push(listener);\n\n return () => {\n const index = listenersRef.current.indexOf(listener);\n\n if (index > -1) {\n listenersRef.current.splice(index, 1);\n }\n };\n }, []);\n\n const jumpTo = React.useCallback(\n (key: string) => {\n const index = navigationStateRef.current.routes.findIndex(\n (route: { key: string }) => route.key === key\n );\n\n jumpToIndex(index);\n },\n [jumpToIndex]\n );\n\n const panResponder = PanResponder.create({\n onMoveShouldSetPanResponder: canMoveScreen,\n onMoveShouldSetPanResponderCapture: canMoveScreen,\n onPanResponderGrant: startGesture,\n onPanResponderMove: respondToGesture,\n onPanResponderTerminate: finishGesture,\n onPanResponderRelease: finishGesture,\n onPanResponderTerminationRequest: () => true,\n });\n\n const maxTranslate = layout.width * (routes.length - 1);\n const translateX = Animated.multiply(\n panX.interpolate({\n inputRange: [-maxTranslate, 0],\n outputRange: [-maxTranslate, 0],\n extrapolate: 'clamp',\n }),\n I18nManager.isRTL ? -1 : 1\n );\n\n const position = React.useMemo(\n () => (layout.width ? Animated.divide(panX, -layout.width) : null),\n [layout.width, panX]\n );\n\n return children({\n position: position ?? new Animated.Value(index),\n addEnterListener,\n jumpTo,\n render: (children) => (\n <Animated.View\n style={[\n styles.sheet,\n layout.width\n ? {\n width: routes.length * layout.width,\n transform: [{ translateX }],\n }\n : null,\n style,\n ]}\n {...panResponder.panHandlers}\n >\n {React.Children.map(children, (child, i) => {\n const route = routes[i];\n const focused = i === index;\n\n return (\n <View\n key={route.key}\n style={\n layout.width\n ? { width: layout.width }\n : focused\n ? StyleSheet.absoluteFill\n : null\n }\n >\n {focused || layout.width ? child : null}\n </View>\n );\n })}\n </Animated.View>\n ),\n });\n}\n\nconst styles = StyleSheet.create({\n sheet: {\n flex: 1,\n flexDirection: 'row',\n alignItems: 'stretch',\n },\n});\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"names":["SceneComponent","React","memo","component","rest","createElement","SceneMap","scenes","route","jumpTo","position","key"],"sources":["SceneMap.tsx"],"sourcesContent":["import * as React from 'react';\nimport type { SceneRendererProps } from './types';\n\ntype SceneProps = {\n route: any;\n} & Omit<SceneRendererProps, 'layout'>;\n\nconst SceneComponent = React.memo(\n <T extends { component: React.ComponentType<any> } & SceneProps>({\n component,\n ...rest\n }: T) => {\n return React.createElement(component, rest);\n }\n);\n\nexport default function SceneMap<T extends any>(scenes: {\n [key: string]: React.ComponentType<T>;\n}) {\n return ({ route, jumpTo, position }: SceneProps) => (\n <SceneComponent\n key={route.key}\n component={scenes[route.key]}\n route={route}\n jumpTo={jumpTo}\n position={position}\n />\n );\n}\n"],"mappings":";;;;;;;AAAA;;;;;;AAOA,MAAMA,cAAc,gBAAGC,KAAK,CAACC,IAAN,CACrB,QAGS;EAAA,IAHwD;IAC/DC,SAD+D;IAE/D,GAAGC;EAF4D,CAGxD;EACP,oBAAOH,KAAK,CAACI,aAAN,CAAoBF,SAApB,EAA+BC,IAA/B,CAAP;AACD,CANoB,CAAvB;;AASe,SAASE,QAAT,CAAiCC,MAAjC,EAEZ;EACD,OAAO;IAAA,IAAC;MAAEC,KAAF;MAASC,MAAT;MAAiBC;IAAjB,CAAD;IAAA,oBACL,oBAAC,cAAD;MACE,GAAG,EAAEF,KAAK,CAACG,GADb;MAEE,SAAS,EAAEJ,MAAM,CAACC,KAAK,CAACG,GAAP,CAFnB;MAGE,KAAK,EAAEH,KAHT;MAIE,MAAM,EAAEC,MAJV;MAKE,QAAQ,EAAEC;IALZ,EADK;EAAA,CAAP;AASD"}
1
+ {"version":3,"names":["SceneComponent","React","memo","component","rest","createElement","SceneMap","scenes","route","jumpTo","position","key"],"sources":["SceneMap.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport type { SceneRendererProps } from './types';\n\ntype SceneProps = {\n route: any;\n} & Omit<SceneRendererProps, 'layout'>;\n\nconst SceneComponent = React.memo(\n <T extends { component: React.ComponentType<any> } & SceneProps>({\n component,\n ...rest\n }: T) => {\n return React.createElement(component, rest);\n }\n);\n\nexport default function SceneMap<T extends any>(scenes: {\n [key: string]: React.ComponentType<T>;\n}) {\n return ({ route, jumpTo, position }: SceneProps) => (\n <SceneComponent\n key={route.key}\n component={scenes[route.key]}\n route={route}\n jumpTo={jumpTo}\n position={position}\n />\n );\n}\n"],"mappings":";;;;;;;AAAA;;;;;;AAQA,MAAMA,cAAc,gBAAGC,KAAK,CAACC,IAAN,CACrB,QAGS;EAAA,IAHwD;IAC/DC,SAD+D;IAE/D,GAAGC;EAF4D,CAGxD;EACP,oBAAOH,KAAK,CAACI,aAAN,CAAoBF,SAApB,EAA+BC,IAA/B,CAAP;AACD,CANoB,CAAvB;;AASe,SAASE,QAAT,CAAiCC,MAAjC,EAEZ;EACD,OAAO;IAAA,IAAC;MAAEC,KAAF;MAASC,MAAT;MAAiBC;IAAjB,CAAD;IAAA,oBACL,oBAAC,cAAD;MACE,GAAG,EAAEF,KAAK,CAACG,GADb;MAEE,SAAS,EAAEJ,MAAM,CAACC,KAAK,CAACG,GAAP,CAFnB;MAGE,KAAK,EAAEH,KAHT;MAIE,MAAM,EAAEC,MAJV;MAKE,QAAQ,EAAEC;IALZ,EADK;EAAA,CAAP;AASD"}
@@ -1 +1 @@
1
- {"version":3,"names":["SceneView","children","navigationState","lazy","layout","index","lazyPreloadDistance","addEnterListener","style","isLoading","setIsLoading","React","useState","Math","abs","useEffect","handleEnter","value","prevState","unsubscribe","timer","setTimeout","clearTimeout","focused","styles","route","width","StyleSheet","absoluteFill","loading","create","flex","overflow"],"sources":["SceneView.tsx"],"sourcesContent":["import * as React from 'react';\nimport { View, StyleSheet, StyleProp, ViewStyle } from 'react-native';\nimport type {\n SceneRendererProps,\n EventEmitterProps,\n NavigationState,\n Route,\n} from './types';\n\ntype Props<T extends Route> = SceneRendererProps &\n EventEmitterProps & {\n navigationState: NavigationState<T>;\n lazy: boolean;\n lazyPreloadDistance: number;\n index: number;\n children: (props: { loading: boolean }) => React.ReactNode;\n style?: StyleProp<ViewStyle>;\n };\n\nexport default function SceneView<T extends Route>({\n children,\n navigationState,\n lazy,\n layout,\n index,\n lazyPreloadDistance,\n addEnterListener,\n style,\n}: Props<T>) {\n const [isLoading, setIsLoading] = React.useState(\n Math.abs(navigationState.index - index) > lazyPreloadDistance\n );\n\n if (\n isLoading &&\n Math.abs(navigationState.index - index) <= lazyPreloadDistance\n ) {\n // Always render the route when it becomes focused\n setIsLoading(false);\n }\n\n React.useEffect(() => {\n const handleEnter = (value: number) => {\n // If we're entering the current route, we need to load it\n if (value === index) {\n setIsLoading((prevState) => {\n if (prevState) {\n return false;\n }\n return prevState;\n });\n }\n };\n\n let unsubscribe: (() => void) | undefined;\n let timer: NodeJS.Timeout;\n\n if (lazy && isLoading) {\n // If lazy mode is enabled, listen to when we enter screens\n unsubscribe = addEnterListener(handleEnter);\n } else if (isLoading) {\n // If lazy mode is not enabled, render the scene with a delay if not loaded already\n // This improves the initial startup time as the scene is no longer blocking\n timer = setTimeout(() => setIsLoading(false), 0);\n }\n\n return () => {\n unsubscribe?.();\n clearTimeout(timer);\n };\n }, [addEnterListener, index, isLoading, lazy]);\n\n const focused = navigationState.index === index;\n\n return (\n <View\n accessibilityElementsHidden={!focused}\n importantForAccessibility={focused ? 'auto' : 'no-hide-descendants'}\n style={[\n styles.route,\n // If we don't have the layout yet, make the focused screen fill the container\n // This avoids delay before we are able to render pages side by side\n layout.width\n ? { width: layout.width }\n : focused\n ? StyleSheet.absoluteFill\n : null,\n style,\n ]}\n >\n {\n // Only render the route only if it's either focused or layout is available\n // When layout is not available, we must not render unfocused routes\n // so that the focused route can fill the screen\n focused || layout.width ? children({ loading: isLoading }) : null\n }\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n route: {\n flex: 1,\n overflow: 'hidden',\n },\n});\n"],"mappings":";;;;;;;AAAA;;AACA;;;;;;AAkBe,SAASA,SAAT,OASF;EAAA,IATsC;IACjDC,QADiD;IAEjDC,eAFiD;IAGjDC,IAHiD;IAIjDC,MAJiD;IAKjDC,KALiD;IAMjDC,mBANiD;IAOjDC,gBAPiD;IAQjDC;EARiD,CAStC;EACX,MAAM,CAACC,SAAD,EAAYC,YAAZ,IAA4BC,KAAK,CAACC,QAAN,CAChCC,IAAI,CAACC,GAAL,CAASZ,eAAe,CAACG,KAAhB,GAAwBA,KAAjC,IAA0CC,mBADV,CAAlC;;EAIA,IACEG,SAAS,IACTI,IAAI,CAACC,GAAL,CAASZ,eAAe,CAACG,KAAhB,GAAwBA,KAAjC,KAA2CC,mBAF7C,EAGE;IACA;IACAI,YAAY,CAAC,KAAD,CAAZ;EACD;;EAEDC,KAAK,CAACI,SAAN,CAAgB,MAAM;IACpB,MAAMC,WAAW,GAAIC,KAAD,IAAmB;MACrC;MACA,IAAIA,KAAK,KAAKZ,KAAd,EAAqB;QACnBK,YAAY,CAAEQ,SAAD,IAAe;UAC1B,IAAIA,SAAJ,EAAe;YACb,OAAO,KAAP;UACD;;UACD,OAAOA,SAAP;QACD,CALW,CAAZ;MAMD;IACF,CAVD;;IAYA,IAAIC,WAAJ;IACA,IAAIC,KAAJ;;IAEA,IAAIjB,IAAI,IAAIM,SAAZ,EAAuB;MACrB;MACAU,WAAW,GAAGZ,gBAAgB,CAACS,WAAD,CAA9B;IACD,CAHD,MAGO,IAAIP,SAAJ,EAAe;MACpB;MACA;MACAW,KAAK,GAAGC,UAAU,CAAC,MAAMX,YAAY,CAAC,KAAD,CAAnB,EAA4B,CAA5B,CAAlB;IACD;;IAED,OAAO,MAAM;MAAA;;MACX,gBAAAS,WAAW,UAAX;MACAG,YAAY,CAACF,KAAD,CAAZ;IACD,CAHD;EAID,CA7BD,EA6BG,CAACb,gBAAD,EAAmBF,KAAnB,EAA0BI,SAA1B,EAAqCN,IAArC,CA7BH;EA+BA,MAAMoB,OAAO,GAAGrB,eAAe,CAACG,KAAhB,KAA0BA,KAA1C;EAEA,oBACE,oBAAC,iBAAD;IACE,2BAA2B,EAAE,CAACkB,OADhC;IAEE,yBAAyB,EAAEA,OAAO,GAAG,MAAH,GAAY,qBAFhD;IAGE,KAAK,EAAE,CACLC,MAAM,CAACC,KADF,EAEL;IACA;IACArB,MAAM,CAACsB,KAAP,GACI;MAAEA,KAAK,EAAEtB,MAAM,CAACsB;IAAhB,CADJ,GAEIH,OAAO,GACPI,uBAAA,CAAWC,YADJ,GAEP,IARC,EASLpB,KATK;EAHT,GAgBI;EACA;EACA;EACAe,OAAO,IAAInB,MAAM,CAACsB,KAAlB,GAA0BzB,QAAQ,CAAC;IAAE4B,OAAO,EAAEpB;EAAX,CAAD,CAAlC,GAA6D,IAnBjE,CADF;AAwBD;;AAED,MAAMe,MAAM,GAAGG,uBAAA,CAAWG,MAAX,CAAkB;EAC/BL,KAAK,EAAE;IACLM,IAAI,EAAE,CADD;IAELC,QAAQ,EAAE;EAFL;AADwB,CAAlB,CAAf"}
1
+ {"version":3,"names":["SceneView","children","navigationState","lazy","layout","index","lazyPreloadDistance","addEnterListener","style","isLoading","setIsLoading","React","useState","Math","abs","useEffect","handleEnter","value","prevState","unsubscribe","timer","setTimeout","clearTimeout","focused","styles","route","width","StyleSheet","absoluteFill","loading","create","flex","overflow"],"sources":["SceneView.tsx"],"sourcesContent":["import * as React from 'react';\nimport { StyleProp, StyleSheet, View, ViewStyle } from 'react-native';\n\nimport type {\n EventEmitterProps,\n NavigationState,\n Route,\n SceneRendererProps,\n} from './types';\n\ntype Props<T extends Route> = SceneRendererProps &\n EventEmitterProps & {\n navigationState: NavigationState<T>;\n lazy: boolean;\n lazyPreloadDistance: number;\n index: number;\n children: (props: { loading: boolean }) => React.ReactNode;\n style?: StyleProp<ViewStyle>;\n };\n\nexport default function SceneView<T extends Route>({\n children,\n navigationState,\n lazy,\n layout,\n index,\n lazyPreloadDistance,\n addEnterListener,\n style,\n}: Props<T>) {\n const [isLoading, setIsLoading] = React.useState(\n Math.abs(navigationState.index - index) > lazyPreloadDistance\n );\n\n if (\n isLoading &&\n Math.abs(navigationState.index - index) <= lazyPreloadDistance\n ) {\n // Always render the route when it becomes focused\n setIsLoading(false);\n }\n\n React.useEffect(() => {\n const handleEnter = (value: number) => {\n // If we're entering the current route, we need to load it\n if (value === index) {\n setIsLoading((prevState) => {\n if (prevState) {\n return false;\n }\n return prevState;\n });\n }\n };\n\n let unsubscribe: (() => void) | undefined;\n let timer: NodeJS.Timeout;\n\n if (lazy && isLoading) {\n // If lazy mode is enabled, listen to when we enter screens\n unsubscribe = addEnterListener(handleEnter);\n } else if (isLoading) {\n // If lazy mode is not enabled, render the scene with a delay if not loaded already\n // This improves the initial startup time as the scene is no longer blocking\n timer = setTimeout(() => setIsLoading(false), 0);\n }\n\n return () => {\n unsubscribe?.();\n clearTimeout(timer);\n };\n }, [addEnterListener, index, isLoading, lazy]);\n\n const focused = navigationState.index === index;\n\n return (\n <View\n accessibilityElementsHidden={!focused}\n importantForAccessibility={focused ? 'auto' : 'no-hide-descendants'}\n style={[\n styles.route,\n // If we don't have the layout yet, make the focused screen fill the container\n // This avoids delay before we are able to render pages side by side\n layout.width\n ? { width: layout.width }\n : focused\n ? StyleSheet.absoluteFill\n : null,\n style,\n ]}\n >\n {\n // Only render the route only if it's either focused or layout is available\n // When layout is not available, we must not render unfocused routes\n // so that the focused route can fill the screen\n focused || layout.width ? children({ loading: isLoading }) : null\n }\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n route: {\n flex: 1,\n overflow: 'hidden',\n },\n});\n"],"mappings":";;;;;;;AAAA;;AACA;;;;;;AAmBe,SAASA,SAAT,OASF;EAAA,IATsC;IACjDC,QADiD;IAEjDC,eAFiD;IAGjDC,IAHiD;IAIjDC,MAJiD;IAKjDC,KALiD;IAMjDC,mBANiD;IAOjDC,gBAPiD;IAQjDC;EARiD,CAStC;EACX,MAAM,CAACC,SAAD,EAAYC,YAAZ,IAA4BC,KAAK,CAACC,QAAN,CAChCC,IAAI,CAACC,GAAL,CAASZ,eAAe,CAACG,KAAhB,GAAwBA,KAAjC,IAA0CC,mBADV,CAAlC;;EAIA,IACEG,SAAS,IACTI,IAAI,CAACC,GAAL,CAASZ,eAAe,CAACG,KAAhB,GAAwBA,KAAjC,KAA2CC,mBAF7C,EAGE;IACA;IACAI,YAAY,CAAC,KAAD,CAAZ;EACD;;EAEDC,KAAK,CAACI,SAAN,CAAgB,MAAM;IACpB,MAAMC,WAAW,GAAIC,KAAD,IAAmB;MACrC;MACA,IAAIA,KAAK,KAAKZ,KAAd,EAAqB;QACnBK,YAAY,CAAEQ,SAAD,IAAe;UAC1B,IAAIA,SAAJ,EAAe;YACb,OAAO,KAAP;UACD;;UACD,OAAOA,SAAP;QACD,CALW,CAAZ;MAMD;IACF,CAVD;;IAYA,IAAIC,WAAJ;IACA,IAAIC,KAAJ;;IAEA,IAAIjB,IAAI,IAAIM,SAAZ,EAAuB;MACrB;MACAU,WAAW,GAAGZ,gBAAgB,CAACS,WAAD,CAA9B;IACD,CAHD,MAGO,IAAIP,SAAJ,EAAe;MACpB;MACA;MACAW,KAAK,GAAGC,UAAU,CAAC,MAAMX,YAAY,CAAC,KAAD,CAAnB,EAA4B,CAA5B,CAAlB;IACD;;IAED,OAAO,MAAM;MAAA;;MACX,gBAAAS,WAAW,UAAX;MACAG,YAAY,CAACF,KAAD,CAAZ;IACD,CAHD;EAID,CA7BD,EA6BG,CAACb,gBAAD,EAAmBF,KAAnB,EAA0BI,SAA1B,EAAqCN,IAArC,CA7BH;EA+BA,MAAMoB,OAAO,GAAGrB,eAAe,CAACG,KAAhB,KAA0BA,KAA1C;EAEA,oBACE,oBAAC,iBAAD;IACE,2BAA2B,EAAE,CAACkB,OADhC;IAEE,yBAAyB,EAAEA,OAAO,GAAG,MAAH,GAAY,qBAFhD;IAGE,KAAK,EAAE,CACLC,MAAM,CAACC,KADF,EAEL;IACA;IACArB,MAAM,CAACsB,KAAP,GACI;MAAEA,KAAK,EAAEtB,MAAM,CAACsB;IAAhB,CADJ,GAEIH,OAAO,GACPI,uBAAA,CAAWC,YADJ,GAEP,IARC,EASLpB,KATK;EAHT,GAgBI;EACA;EACA;EACAe,OAAO,IAAInB,MAAM,CAACsB,KAAlB,GAA0BzB,QAAQ,CAAC;IAAE4B,OAAO,EAAEpB;EAAX,CAAD,CAAlC,GAA6D,IAnBjE,CADF;AAwBD;;AAED,MAAMe,MAAM,GAAGG,uBAAA,CAAWG,MAAX,CAAkB;EAC/BL,KAAK,EAAE;IACLM,IAAI,EAAE,CADD;IAELC,QAAQ,EAAE;EAFL;AADwB,CAAlB,CAAf"}
@@ -9,10 +9,12 @@ var React = _interopRequireWildcard(require("react"));
9
9
 
10
10
  var _reactNative = require("react-native");
11
11
 
12
- var _TabBarItem = _interopRequireDefault(require("./TabBarItem"));
12
+ var _useLatestCallback = _interopRequireDefault(require("use-latest-callback"));
13
13
 
14
14
  var _TabBarIndicator = _interopRequireDefault(require("./TabBarIndicator"));
15
15
 
16
+ var _TabBarItem = _interopRequireDefault(require("./TabBarItem"));
17
+
16
18
  var _useAnimatedValue = _interopRequireDefault(require("./useAnimatedValue"));
17
19
 
18
20
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -81,7 +83,7 @@ const getTabBarWidth = _ref2 => {
81
83
  const {
82
84
  routes
83
85
  } = navigationState;
84
- return routes.reduce((acc, _, i) => acc + (i > 0 ? gap ?? 0 : 0) + getComputedTabWidth(i, layout, routes, scrollEnabled, tabWidths, flattenedTabWidth), 0);
86
+ return routes.reduce((acc, _, i) => acc + (i > 0 ? gap !== null && gap !== void 0 ? gap : 0 : 0) + getComputedTabWidth(i, layout, routes, scrollEnabled, tabWidths, flattenedTabWidth), 0);
85
87
  };
86
88
 
87
89
  const normalizeScrollValue = _ref3 => {
@@ -129,7 +131,7 @@ const getScrollAmount = _ref4 => {
129
131
  const tabWidth = getComputedTabWidth(i, layout, navigationState.routes, scrollEnabled, tabWidths, flattenedTabWidth); // To get the current index centered we adjust scroll amount by width of indexes
130
132
  // 0 through (i - 1) and add half the width of current index i
131
133
 
132
- return total + (navigationState.index === i ? (tabWidth + (gap ?? 0)) / 2 : tabWidth + (gap ?? 0));
134
+ return total + (navigationState.index === i ? (tabWidth + (gap !== null && gap !== void 0 ? gap : 0)) / 2 : tabWidth + (gap !== null && gap !== void 0 ? gap : 0));
133
135
  }, 0);
134
136
  const scrollAmount = centerDistance - layout.width / 2;
135
137
  return normalizeScrollValue({
@@ -171,7 +173,11 @@ const getTestIdDefault = _ref8 => {
171
173
  route
172
174
  } = _ref8;
173
175
  return route.testID;
174
- };
176
+ }; // How many items measurements should we update per batch.
177
+ // Defaults to 10, since that's whats FlatList is using in initialNumToRender.
178
+
179
+
180
+ const MEASURE_PER_BATCH = 10;
175
181
 
176
182
  function TabBar(_ref9) {
177
183
  let {
@@ -201,7 +207,8 @@ function TabBar(_ref9) {
201
207
  renderLabel,
202
208
  renderTabBarItem,
203
209
  style,
204
- tabStyle
210
+ tabStyle,
211
+ testID
205
212
  } = _ref9;
206
213
  const [layout, setLayout] = React.useState({
207
214
  width: 0,
@@ -225,7 +232,7 @@ function TabBar(_ref9) {
225
232
  scrollEnabled,
226
233
  flattenedTabWidth
227
234
  });
228
- const hasMeasuredTabWidths = Boolean(layout.width) && routes.every(r => typeof tabWidths[r.key] === 'number');
235
+ const hasMeasuredTabWidths = Boolean(layout.width) && routes.slice(0, navigationState.index).every(r => typeof tabWidths[r.key] === 'number');
229
236
  React.useEffect(() => {
230
237
  if (isFirst.current) {
231
238
  isFirst.current = false;
@@ -233,7 +240,6 @@ function TabBar(_ref9) {
233
240
  }
234
241
 
235
242
  if (isWidthDynamic && !hasMeasuredTabWidths) {
236
- // When tab width is dynamic, only adjust the scroll once we have all tab widths and layout
237
243
  return;
238
244
  }
239
245
 
@@ -294,8 +300,14 @@ function TabBar(_ref9) {
294
300
  onLayout: isWidthDynamic ? e => {
295
301
  measuredTabWidths.current[route.key] = e.nativeEvent.layout.width; // When we have measured widths for all of the tabs, we should updates the state
296
302
  // We avoid doing separate setState for each layout since it triggers multiple renders and slows down app
303
+ // If we have more than 10 routes divide updating tabWidths into multiple batches. Here we update only first batch of 10 items.
297
304
 
298
- if (routes.every(r => typeof measuredTabWidths.current[r.key] === 'number')) {
305
+ if (routes.length > MEASURE_PER_BATCH && index === MEASURE_PER_BATCH && routes.slice(0, MEASURE_PER_BATCH).every(r => typeof measuredTabWidths.current[r.key] === 'number')) {
306
+ setTabWidths({ ...measuredTabWidths.current
307
+ });
308
+ } else if (routes.every(r => typeof measuredTabWidths.current[r.key] === 'number')) {
309
+ // When we have measured widths for all of the tabs, we should updates the state
310
+ // We avoid doing separate setState for each layout since it triggers multiple renders and slows down app
299
311
  setTabWidths({ ...measuredTabWidths.current
300
312
  });
301
313
  }
@@ -341,6 +353,24 @@ function TabBar(_ref9) {
341
353
  }], {
342
354
  useNativeDriver: true
343
355
  }), [scrollAmount]);
356
+ const handleViewableItemsChanged = (0, _useLatestCallback.default)(_ref11 => {
357
+ let {
358
+ changed
359
+ } = _ref11;
360
+
361
+ if (routes.length <= MEASURE_PER_BATCH) {
362
+ return;
363
+ } // Get next vievable item
364
+
365
+
366
+ const item = changed[changed.length - 1];
367
+ const index = (item === null || item === void 0 ? void 0 : item.index) || 0;
368
+
369
+ if (item.isViewable && (index % 10 === 0 || index === navigationState.index || index === routes.length - 1)) {
370
+ setTabWidths({ ...measuredTabWidths.current
371
+ });
372
+ }
373
+ });
344
374
  return /*#__PURE__*/React.createElement(_reactNative.Animated.View, {
345
375
  onLayout: handleLayout,
346
376
  style: [styles.tabBar, style]
@@ -374,6 +404,8 @@ function TabBar(_ref9) {
374
404
  keyboardShouldPersistTaps: "handled",
375
405
  scrollEnabled: scrollEnabled,
376
406
  bounces: bounces,
407
+ initialNumToRender: MEASURE_PER_BATCH,
408
+ onViewableItemsChanged: handleViewableItemsChanged,
377
409
  alwaysBounceHorizontal: false,
378
410
  scrollsToTop: false,
379
411
  showsHorizontalScrollIndicator: false,
@@ -384,7 +416,8 @@ function TabBar(_ref9) {
384
416
  scrollEventThrottle: 16,
385
417
  renderItem: renderItem,
386
418
  onScroll: handleScroll,
387
- ref: flatListRef
419
+ ref: flatListRef,
420
+ testID: testID
388
421
  })));
389
422
  }
390
423
 
@@ -1 +1 @@
1
- {"version":3,"names":["Separator","width","getFlattenedTabWidth","style","tabStyle","StyleSheet","flatten","getComputedTabWidth","index","layout","routes","scrollEnabled","tabWidths","flattenedWidth","key","endsWith","parseFloat","Number","isFinite","length","getMaxScrollDistance","tabBarWidth","layoutWidth","getTranslateX","scrollAmount","maxScrollDistance","Animated","multiply","Platform","OS","I18nManager","isRTL","add","getTabBarWidth","navigationState","gap","flattenedTabWidth","reduce","acc","_","i","normalizeScrollValue","value","maxDistance","scrollValue","Math","max","min","getScrollAmount","centerDistance","Array","from","total","tabWidth","getLabelTextDefault","route","title","getAccessibleDefault","accessible","getAccessibilityLabelDefault","accessibilityLabel","undefined","renderIndicatorDefault","props","getTestIdDefault","testID","TabBar","getLabelText","getAccessible","getAccessibilityLabel","getTestID","renderIndicator","jumpTo","position","activeColor","bounces","contentContainerStyle","inactiveColor","indicatorContainerStyle","indicatorStyle","labelStyle","onTabLongPress","onTabPress","pressColor","pressOpacity","renderBadge","renderIcon","renderLabel","renderTabBarItem","setLayout","React","useState","height","setTabWidths","flatListRef","useRef","isFirst","useAnimatedValue","measuredTabWidths","isWidthDynamic","scrollOffset","hasMeasuredTabWidths","Boolean","every","r","useEffect","current","scrollToOffset","offset","animated","handleLayout","e","nativeEvent","separatorsWidth","separatorPercent","tabBarWidthPercent","translateX","useMemo","renderItem","useCallback","item","onLayout","onPress","event","defaultPrevented","preventDefault","onLongPress","defaultTabWidth","keyExtractor","contentContainerStyleMemoized","styles","tabContent","container","handleScroll","contentOffset","x","useNativeDriver","tabBar","indicatorContainer","transform","getTabWidth","scroll","create","flex","overflow","select","default","web","backgroundColor","elevation","shadowColor","shadowOpacity","shadowRadius","hairlineWidth","shadowOffset","zIndex","flexDirection","flexWrap","top","left","right","bottom"],"sources":["TabBar.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n Animated,\n StyleSheet,\n View,\n StyleProp,\n ViewStyle,\n TextStyle,\n LayoutChangeEvent,\n I18nManager,\n Platform,\n FlatList,\n ListRenderItemInfo,\n} from 'react-native';\nimport TabBarItem, { Props as TabBarItemProps } from './TabBarItem';\nimport TabBarIndicator, { Props as IndicatorProps } from './TabBarIndicator';\nimport type {\n Route,\n Scene,\n SceneRendererProps,\n NavigationState,\n Layout,\n Event,\n} from './types';\nimport useAnimatedValue from './useAnimatedValue';\n\nexport type Props<T extends Route> = SceneRendererProps & {\n navigationState: NavigationState<T>;\n scrollEnabled?: boolean;\n bounces?: boolean;\n activeColor?: string;\n inactiveColor?: string;\n pressColor?: string;\n pressOpacity?: number;\n getLabelText?: (scene: Scene<T>) => string | undefined;\n getAccessible?: (scene: Scene<T>) => boolean | undefined;\n getAccessibilityLabel?: (scene: Scene<T>) => string | undefined;\n getTestID?: (scene: Scene<T>) => string | undefined;\n renderLabel?: (\n scene: Scene<T> & {\n focused: boolean;\n color: string;\n }\n ) => React.ReactNode;\n renderIcon?: (\n scene: Scene<T> & {\n focused: boolean;\n color: string;\n }\n ) => React.ReactNode;\n renderBadge?: (scene: Scene<T>) => React.ReactNode;\n renderIndicator?: (props: IndicatorProps<T>) => React.ReactNode;\n renderTabBarItem?: (\n props: TabBarItemProps<T> & { key: string }\n ) => React.ReactElement;\n onTabPress?: (scene: Scene<T> & Event) => void;\n onTabLongPress?: (scene: Scene<T>) => void;\n tabStyle?: StyleProp<ViewStyle>;\n indicatorStyle?: StyleProp<ViewStyle>;\n indicatorContainerStyle?: StyleProp<ViewStyle>;\n labelStyle?: StyleProp<TextStyle>;\n contentContainerStyle?: StyleProp<ViewStyle>;\n style?: StyleProp<ViewStyle>;\n gap?: number;\n};\n\ntype FlattenedTabWidth = string | number | undefined;\n\nconst Separator = ({ width }: { width: number }) => {\n return <View style={{ width }} />;\n};\n\nconst getFlattenedTabWidth = (style: StyleProp<ViewStyle>) => {\n const tabStyle = StyleSheet.flatten(style);\n\n return tabStyle?.width;\n};\n\nconst getComputedTabWidth = (\n index: number,\n layout: Layout,\n routes: Route[],\n scrollEnabled: boolean | undefined,\n tabWidths: { [key: string]: number },\n flattenedWidth: FlattenedTabWidth\n) => {\n if (flattenedWidth === 'auto') {\n return tabWidths[routes[index].key] || 0;\n }\n\n switch (typeof flattenedWidth) {\n case 'number':\n return flattenedWidth;\n case 'string':\n if (flattenedWidth.endsWith('%')) {\n const width = parseFloat(flattenedWidth);\n if (Number.isFinite(width)) {\n return layout.width * (width / 100);\n }\n }\n }\n\n if (scrollEnabled) {\n return (layout.width / 5) * 2;\n }\n return layout.width / routes.length;\n};\n\nconst getMaxScrollDistance = (tabBarWidth: number, layoutWidth: number) =>\n tabBarWidth - layoutWidth;\n\nconst getTranslateX = (\n scrollAmount: Animated.Value,\n maxScrollDistance: number\n) =>\n Animated.multiply(\n Platform.OS === 'android' && I18nManager.isRTL\n ? Animated.add(maxScrollDistance, Animated.multiply(scrollAmount, -1))\n : scrollAmount,\n I18nManager.isRTL ? 1 : -1\n );\n\nconst getTabBarWidth = <T extends Route>({\n navigationState,\n layout,\n gap,\n scrollEnabled,\n flattenedTabWidth,\n tabWidths,\n}: Pick<Props<T>, 'navigationState' | 'gap' | 'layout' | 'scrollEnabled'> & {\n tabWidths: Record<string, number>;\n flattenedTabWidth: FlattenedTabWidth;\n}) => {\n const { routes } = navigationState;\n\n return routes.reduce<number>(\n (acc, _, i) =>\n acc +\n (i > 0 ? gap ?? 0 : 0) +\n getComputedTabWidth(\n i,\n layout,\n routes,\n scrollEnabled,\n tabWidths,\n flattenedTabWidth\n ),\n 0\n );\n};\n\nconst normalizeScrollValue = <T extends Route>({\n layout,\n navigationState,\n gap,\n scrollEnabled,\n tabWidths,\n value,\n flattenedTabWidth,\n}: Pick<Props<T>, 'layout' | 'navigationState' | 'gap' | 'scrollEnabled'> & {\n tabWidths: Record<string, number>;\n value: number;\n flattenedTabWidth: FlattenedTabWidth;\n}) => {\n const tabBarWidth = getTabBarWidth({\n layout,\n navigationState,\n tabWidths,\n gap,\n scrollEnabled,\n flattenedTabWidth,\n });\n const maxDistance = getMaxScrollDistance(tabBarWidth, layout.width);\n const scrollValue = Math.max(Math.min(value, maxDistance), 0);\n\n if (Platform.OS === 'android' && I18nManager.isRTL) {\n // On Android, scroll value is not applied in reverse in RTL\n // so we need to manually adjust it to apply correct value\n return maxDistance - scrollValue;\n }\n\n return scrollValue;\n};\n\nconst getScrollAmount = <T extends Route>({\n layout,\n navigationState,\n gap,\n scrollEnabled,\n flattenedTabWidth,\n tabWidths,\n}: Pick<Props<T>, 'layout' | 'navigationState' | 'scrollEnabled' | 'gap'> & {\n tabWidths: Record<string, number>;\n flattenedTabWidth: FlattenedTabWidth;\n}) => {\n const centerDistance = Array.from({\n length: navigationState.index + 1,\n }).reduce<number>((total, _, i) => {\n const tabWidth = getComputedTabWidth(\n i,\n layout,\n navigationState.routes,\n scrollEnabled,\n tabWidths,\n flattenedTabWidth\n );\n\n // To get the current index centered we adjust scroll amount by width of indexes\n // 0 through (i - 1) and add half the width of current index i\n return (\n total +\n (navigationState.index === i\n ? (tabWidth + (gap ?? 0)) / 2\n : tabWidth + (gap ?? 0))\n );\n }, 0);\n\n const scrollAmount = centerDistance - layout.width / 2;\n\n return normalizeScrollValue({\n layout,\n navigationState,\n tabWidths,\n value: scrollAmount,\n gap,\n scrollEnabled,\n flattenedTabWidth,\n });\n};\n\nconst getLabelTextDefault = ({ route }: Scene<Route>) => route.title;\n\nconst getAccessibleDefault = ({ route }: Scene<Route>) =>\n typeof route.accessible !== 'undefined' ? route.accessible : true;\n\nconst getAccessibilityLabelDefault = ({ route }: Scene<Route>) =>\n typeof route.accessibilityLabel === 'string'\n ? route.accessibilityLabel\n : typeof route.title === 'string'\n ? route.title\n : undefined;\n\nconst renderIndicatorDefault = (props: IndicatorProps<Route>) => (\n <TabBarIndicator {...props} />\n);\n\nconst getTestIdDefault = ({ route }: Scene<Route>) => route.testID;\n\nexport default function TabBar<T extends Route>({\n getLabelText = getLabelTextDefault,\n getAccessible = getAccessibleDefault,\n getAccessibilityLabel = getAccessibilityLabelDefault,\n getTestID = getTestIdDefault,\n renderIndicator = renderIndicatorDefault,\n gap = 0,\n scrollEnabled,\n jumpTo,\n navigationState,\n position,\n activeColor,\n bounces,\n contentContainerStyle,\n inactiveColor,\n indicatorContainerStyle,\n indicatorStyle,\n labelStyle,\n onTabLongPress,\n onTabPress,\n pressColor,\n pressOpacity,\n renderBadge,\n renderIcon,\n renderLabel,\n renderTabBarItem,\n style,\n tabStyle,\n}: Props<T>) {\n const [layout, setLayout] = React.useState<Layout>({ width: 0, height: 0 });\n const [tabWidths, setTabWidths] = React.useState<Record<string, number>>({});\n const flatListRef = React.useRef<FlatList>(null);\n const isFirst = React.useRef(true);\n const scrollAmount = useAnimatedValue(0);\n const measuredTabWidths = React.useRef<Record<string, number>>({});\n\n const { routes } = navigationState;\n const flattenedTabWidth = getFlattenedTabWidth(tabStyle);\n const isWidthDynamic = flattenedTabWidth === 'auto';\n const scrollOffset = getScrollAmount({\n layout,\n navigationState,\n tabWidths,\n gap,\n scrollEnabled,\n flattenedTabWidth,\n });\n\n const hasMeasuredTabWidths =\n Boolean(layout.width) &&\n routes.every((r) => typeof tabWidths[r.key] === 'number');\n\n React.useEffect(() => {\n if (isFirst.current) {\n isFirst.current = false;\n return;\n }\n\n if (isWidthDynamic && !hasMeasuredTabWidths) {\n // When tab width is dynamic, only adjust the scroll once we have all tab widths and layout\n return;\n }\n\n if (scrollEnabled) {\n flatListRef.current?.scrollToOffset({\n offset: scrollOffset,\n animated: true,\n });\n }\n }, [hasMeasuredTabWidths, isWidthDynamic, scrollEnabled, scrollOffset]);\n\n const handleLayout = (e: LayoutChangeEvent) => {\n const { height, width } = e.nativeEvent.layout;\n\n setLayout((layout) =>\n layout.width === width && layout.height === height\n ? layout\n : { width, height }\n );\n };\n\n const tabBarWidth = getTabBarWidth({\n layout,\n navigationState,\n tabWidths,\n gap,\n scrollEnabled,\n flattenedTabWidth,\n });\n\n const separatorsWidth = Math.max(0, routes.length - 1) * gap;\n const separatorPercent = (separatorsWidth / tabBarWidth) * 100;\n const tabBarWidthPercent = `${routes.length * 40}%`;\n\n const translateX = React.useMemo(\n () =>\n getTranslateX(\n scrollAmount,\n getMaxScrollDistance(tabBarWidth, layout.width)\n ),\n [layout.width, scrollAmount, tabBarWidth]\n );\n\n const renderItem = React.useCallback(\n ({ item: route, index }: ListRenderItemInfo<T>) => {\n const props: TabBarItemProps<T> & { key: string } = {\n key: route.key,\n position: position,\n route: route,\n navigationState: navigationState,\n getAccessibilityLabel: getAccessibilityLabel,\n getAccessible: getAccessible,\n getLabelText: getLabelText,\n getTestID: getTestID,\n renderBadge: renderBadge,\n renderIcon: renderIcon,\n renderLabel: renderLabel,\n activeColor: activeColor,\n inactiveColor: inactiveColor,\n pressColor: pressColor,\n pressOpacity: pressOpacity,\n onLayout: isWidthDynamic\n ? (e: LayoutChangeEvent) => {\n measuredTabWidths.current[route.key] = e.nativeEvent.layout.width;\n\n // When we have measured widths for all of the tabs, we should updates the state\n // We avoid doing separate setState for each layout since it triggers multiple renders and slows down app\n if (\n routes.every(\n (r) => typeof measuredTabWidths.current[r.key] === 'number'\n )\n ) {\n setTabWidths({ ...measuredTabWidths.current });\n }\n }\n : undefined,\n onPress: () => {\n const event: Scene<T> & Event = {\n route,\n defaultPrevented: false,\n preventDefault: () => {\n event.defaultPrevented = true;\n },\n };\n\n onTabPress?.(event);\n\n if (event.defaultPrevented) {\n return;\n }\n\n jumpTo(route.key);\n },\n onLongPress: () => onTabLongPress?.({ route }),\n labelStyle: labelStyle,\n style: tabStyle,\n // Calculate the deafult width for tab for FlatList to work\n defaultTabWidth: !isWidthDynamic\n ? getComputedTabWidth(\n index,\n layout,\n routes,\n scrollEnabled,\n tabWidths,\n getFlattenedTabWidth(tabStyle)\n )\n : undefined,\n };\n\n return (\n <>\n {gap > 0 && index > 0 ? <Separator width={gap} /> : null}\n {renderTabBarItem ? (\n renderTabBarItem(props)\n ) : (\n <TabBarItem {...props} />\n )}\n </>\n );\n },\n [\n activeColor,\n gap,\n getAccessibilityLabel,\n getAccessible,\n getLabelText,\n getTestID,\n inactiveColor,\n isWidthDynamic,\n jumpTo,\n labelStyle,\n layout,\n navigationState,\n onTabLongPress,\n onTabPress,\n position,\n pressColor,\n pressOpacity,\n renderBadge,\n renderIcon,\n renderLabel,\n renderTabBarItem,\n routes,\n scrollEnabled,\n tabStyle,\n tabWidths,\n ]\n );\n\n const keyExtractor = React.useCallback((item: T) => item.key, []);\n\n const contentContainerStyleMemoized = React.useMemo(\n () => [\n styles.tabContent,\n scrollEnabled\n ? {\n width:\n tabBarWidth > separatorsWidth ? tabBarWidth : tabBarWidthPercent,\n }\n : styles.container,\n contentContainerStyle,\n ],\n [\n contentContainerStyle,\n scrollEnabled,\n separatorsWidth,\n tabBarWidth,\n tabBarWidthPercent,\n ]\n );\n\n const handleScroll = React.useMemo(\n () =>\n Animated.event(\n [\n {\n nativeEvent: {\n contentOffset: { x: scrollAmount },\n },\n },\n ],\n { useNativeDriver: true }\n ),\n [scrollAmount]\n );\n\n return (\n <Animated.View onLayout={handleLayout} style={[styles.tabBar, style]}>\n <Animated.View\n pointerEvents=\"none\"\n style={[\n styles.indicatorContainer,\n scrollEnabled ? { transform: [{ translateX }] as any } : null,\n tabBarWidth > separatorsWidth\n ? { width: tabBarWidth - separatorsWidth }\n : scrollEnabled\n ? { width: tabBarWidthPercent }\n : null,\n indicatorContainerStyle,\n ]}\n >\n {renderIndicator({\n position,\n layout,\n navigationState,\n jumpTo,\n width: isWidthDynamic\n ? 'auto'\n : `${(100 - separatorPercent) / routes.length}%`,\n style: indicatorStyle,\n getTabWidth: (i: number) =>\n getComputedTabWidth(\n i,\n layout,\n routes,\n scrollEnabled,\n tabWidths,\n flattenedTabWidth\n ),\n gap,\n })}\n </Animated.View>\n <View style={styles.scroll}>\n <Animated.FlatList\n data={routes as Animated.WithAnimatedValue<T>[]}\n keyExtractor={keyExtractor}\n horizontal\n accessibilityRole=\"tablist\"\n keyboardShouldPersistTaps=\"handled\"\n scrollEnabled={scrollEnabled}\n bounces={bounces}\n alwaysBounceHorizontal={false}\n scrollsToTop={false}\n showsHorizontalScrollIndicator={false}\n showsVerticalScrollIndicator={false}\n automaticallyAdjustContentInsets={false}\n overScrollMode=\"never\"\n contentContainerStyle={contentContainerStyleMemoized}\n scrollEventThrottle={16}\n renderItem={renderItem}\n onScroll={handleScroll}\n ref={flatListRef}\n />\n </View>\n </Animated.View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n scroll: {\n overflow: Platform.select({ default: 'scroll', web: undefined }),\n },\n tabBar: {\n backgroundColor: '#2196f3',\n elevation: 4,\n shadowColor: 'black',\n shadowOpacity: 0.1,\n shadowRadius: StyleSheet.hairlineWidth,\n shadowOffset: {\n height: StyleSheet.hairlineWidth,\n width: 0,\n },\n zIndex: 1,\n },\n tabContent: {\n flexDirection: 'row',\n flexWrap: 'nowrap',\n },\n indicatorContainer: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"names":["Separator","width","getFlattenedTabWidth","style","tabStyle","StyleSheet","flatten","getComputedTabWidth","index","layout","routes","scrollEnabled","tabWidths","flattenedWidth","key","endsWith","parseFloat","Number","isFinite","length","getMaxScrollDistance","tabBarWidth","layoutWidth","getTranslateX","scrollAmount","maxScrollDistance","Animated","multiply","Platform","OS","I18nManager","isRTL","add","getTabBarWidth","navigationState","gap","flattenedTabWidth","reduce","acc","_","i","normalizeScrollValue","value","maxDistance","scrollValue","Math","max","min","getScrollAmount","centerDistance","Array","from","total","tabWidth","getLabelTextDefault","route","title","getAccessibleDefault","accessible","getAccessibilityLabelDefault","accessibilityLabel","undefined","renderIndicatorDefault","props","getTestIdDefault","testID","MEASURE_PER_BATCH","TabBar","getLabelText","getAccessible","getAccessibilityLabel","getTestID","renderIndicator","jumpTo","position","activeColor","bounces","contentContainerStyle","inactiveColor","indicatorContainerStyle","indicatorStyle","labelStyle","onTabLongPress","onTabPress","pressColor","pressOpacity","renderBadge","renderIcon","renderLabel","renderTabBarItem","setLayout","React","useState","height","setTabWidths","flatListRef","useRef","isFirst","useAnimatedValue","measuredTabWidths","isWidthDynamic","scrollOffset","hasMeasuredTabWidths","Boolean","slice","every","r","useEffect","current","scrollToOffset","offset","animated","handleLayout","e","nativeEvent","separatorsWidth","separatorPercent","tabBarWidthPercent","translateX","useMemo","renderItem","useCallback","item","onLayout","onPress","event","defaultPrevented","preventDefault","onLongPress","defaultTabWidth","keyExtractor","contentContainerStyleMemoized","styles","tabContent","container","handleScroll","contentOffset","x","useNativeDriver","handleViewableItemsChanged","useLatestCallback","changed","isViewable","tabBar","indicatorContainer","transform","getTabWidth","scroll","create","flex","overflow","select","default","web","backgroundColor","elevation","shadowColor","shadowOpacity","shadowRadius","hairlineWidth","shadowOffset","zIndex","flexDirection","flexWrap","top","left","right","bottom"],"sources":["TabBar.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n Animated,\n FlatList,\n I18nManager,\n LayoutChangeEvent,\n ListRenderItemInfo,\n Platform,\n StyleProp,\n StyleSheet,\n TextStyle,\n View,\n ViewStyle,\n ViewToken,\n} from 'react-native';\nimport useLatestCallback from 'use-latest-callback';\n\nimport TabBarIndicator, { Props as IndicatorProps } from './TabBarIndicator';\nimport TabBarItem, { Props as TabBarItemProps } from './TabBarItem';\nimport type {\n Event,\n Layout,\n NavigationState,\n Route,\n Scene,\n SceneRendererProps,\n} from './types';\nimport useAnimatedValue from './useAnimatedValue';\n\nexport type Props<T extends Route> = SceneRendererProps & {\n navigationState: NavigationState<T>;\n scrollEnabled?: boolean;\n bounces?: boolean;\n activeColor?: string;\n inactiveColor?: string;\n pressColor?: string;\n pressOpacity?: number;\n getLabelText?: (scene: Scene<T>) => string | undefined;\n getAccessible?: (scene: Scene<T>) => boolean | undefined;\n getAccessibilityLabel?: (scene: Scene<T>) => string | undefined;\n getTestID?: (scene: Scene<T>) => string | undefined;\n renderLabel?: (\n scene: Scene<T> & {\n focused: boolean;\n color: string;\n }\n ) => React.ReactNode;\n renderIcon?: (\n scene: Scene<T> & {\n focused: boolean;\n color: string;\n }\n ) => React.ReactNode;\n renderBadge?: (scene: Scene<T>) => React.ReactNode;\n renderIndicator?: (props: IndicatorProps<T>) => React.ReactNode;\n renderTabBarItem?: (\n props: TabBarItemProps<T> & { key: string }\n ) => React.ReactElement;\n onTabPress?: (scene: Scene<T> & Event) => void;\n onTabLongPress?: (scene: Scene<T>) => void;\n tabStyle?: StyleProp<ViewStyle>;\n indicatorStyle?: StyleProp<ViewStyle>;\n indicatorContainerStyle?: StyleProp<ViewStyle>;\n labelStyle?: StyleProp<TextStyle>;\n contentContainerStyle?: StyleProp<ViewStyle>;\n style?: StyleProp<ViewStyle>;\n gap?: number;\n testID?: string;\n};\n\ntype FlattenedTabWidth = string | number | undefined;\n\nconst Separator = ({ width }: { width: number }) => {\n return <View style={{ width }} />;\n};\n\nconst getFlattenedTabWidth = (style: StyleProp<ViewStyle>) => {\n const tabStyle = StyleSheet.flatten(style);\n\n return tabStyle?.width;\n};\n\nconst getComputedTabWidth = (\n index: number,\n layout: Layout,\n routes: Route[],\n scrollEnabled: boolean | undefined,\n tabWidths: { [key: string]: number },\n flattenedWidth: FlattenedTabWidth\n) => {\n if (flattenedWidth === 'auto') {\n return tabWidths[routes[index].key] || 0;\n }\n\n switch (typeof flattenedWidth) {\n case 'number':\n return flattenedWidth;\n case 'string':\n if (flattenedWidth.endsWith('%')) {\n const width = parseFloat(flattenedWidth);\n if (Number.isFinite(width)) {\n return layout.width * (width / 100);\n }\n }\n }\n\n if (scrollEnabled) {\n return (layout.width / 5) * 2;\n }\n return layout.width / routes.length;\n};\n\nconst getMaxScrollDistance = (tabBarWidth: number, layoutWidth: number) =>\n tabBarWidth - layoutWidth;\n\nconst getTranslateX = (\n scrollAmount: Animated.Value,\n maxScrollDistance: number\n) =>\n Animated.multiply(\n Platform.OS === 'android' && I18nManager.isRTL\n ? Animated.add(maxScrollDistance, Animated.multiply(scrollAmount, -1))\n : scrollAmount,\n I18nManager.isRTL ? 1 : -1\n );\n\nconst getTabBarWidth = <T extends Route>({\n navigationState,\n layout,\n gap,\n scrollEnabled,\n flattenedTabWidth,\n tabWidths,\n}: Pick<Props<T>, 'navigationState' | 'gap' | 'layout' | 'scrollEnabled'> & {\n tabWidths: Record<string, number>;\n flattenedTabWidth: FlattenedTabWidth;\n}) => {\n const { routes } = navigationState;\n\n return routes.reduce<number>(\n (acc, _, i) =>\n acc +\n (i > 0 ? gap ?? 0 : 0) +\n getComputedTabWidth(\n i,\n layout,\n routes,\n scrollEnabled,\n tabWidths,\n flattenedTabWidth\n ),\n 0\n );\n};\n\nconst normalizeScrollValue = <T extends Route>({\n layout,\n navigationState,\n gap,\n scrollEnabled,\n tabWidths,\n value,\n flattenedTabWidth,\n}: Pick<Props<T>, 'layout' | 'navigationState' | 'gap' | 'scrollEnabled'> & {\n tabWidths: Record<string, number>;\n value: number;\n flattenedTabWidth: FlattenedTabWidth;\n}) => {\n const tabBarWidth = getTabBarWidth({\n layout,\n navigationState,\n tabWidths,\n gap,\n scrollEnabled,\n flattenedTabWidth,\n });\n const maxDistance = getMaxScrollDistance(tabBarWidth, layout.width);\n const scrollValue = Math.max(Math.min(value, maxDistance), 0);\n\n if (Platform.OS === 'android' && I18nManager.isRTL) {\n // On Android, scroll value is not applied in reverse in RTL\n // so we need to manually adjust it to apply correct value\n return maxDistance - scrollValue;\n }\n\n return scrollValue;\n};\n\nconst getScrollAmount = <T extends Route>({\n layout,\n navigationState,\n gap,\n scrollEnabled,\n flattenedTabWidth,\n tabWidths,\n}: Pick<Props<T>, 'layout' | 'navigationState' | 'scrollEnabled' | 'gap'> & {\n tabWidths: Record<string, number>;\n flattenedTabWidth: FlattenedTabWidth;\n}) => {\n const centerDistance = Array.from({\n length: navigationState.index + 1,\n }).reduce<number>((total, _, i) => {\n const tabWidth = getComputedTabWidth(\n i,\n layout,\n navigationState.routes,\n scrollEnabled,\n tabWidths,\n flattenedTabWidth\n );\n\n // To get the current index centered we adjust scroll amount by width of indexes\n // 0 through (i - 1) and add half the width of current index i\n return (\n total +\n (navigationState.index === i\n ? (tabWidth + (gap ?? 0)) / 2\n : tabWidth + (gap ?? 0))\n );\n }, 0);\n\n const scrollAmount = centerDistance - layout.width / 2;\n\n return normalizeScrollValue({\n layout,\n navigationState,\n tabWidths,\n value: scrollAmount,\n gap,\n scrollEnabled,\n flattenedTabWidth,\n });\n};\n\nconst getLabelTextDefault = ({ route }: Scene<Route>) => route.title;\n\nconst getAccessibleDefault = ({ route }: Scene<Route>) =>\n typeof route.accessible !== 'undefined' ? route.accessible : true;\n\nconst getAccessibilityLabelDefault = ({ route }: Scene<Route>) =>\n typeof route.accessibilityLabel === 'string'\n ? route.accessibilityLabel\n : typeof route.title === 'string'\n ? route.title\n : undefined;\n\nconst renderIndicatorDefault = (props: IndicatorProps<Route>) => (\n <TabBarIndicator {...props} />\n);\n\nconst getTestIdDefault = ({ route }: Scene<Route>) => route.testID;\n\n// How many items measurements should we update per batch.\n// Defaults to 10, since that's whats FlatList is using in initialNumToRender.\nconst MEASURE_PER_BATCH = 10;\n\nexport default function TabBar<T extends Route>({\n getLabelText = getLabelTextDefault,\n getAccessible = getAccessibleDefault,\n getAccessibilityLabel = getAccessibilityLabelDefault,\n getTestID = getTestIdDefault,\n renderIndicator = renderIndicatorDefault,\n gap = 0,\n scrollEnabled,\n jumpTo,\n navigationState,\n position,\n activeColor,\n bounces,\n contentContainerStyle,\n inactiveColor,\n indicatorContainerStyle,\n indicatorStyle,\n labelStyle,\n onTabLongPress,\n onTabPress,\n pressColor,\n pressOpacity,\n renderBadge,\n renderIcon,\n renderLabel,\n renderTabBarItem,\n style,\n tabStyle,\n testID,\n}: Props<T>) {\n const [layout, setLayout] = React.useState<Layout>({ width: 0, height: 0 });\n const [tabWidths, setTabWidths] = React.useState<Record<string, number>>({});\n const flatListRef = React.useRef<FlatList | null>(null);\n const isFirst = React.useRef(true);\n const scrollAmount = useAnimatedValue(0);\n const measuredTabWidths = React.useRef<Record<string, number>>({});\n\n const { routes } = navigationState;\n const flattenedTabWidth = getFlattenedTabWidth(tabStyle);\n const isWidthDynamic = flattenedTabWidth === 'auto';\n const scrollOffset = getScrollAmount({\n layout,\n navigationState,\n tabWidths,\n gap,\n scrollEnabled,\n flattenedTabWidth,\n });\n\n const hasMeasuredTabWidths =\n Boolean(layout.width) &&\n routes\n .slice(0, navigationState.index)\n .every((r) => typeof tabWidths[r.key] === 'number');\n\n React.useEffect(() => {\n if (isFirst.current) {\n isFirst.current = false;\n return;\n }\n\n if (isWidthDynamic && !hasMeasuredTabWidths) {\n return;\n }\n\n if (scrollEnabled) {\n flatListRef.current?.scrollToOffset({\n offset: scrollOffset,\n animated: true,\n });\n }\n }, [hasMeasuredTabWidths, isWidthDynamic, scrollEnabled, scrollOffset]);\n\n const handleLayout = (e: LayoutChangeEvent) => {\n const { height, width } = e.nativeEvent.layout;\n\n setLayout((layout) =>\n layout.width === width && layout.height === height\n ? layout\n : { width, height }\n );\n };\n\n const tabBarWidth = getTabBarWidth({\n layout,\n navigationState,\n tabWidths,\n gap,\n scrollEnabled,\n flattenedTabWidth,\n });\n\n const separatorsWidth = Math.max(0, routes.length - 1) * gap;\n const separatorPercent = (separatorsWidth / tabBarWidth) * 100;\n const tabBarWidthPercent = `${routes.length * 40}%`;\n\n const translateX = React.useMemo(\n () =>\n getTranslateX(\n scrollAmount,\n getMaxScrollDistance(tabBarWidth, layout.width)\n ),\n [layout.width, scrollAmount, tabBarWidth]\n );\n\n const renderItem = React.useCallback(\n ({ item: route, index }: ListRenderItemInfo<T>) => {\n const props: TabBarItemProps<T> & { key: string } = {\n key: route.key,\n position: position,\n route: route,\n navigationState: navigationState,\n getAccessibilityLabel: getAccessibilityLabel,\n getAccessible: getAccessible,\n getLabelText: getLabelText,\n getTestID: getTestID,\n renderBadge: renderBadge,\n renderIcon: renderIcon,\n renderLabel: renderLabel,\n activeColor: activeColor,\n inactiveColor: inactiveColor,\n pressColor: pressColor,\n pressOpacity: pressOpacity,\n onLayout: isWidthDynamic\n ? (e: LayoutChangeEvent) => {\n measuredTabWidths.current[route.key] = e.nativeEvent.layout.width;\n\n // When we have measured widths for all of the tabs, we should updates the state\n // We avoid doing separate setState for each layout since it triggers multiple renders and slows down app\n // If we have more than 10 routes divide updating tabWidths into multiple batches. Here we update only first batch of 10 items.\n if (\n routes.length > MEASURE_PER_BATCH &&\n index === MEASURE_PER_BATCH &&\n routes\n .slice(0, MEASURE_PER_BATCH)\n .every(\n (r) => typeof measuredTabWidths.current[r.key] === 'number'\n )\n ) {\n setTabWidths({ ...measuredTabWidths.current });\n } else if (\n routes.every(\n (r) => typeof measuredTabWidths.current[r.key] === 'number'\n )\n ) {\n // When we have measured widths for all of the tabs, we should updates the state\n // We avoid doing separate setState for each layout since it triggers multiple renders and slows down app\n setTabWidths({ ...measuredTabWidths.current });\n }\n }\n : undefined,\n onPress: () => {\n const event: Scene<T> & Event = {\n route,\n defaultPrevented: false,\n preventDefault: () => {\n event.defaultPrevented = true;\n },\n };\n\n onTabPress?.(event);\n\n if (event.defaultPrevented) {\n return;\n }\n\n jumpTo(route.key);\n },\n onLongPress: () => onTabLongPress?.({ route }),\n labelStyle: labelStyle,\n style: tabStyle,\n // Calculate the deafult width for tab for FlatList to work\n defaultTabWidth: !isWidthDynamic\n ? getComputedTabWidth(\n index,\n layout,\n routes,\n scrollEnabled,\n tabWidths,\n getFlattenedTabWidth(tabStyle)\n )\n : undefined,\n };\n\n return (\n <>\n {gap > 0 && index > 0 ? <Separator width={gap} /> : null}\n {renderTabBarItem ? (\n renderTabBarItem(props)\n ) : (\n <TabBarItem {...props} />\n )}\n </>\n );\n },\n [\n activeColor,\n gap,\n getAccessibilityLabel,\n getAccessible,\n getLabelText,\n getTestID,\n inactiveColor,\n isWidthDynamic,\n jumpTo,\n labelStyle,\n layout,\n navigationState,\n onTabLongPress,\n onTabPress,\n position,\n pressColor,\n pressOpacity,\n renderBadge,\n renderIcon,\n renderLabel,\n renderTabBarItem,\n routes,\n scrollEnabled,\n tabStyle,\n tabWidths,\n ]\n );\n\n const keyExtractor = React.useCallback((item: T) => item.key, []);\n\n const contentContainerStyleMemoized = React.useMemo(\n () => [\n styles.tabContent,\n scrollEnabled\n ? {\n width:\n tabBarWidth > separatorsWidth ? tabBarWidth : tabBarWidthPercent,\n }\n : styles.container,\n contentContainerStyle,\n ],\n [\n contentContainerStyle,\n scrollEnabled,\n separatorsWidth,\n tabBarWidth,\n tabBarWidthPercent,\n ]\n );\n\n const handleScroll = React.useMemo(\n () =>\n Animated.event(\n [\n {\n nativeEvent: {\n contentOffset: { x: scrollAmount },\n },\n },\n ],\n { useNativeDriver: true }\n ),\n [scrollAmount]\n );\n\n const handleViewableItemsChanged = useLatestCallback(\n ({ changed }: { changed: ViewToken[] }) => {\n if (routes.length <= MEASURE_PER_BATCH) {\n return;\n }\n // Get next vievable item\n const item = changed[changed.length - 1];\n const index = item?.index || 0;\n if (\n item.isViewable &&\n (index % 10 === 0 ||\n index === navigationState.index ||\n index === routes.length - 1)\n ) {\n setTabWidths({ ...measuredTabWidths.current });\n }\n }\n );\n\n return (\n <Animated.View onLayout={handleLayout} style={[styles.tabBar, style]}>\n <Animated.View\n pointerEvents=\"none\"\n style={[\n styles.indicatorContainer,\n scrollEnabled ? { transform: [{ translateX }] as any } : null,\n tabBarWidth > separatorsWidth\n ? { width: tabBarWidth - separatorsWidth }\n : scrollEnabled\n ? { width: tabBarWidthPercent }\n : null,\n indicatorContainerStyle,\n ]}\n >\n {renderIndicator({\n position,\n layout,\n navigationState,\n jumpTo,\n width: isWidthDynamic\n ? 'auto'\n : `${(100 - separatorPercent) / routes.length}%`,\n style: indicatorStyle,\n getTabWidth: (i: number) =>\n getComputedTabWidth(\n i,\n layout,\n routes,\n scrollEnabled,\n tabWidths,\n flattenedTabWidth\n ),\n gap,\n })}\n </Animated.View>\n <View style={styles.scroll}>\n <Animated.FlatList\n data={routes as Animated.WithAnimatedValue<T>[]}\n keyExtractor={keyExtractor}\n horizontal\n accessibilityRole=\"tablist\"\n keyboardShouldPersistTaps=\"handled\"\n scrollEnabled={scrollEnabled}\n bounces={bounces}\n initialNumToRender={MEASURE_PER_BATCH}\n onViewableItemsChanged={handleViewableItemsChanged}\n alwaysBounceHorizontal={false}\n scrollsToTop={false}\n showsHorizontalScrollIndicator={false}\n showsVerticalScrollIndicator={false}\n automaticallyAdjustContentInsets={false}\n overScrollMode=\"never\"\n contentContainerStyle={contentContainerStyleMemoized}\n scrollEventThrottle={16}\n renderItem={renderItem}\n onScroll={handleScroll}\n ref={flatListRef}\n testID={testID}\n />\n </View>\n </Animated.View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n scroll: {\n overflow: Platform.select({ default: 'scroll', web: undefined }),\n },\n tabBar: {\n backgroundColor: '#2196f3',\n elevation: 4,\n shadowColor: 'black',\n shadowOpacity: 0.1,\n shadowRadius: StyleSheet.hairlineWidth,\n shadowOffset: {\n height: StyleSheet.hairlineWidth,\n width: 0,\n },\n zIndex: 1,\n },\n tabContent: {\n flexDirection: 'row',\n flexWrap: 'nowrap',\n },\n indicatorContainer: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n },\n});\n"],"mappings":";;;;;;;AAAA;;AACA;;AAcA;;AAEA;;AACA;;AASA;;;;;;;;AA6CA,MAAMA,SAAS,GAAG,QAAkC;EAAA,IAAjC;IAAEC;EAAF,CAAiC;EAClD,oBAAO,oBAAC,iBAAD;IAAM,KAAK,EAAE;MAAEA;IAAF;EAAb,EAAP;AACD,CAFD;;AAIA,MAAMC,oBAAoB,GAAIC,KAAD,IAAiC;EAC5D,MAAMC,QAAQ,GAAGC,uBAAA,CAAWC,OAAX,CAAmBH,KAAnB,CAAjB;;EAEA,OAAOC,QAAP,aAAOA,QAAP,uBAAOA,QAAQ,CAAEH,KAAjB;AACD,CAJD;;AAMA,MAAMM,mBAAmB,GAAG,CAC1BC,KAD0B,EAE1BC,MAF0B,EAG1BC,MAH0B,EAI1BC,aAJ0B,EAK1BC,SAL0B,EAM1BC,cAN0B,KAOvB;EACH,IAAIA,cAAc,KAAK,MAAvB,EAA+B;IAC7B,OAAOD,SAAS,CAACF,MAAM,CAACF,KAAD,CAAN,CAAcM,GAAf,CAAT,IAAgC,CAAvC;EACD;;EAED,QAAQ,OAAOD,cAAf;IACE,KAAK,QAAL;MACE,OAAOA,cAAP;;IACF,KAAK,QAAL;MACE,IAAIA,cAAc,CAACE,QAAf,CAAwB,GAAxB,CAAJ,EAAkC;QAChC,MAAMd,KAAK,GAAGe,UAAU,CAACH,cAAD,CAAxB;;QACA,IAAII,MAAM,CAACC,QAAP,CAAgBjB,KAAhB,CAAJ,EAA4B;UAC1B,OAAOQ,MAAM,CAACR,KAAP,IAAgBA,KAAK,GAAG,GAAxB,CAAP;QACD;MACF;;EATL;;EAYA,IAAIU,aAAJ,EAAmB;IACjB,OAAQF,MAAM,CAACR,KAAP,GAAe,CAAhB,GAAqB,CAA5B;EACD;;EACD,OAAOQ,MAAM,CAACR,KAAP,GAAeS,MAAM,CAACS,MAA7B;AACD,CA5BD;;AA8BA,MAAMC,oBAAoB,GAAG,CAACC,WAAD,EAAsBC,WAAtB,KAC3BD,WAAW,GAAGC,WADhB;;AAGA,MAAMC,aAAa,GAAG,CACpBC,YADoB,EAEpBC,iBAFoB,KAIpBC,qBAAA,CAASC,QAAT,CACEC,qBAAA,CAASC,EAAT,KAAgB,SAAhB,IAA6BC,wBAAA,CAAYC,KAAzC,GACIL,qBAAA,CAASM,GAAT,CAAaP,iBAAb,EAAgCC,qBAAA,CAASC,QAAT,CAAkBH,YAAlB,EAAgC,CAAC,CAAjC,CAAhC,CADJ,GAEIA,YAHN,EAIEM,wBAAA,CAAYC,KAAZ,GAAoB,CAApB,GAAwB,CAAC,CAJ3B,CAJF;;AAWA,MAAME,cAAc,GAAG,SAUjB;EAAA,IAVmC;IACvCC,eADuC;IAEvCzB,MAFuC;IAGvC0B,GAHuC;IAIvCxB,aAJuC;IAKvCyB,iBALuC;IAMvCxB;EANuC,CAUnC;EACJ,MAAM;IAAEF;EAAF,IAAawB,eAAnB;EAEA,OAAOxB,MAAM,CAAC2B,MAAP,CACL,CAACC,GAAD,EAAMC,CAAN,EAASC,CAAT,KACEF,GAAG,IACFE,CAAC,GAAG,CAAJ,GAAQL,GAAR,aAAQA,GAAR,cAAQA,GAAR,GAAe,CAAf,GAAmB,CADjB,CAAH,GAEA5B,mBAAmB,CACjBiC,CADiB,EAEjB/B,MAFiB,EAGjBC,MAHiB,EAIjBC,aAJiB,EAKjBC,SALiB,EAMjBwB,iBANiB,CAJhB,EAYL,CAZK,CAAP;AAcD,CA3BD;;AA6BA,MAAMK,oBAAoB,GAAG,SAYvB;EAAA,IAZyC;IAC7ChC,MAD6C;IAE7CyB,eAF6C;IAG7CC,GAH6C;IAI7CxB,aAJ6C;IAK7CC,SAL6C;IAM7C8B,KAN6C;IAO7CN;EAP6C,CAYzC;EACJ,MAAMf,WAAW,GAAGY,cAAc,CAAC;IACjCxB,MADiC;IAEjCyB,eAFiC;IAGjCtB,SAHiC;IAIjCuB,GAJiC;IAKjCxB,aALiC;IAMjCyB;EANiC,CAAD,CAAlC;EAQA,MAAMO,WAAW,GAAGvB,oBAAoB,CAACC,WAAD,EAAcZ,MAAM,CAACR,KAArB,CAAxC;EACA,MAAM2C,WAAW,GAAGC,IAAI,CAACC,GAAL,CAASD,IAAI,CAACE,GAAL,CAASL,KAAT,EAAgBC,WAAhB,CAAT,EAAuC,CAAvC,CAApB;;EAEA,IAAIf,qBAAA,CAASC,EAAT,KAAgB,SAAhB,IAA6BC,wBAAA,CAAYC,KAA7C,EAAoD;IAClD;IACA;IACA,OAAOY,WAAW,GAAGC,WAArB;EACD;;EAED,OAAOA,WAAP;AACD,CA/BD;;AAiCA,MAAMI,eAAe,GAAG,SAUlB;EAAA,IAVoC;IACxCvC,MADwC;IAExCyB,eAFwC;IAGxCC,GAHwC;IAIxCxB,aAJwC;IAKxCyB,iBALwC;IAMxCxB;EANwC,CAUpC;EACJ,MAAMqC,cAAc,GAAGC,KAAK,CAACC,IAAN,CAAW;IAChChC,MAAM,EAAEe,eAAe,CAAC1B,KAAhB,GAAwB;EADA,CAAX,EAEpB6B,MAFoB,CAEL,CAACe,KAAD,EAAQb,CAAR,EAAWC,CAAX,KAAiB;IACjC,MAAMa,QAAQ,GAAG9C,mBAAmB,CAClCiC,CADkC,EAElC/B,MAFkC,EAGlCyB,eAAe,CAACxB,MAHkB,EAIlCC,aAJkC,EAKlCC,SALkC,EAMlCwB,iBANkC,CAApC,CADiC,CAUjC;IACA;;IACA,OACEgB,KAAK,IACJlB,eAAe,CAAC1B,KAAhB,KAA0BgC,CAA1B,GACG,CAACa,QAAQ,IAAIlB,GAAJ,aAAIA,GAAJ,cAAIA,GAAJ,GAAW,CAAX,CAAT,IAA0B,CAD7B,GAEGkB,QAAQ,IAAIlB,GAAJ,aAAIA,GAAJ,cAAIA,GAAJ,GAAW,CAAX,CAHP,CADP;EAMD,CApBsB,EAoBpB,CApBoB,CAAvB;EAsBA,MAAMX,YAAY,GAAGyB,cAAc,GAAGxC,MAAM,CAACR,KAAP,GAAe,CAArD;EAEA,OAAOwC,oBAAoB,CAAC;IAC1BhC,MAD0B;IAE1ByB,eAF0B;IAG1BtB,SAH0B;IAI1B8B,KAAK,EAAElB,YAJmB;IAK1BW,GAL0B;IAM1BxB,aAN0B;IAO1ByB;EAP0B,CAAD,CAA3B;AASD,CA5CD;;AA8CA,MAAMkB,mBAAmB,GAAG;EAAA,IAAC;IAAEC;EAAF,CAAD;EAAA,OAA6BA,KAAK,CAACC,KAAnC;AAAA,CAA5B;;AAEA,MAAMC,oBAAoB,GAAG;EAAA,IAAC;IAAEF;EAAF,CAAD;EAAA,OAC3B,OAAOA,KAAK,CAACG,UAAb,KAA4B,WAA5B,GAA0CH,KAAK,CAACG,UAAhD,GAA6D,IADlC;AAAA,CAA7B;;AAGA,MAAMC,4BAA4B,GAAG;EAAA,IAAC;IAAEJ;EAAF,CAAD;EAAA,OACnC,OAAOA,KAAK,CAACK,kBAAb,KAAoC,QAApC,GACIL,KAAK,CAACK,kBADV,GAEI,OAAOL,KAAK,CAACC,KAAb,KAAuB,QAAvB,GACAD,KAAK,CAACC,KADN,GAEAK,SAL+B;AAAA,CAArC;;AAOA,MAAMC,sBAAsB,GAAIC,KAAD,iBAC7B,oBAAC,wBAAD,EAAqBA,KAArB,CADF;;AAIA,MAAMC,gBAAgB,GAAG;EAAA,IAAC;IAAET;EAAF,CAAD;EAAA,OAA6BA,KAAK,CAACU,MAAnC;AAAA,CAAzB,C,CAEA;AACA;;;AACA,MAAMC,iBAAiB,GAAG,EAA1B;;AAEe,SAASC,MAAT,QA6BF;EAAA,IA7BmC;IAC9CC,YAAY,GAAGd,mBAD+B;IAE9Ce,aAAa,GAAGZ,oBAF8B;IAG9Ca,qBAAqB,GAAGX,4BAHsB;IAI9CY,SAAS,GAAGP,gBAJkC;IAK9CQ,eAAe,GAAGV,sBAL4B;IAM9C3B,GAAG,GAAG,CANwC;IAO9CxB,aAP8C;IAQ9C8D,MAR8C;IAS9CvC,eAT8C;IAU9CwC,QAV8C;IAW9CC,WAX8C;IAY9CC,OAZ8C;IAa9CC,qBAb8C;IAc9CC,aAd8C;IAe9CC,uBAf8C;IAgB9CC,cAhB8C;IAiB9CC,UAjB8C;IAkB9CC,cAlB8C;IAmB9CC,UAnB8C;IAoB9CC,UApB8C;IAqB9CC,YArB8C;IAsB9CC,WAtB8C;IAuB9CC,UAvB8C;IAwB9CC,WAxB8C;IAyB9CC,gBAzB8C;IA0B9CtF,KA1B8C;IA2B9CC,QA3B8C;IA4B9C6D;EA5B8C,CA6BnC;EACX,MAAM,CAACxD,MAAD,EAASiF,SAAT,IAAsBC,KAAK,CAACC,QAAN,CAAuB;IAAE3F,KAAK,EAAE,CAAT;IAAY4F,MAAM,EAAE;EAApB,CAAvB,CAA5B;EACA,MAAM,CAACjF,SAAD,EAAYkF,YAAZ,IAA4BH,KAAK,CAACC,QAAN,CAAuC,EAAvC,CAAlC;EACA,MAAMG,WAAW,GAAGJ,KAAK,CAACK,MAAN,CAA8B,IAA9B,CAApB;EACA,MAAMC,OAAO,GAAGN,KAAK,CAACK,MAAN,CAAa,IAAb,CAAhB;EACA,MAAMxE,YAAY,GAAG,IAAA0E,yBAAA,EAAiB,CAAjB,CAArB;EACA,MAAMC,iBAAiB,GAAGR,KAAK,CAACK,MAAN,CAAqC,EAArC,CAA1B;EAEA,MAAM;IAAEtF;EAAF,IAAawB,eAAnB;EACA,MAAME,iBAAiB,GAAGlC,oBAAoB,CAACE,QAAD,CAA9C;EACA,MAAMgG,cAAc,GAAGhE,iBAAiB,KAAK,MAA7C;EACA,MAAMiE,YAAY,GAAGrD,eAAe,CAAC;IACnCvC,MADmC;IAEnCyB,eAFmC;IAGnCtB,SAHmC;IAInCuB,GAJmC;IAKnCxB,aALmC;IAMnCyB;EANmC,CAAD,CAApC;EASA,MAAMkE,oBAAoB,GACxBC,OAAO,CAAC9F,MAAM,CAACR,KAAR,CAAP,IACAS,MAAM,CACH8F,KADH,CACS,CADT,EACYtE,eAAe,CAAC1B,KAD5B,EAEGiG,KAFH,CAEUC,CAAD,IAAO,OAAO9F,SAAS,CAAC8F,CAAC,CAAC5F,GAAH,CAAhB,KAA4B,QAF5C,CAFF;EAMA6E,KAAK,CAACgB,SAAN,CAAgB,MAAM;IACpB,IAAIV,OAAO,CAACW,OAAZ,EAAqB;MACnBX,OAAO,CAACW,OAAR,GAAkB,KAAlB;MACA;IACD;;IAED,IAAIR,cAAc,IAAI,CAACE,oBAAvB,EAA6C;MAC3C;IACD;;IAED,IAAI3F,aAAJ,EAAmB;MAAA;;MACjB,wBAAAoF,WAAW,CAACa,OAAZ,8EAAqBC,cAArB,CAAoC;QAClCC,MAAM,EAAET,YAD0B;QAElCU,QAAQ,EAAE;MAFwB,CAApC;IAID;EACF,CAhBD,EAgBG,CAACT,oBAAD,EAAuBF,cAAvB,EAAuCzF,aAAvC,EAAsD0F,YAAtD,CAhBH;;EAkBA,MAAMW,YAAY,GAAIC,CAAD,IAA0B;IAC7C,MAAM;MAAEpB,MAAF;MAAU5F;IAAV,IAAoBgH,CAAC,CAACC,WAAF,CAAczG,MAAxC;IAEAiF,SAAS,CAAEjF,MAAD,IACRA,MAAM,CAACR,KAAP,KAAiBA,KAAjB,IAA0BQ,MAAM,CAACoF,MAAP,KAAkBA,MAA5C,GACIpF,MADJ,GAEI;MAAER,KAAF;MAAS4F;IAAT,CAHG,CAAT;EAKD,CARD;;EAUA,MAAMxE,WAAW,GAAGY,cAAc,CAAC;IACjCxB,MADiC;IAEjCyB,eAFiC;IAGjCtB,SAHiC;IAIjCuB,GAJiC;IAKjCxB,aALiC;IAMjCyB;EANiC,CAAD,CAAlC;EASA,MAAM+E,eAAe,GAAGtE,IAAI,CAACC,GAAL,CAAS,CAAT,EAAYpC,MAAM,CAACS,MAAP,GAAgB,CAA5B,IAAiCgB,GAAzD;EACA,MAAMiF,gBAAgB,GAAID,eAAe,GAAG9F,WAAnB,GAAkC,GAA3D;EACA,MAAMgG,kBAAkB,GAAI,GAAE3G,MAAM,CAACS,MAAP,GAAgB,EAAG,GAAjD;EAEA,MAAMmG,UAAU,GAAG3B,KAAK,CAAC4B,OAAN,CACjB,MACEhG,aAAa,CACXC,YADW,EAEXJ,oBAAoB,CAACC,WAAD,EAAcZ,MAAM,CAACR,KAArB,CAFT,CAFE,EAMjB,CAACQ,MAAM,CAACR,KAAR,EAAeuB,YAAf,EAA6BH,WAA7B,CANiB,CAAnB;EASA,MAAMmG,UAAU,GAAG7B,KAAK,CAAC8B,WAAN,CACjB,UAAmD;IAAA,IAAlD;MAAEC,IAAI,EAAEnE,KAAR;MAAe/C;IAAf,CAAkD;IACjD,MAAMuD,KAA2C,GAAG;MAClDjD,GAAG,EAAEyC,KAAK,CAACzC,GADuC;MAElD4D,QAAQ,EAAEA,QAFwC;MAGlDnB,KAAK,EAAEA,KAH2C;MAIlDrB,eAAe,EAAEA,eAJiC;MAKlDoC,qBAAqB,EAAEA,qBAL2B;MAMlDD,aAAa,EAAEA,aANmC;MAOlDD,YAAY,EAAEA,YAPoC;MAQlDG,SAAS,EAAEA,SARuC;MASlDe,WAAW,EAAEA,WATqC;MAUlDC,UAAU,EAAEA,UAVsC;MAWlDC,WAAW,EAAEA,WAXqC;MAYlDb,WAAW,EAAEA,WAZqC;MAalDG,aAAa,EAAEA,aAbmC;MAclDM,UAAU,EAAEA,UAdsC;MAelDC,YAAY,EAAEA,YAfoC;MAgBlDsC,QAAQ,EAAEvB,cAAc,GACnBa,CAAD,IAA0B;QACxBd,iBAAiB,CAACS,OAAlB,CAA0BrD,KAAK,CAACzC,GAAhC,IAAuCmG,CAAC,CAACC,WAAF,CAAczG,MAAd,CAAqBR,KAA5D,CADwB,CAGxB;QACA;QACA;;QACA,IACES,MAAM,CAACS,MAAP,GAAgB+C,iBAAhB,IACA1D,KAAK,KAAK0D,iBADV,IAEAxD,MAAM,CACH8F,KADH,CACS,CADT,EACYtC,iBADZ,EAEGuC,KAFH,CAGKC,CAAD,IAAO,OAAOP,iBAAiB,CAACS,OAAlB,CAA0BF,CAAC,CAAC5F,GAA5B,CAAP,KAA4C,QAHvD,CAHF,EAQE;UACAgF,YAAY,CAAC,EAAE,GAAGK,iBAAiB,CAACS;UAAvB,CAAD,CAAZ;QACD,CAVD,MAUO,IACLlG,MAAM,CAAC+F,KAAP,CACGC,CAAD,IAAO,OAAOP,iBAAiB,CAACS,OAAlB,CAA0BF,CAAC,CAAC5F,GAA5B,CAAP,KAA4C,QADrD,CADK,EAIL;UACA;UACA;UACAgF,YAAY,CAAC,EAAE,GAAGK,iBAAiB,CAACS;UAAvB,CAAD,CAAZ;QACD;MACF,CA1BmB,GA2BpB/C,SA3C8C;MA4ClD+D,OAAO,EAAE,MAAM;QACb,MAAMC,KAAuB,GAAG;UAC9BtE,KAD8B;UAE9BuE,gBAAgB,EAAE,KAFY;UAG9BC,cAAc,EAAE,MAAM;YACpBF,KAAK,CAACC,gBAAN,GAAyB,IAAzB;UACD;QAL6B,CAAhC;QAQA3C,UAAU,SAAV,IAAAA,UAAU,WAAV,YAAAA,UAAU,CAAG0C,KAAH,CAAV;;QAEA,IAAIA,KAAK,CAACC,gBAAV,EAA4B;UAC1B;QACD;;QAEDrD,MAAM,CAAClB,KAAK,CAACzC,GAAP,CAAN;MACD,CA5DiD;MA6DlDkH,WAAW,EAAE,MAAM9C,cAAN,aAAMA,cAAN,uBAAMA,cAAc,CAAG;QAAE3B;MAAF,CAAH,CA7DiB;MA8DlD0B,UAAU,EAAEA,UA9DsC;MA+DlD9E,KAAK,EAAEC,QA/D2C;MAgElD;MACA6H,eAAe,EAAE,CAAC7B,cAAD,GACb7F,mBAAmB,CACjBC,KADiB,EAEjBC,MAFiB,EAGjBC,MAHiB,EAIjBC,aAJiB,EAKjBC,SALiB,EAMjBV,oBAAoB,CAACE,QAAD,CANH,CADN,GASbyD;IA1E8C,CAApD;IA6EA,oBACE,0CACG1B,GAAG,GAAG,CAAN,IAAW3B,KAAK,GAAG,CAAnB,gBAAuB,oBAAC,SAAD;MAAW,KAAK,EAAE2B;IAAlB,EAAvB,GAAmD,IADtD,EAEGsD,gBAAgB,GACfA,gBAAgB,CAAC1B,KAAD,CADD,gBAGf,oBAAC,mBAAD,EAAgBA,KAAhB,CALJ,CADF;EAUD,CAzFgB,EA0FjB,CACEY,WADF,EAEExC,GAFF,EAGEmC,qBAHF,EAIED,aAJF,EAKED,YALF,EAMEG,SANF,EAOEO,aAPF,EAQEsB,cARF,EASE3B,MATF,EAUEQ,UAVF,EAWExE,MAXF,EAYEyB,eAZF,EAaEgD,cAbF,EAcEC,UAdF,EAeET,QAfF,EAgBEU,UAhBF,EAiBEC,YAjBF,EAkBEC,WAlBF,EAmBEC,UAnBF,EAoBEC,WApBF,EAqBEC,gBArBF,EAsBE/E,MAtBF,EAuBEC,aAvBF,EAwBEP,QAxBF,EAyBEQ,SAzBF,CA1FiB,CAAnB;EAuHA,MAAMsH,YAAY,GAAGvC,KAAK,CAAC8B,WAAN,CAAmBC,IAAD,IAAaA,IAAI,CAAC5G,GAApC,EAAyC,EAAzC,CAArB;EAEA,MAAMqH,6BAA6B,GAAGxC,KAAK,CAAC4B,OAAN,CACpC,MAAM,CACJa,MAAM,CAACC,UADH,EAEJ1H,aAAa,GACT;IACEV,KAAK,EACHoB,WAAW,GAAG8F,eAAd,GAAgC9F,WAAhC,GAA8CgG;EAFlD,CADS,GAKTe,MAAM,CAACE,SAPP,EAQJzD,qBARI,CAD8B,EAWpC,CACEA,qBADF,EAEElE,aAFF,EAGEwG,eAHF,EAIE9F,WAJF,EAKEgG,kBALF,CAXoC,CAAtC;EAoBA,MAAMkB,YAAY,GAAG5C,KAAK,CAAC4B,OAAN,CACnB,MACE7F,qBAAA,CAASmG,KAAT,CACE,CACE;IACEX,WAAW,EAAE;MACXsB,aAAa,EAAE;QAAEC,CAAC,EAAEjH;MAAL;IADJ;EADf,CADF,CADF,EAQE;IAAEkH,eAAe,EAAE;EAAnB,CARF,CAFiB,EAYnB,CAAClH,YAAD,CAZmB,CAArB;EAeA,MAAMmH,0BAA0B,GAAG,IAAAC,0BAAA,EACjC,UAA2C;IAAA,IAA1C;MAAEC;IAAF,CAA0C;;IACzC,IAAInI,MAAM,CAACS,MAAP,IAAiB+C,iBAArB,EAAwC;MACtC;IACD,CAHwC,CAIzC;;;IACA,MAAMwD,IAAI,GAAGmB,OAAO,CAACA,OAAO,CAAC1H,MAAR,GAAiB,CAAlB,CAApB;IACA,MAAMX,KAAK,GAAG,CAAAkH,IAAI,SAAJ,IAAAA,IAAI,WAAJ,YAAAA,IAAI,CAAElH,KAAN,KAAe,CAA7B;;IACA,IACEkH,IAAI,CAACoB,UAAL,KACCtI,KAAK,GAAG,EAAR,KAAe,CAAf,IACCA,KAAK,KAAK0B,eAAe,CAAC1B,KAD3B,IAECA,KAAK,KAAKE,MAAM,CAACS,MAAP,GAAgB,CAH5B,CADF,EAKE;MACA2E,YAAY,CAAC,EAAE,GAAGK,iBAAiB,CAACS;MAAvB,CAAD,CAAZ;IACD;EACF,CAhBgC,CAAnC;EAmBA,oBACE,oBAAC,qBAAD,CAAU,IAAV;IAAe,QAAQ,EAAEI,YAAzB;IAAuC,KAAK,EAAE,CAACoB,MAAM,CAACW,MAAR,EAAgB5I,KAAhB;EAA9C,gBACE,oBAAC,qBAAD,CAAU,IAAV;IACE,aAAa,EAAC,MADhB;IAEE,KAAK,EAAE,CACLiI,MAAM,CAACY,kBADF,EAELrI,aAAa,GAAG;MAAEsI,SAAS,EAAE,CAAC;QAAE3B;MAAF,CAAD;IAAb,CAAH,GAA4C,IAFpD,EAGLjG,WAAW,GAAG8F,eAAd,GACI;MAAElH,KAAK,EAAEoB,WAAW,GAAG8F;IAAvB,CADJ,GAEIxG,aAAa,GACb;MAAEV,KAAK,EAAEoH;IAAT,CADa,GAEb,IAPC,EAQLtC,uBARK;EAFT,GAaGP,eAAe,CAAC;IACfE,QADe;IAEfjE,MAFe;IAGfyB,eAHe;IAIfuC,MAJe;IAKfxE,KAAK,EAAEmG,cAAc,GACjB,MADiB,GAEhB,GAAE,CAAC,MAAMgB,gBAAP,IAA2B1G,MAAM,CAACS,MAAO,GAPjC;IAQfhB,KAAK,EAAE6E,cARQ;IASfkE,WAAW,EAAG1G,CAAD,IACXjC,mBAAmB,CACjBiC,CADiB,EAEjB/B,MAFiB,EAGjBC,MAHiB,EAIjBC,aAJiB,EAKjBC,SALiB,EAMjBwB,iBANiB,CAVN;IAkBfD;EAlBe,CAAD,CAblB,CADF,eAmCE,oBAAC,iBAAD;IAAM,KAAK,EAAEiG,MAAM,CAACe;EAApB,gBACE,oBAAC,qBAAD,CAAU,QAAV;IACE,IAAI,EAAEzI,MADR;IAEE,YAAY,EAAEwH,YAFhB;IAGE,UAAU,MAHZ;IAIE,iBAAiB,EAAC,SAJpB;IAKE,yBAAyB,EAAC,SAL5B;IAME,aAAa,EAAEvH,aANjB;IAOE,OAAO,EAAEiE,OAPX;IAQE,kBAAkB,EAAEV,iBARtB;IASE,sBAAsB,EAAEyE,0BAT1B;IAUE,sBAAsB,EAAE,KAV1B;IAWE,YAAY,EAAE,KAXhB;IAYE,8BAA8B,EAAE,KAZlC;IAaE,4BAA4B,EAAE,KAbhC;IAcE,gCAAgC,EAAE,KAdpC;IAeE,cAAc,EAAC,OAfjB;IAgBE,qBAAqB,EAAER,6BAhBzB;IAiBE,mBAAmB,EAAE,EAjBvB;IAkBE,UAAU,EAAEX,UAlBd;IAmBE,QAAQ,EAAEe,YAnBZ;IAoBE,GAAG,EAAExC,WApBP;IAqBE,MAAM,EAAE9B;EArBV,EADF,CAnCF,CADF;AA+DD;;AAED,MAAMmE,MAAM,GAAG/H,uBAAA,CAAW+I,MAAX,CAAkB;EAC/Bd,SAAS,EAAE;IACTe,IAAI,EAAE;EADG,CADoB;EAI/BF,MAAM,EAAE;IACNG,QAAQ,EAAE1H,qBAAA,CAAS2H,MAAT,CAAgB;MAAEC,OAAO,EAAE,QAAX;MAAqBC,GAAG,EAAE5F;IAA1B,CAAhB;EADJ,CAJuB;EAO/BkF,MAAM,EAAE;IACNW,eAAe,EAAE,SADX;IAENC,SAAS,EAAE,CAFL;IAGNC,WAAW,EAAE,OAHP;IAINC,aAAa,EAAE,GAJT;IAKNC,YAAY,EAAEzJ,uBAAA,CAAW0J,aALnB;IAMNC,YAAY,EAAE;MACZnE,MAAM,EAAExF,uBAAA,CAAW0J,aADP;MAEZ9J,KAAK,EAAE;IAFK,CANR;IAUNgK,MAAM,EAAE;EAVF,CAPuB;EAmB/B5B,UAAU,EAAE;IACV6B,aAAa,EAAE,KADL;IAEVC,QAAQ,EAAE;EAFA,CAnBmB;EAuB/BnB,kBAAkB,EAAE;IAClBtE,QAAQ,EAAE,UADQ;IAElB0F,GAAG,EAAE,CAFa;IAGlBC,IAAI,EAAE,CAHY;IAIlBC,KAAK,EAAE,CAJW;IAKlBC,MAAM,EAAE;EALU;AAvBW,CAAlB,CAAf"}
@@ -22,7 +22,7 @@ const getTranslateX = (position, routes, getTabWidth, gap) => {
22
22
 
23
23
  const outputRange = routes.reduce((acc, _, i) => {
24
24
  if (i === 0) return [0];
25
- return [...acc, acc[i - 1] + getTabWidth(i - 1) + (gap ?? 0)];
25
+ return [...acc, acc[i - 1] + getTabWidth(i - 1) + (gap !== null && gap !== void 0 ? gap : 0)];
26
26
  }, []);
27
27
  const translateX = position.interpolate({
28
28
  inputRange,
@@ -45,11 +45,11 @@ function TabBarIndicator(_ref) {
45
45
  const isIndicatorShown = React.useRef(false);
46
46
  const isWidthDynamic = width === 'auto';
47
47
  const opacity = (0, _useAnimatedValue.default)(isWidthDynamic ? 0 : 1);
48
- const hasMeasuredTabWidths = Boolean(layout.width) && navigationState.routes.every((_, i) => getTabWidth(i));
48
+ const indicatorVisible = isWidthDynamic ? layout.width && navigationState.routes.slice(0, navigationState.index).every((_, r) => getTabWidth(r)) : true;
49
49
  React.useEffect(() => {
50
50
  const fadeInIndicator = () => {
51
51
  if (!isIndicatorShown.current && isWidthDynamic && // We should fade-in the indicator when we have widths for all the tab items
52
- hasMeasuredTabWidths) {
52
+ indicatorVisible) {
53
53
  isIndicatorShown.current = true;
54
54
 
55
55
  _reactNative.Animated.timing(opacity, {
@@ -63,7 +63,7 @@ function TabBarIndicator(_ref) {
63
63
 
64
64
  fadeInIndicator();
65
65
  return () => opacity.stopAnimation();
66
- }, [hasMeasuredTabWidths, isWidthDynamic, opacity]);
66
+ }, [indicatorVisible, isWidthDynamic, opacity]);
67
67
  const {
68
68
  routes
69
69
  } = navigationState;