react-native-tab-view 3.2.0 → 3.2.1
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.
- package/README.md +4 -0
- package/lib/commonjs/PagerViewAdapter.js +23 -7
- package/lib/commonjs/PagerViewAdapter.js.map +1 -1
- package/lib/commonjs/PanResponderAdapter.js +27 -19
- package/lib/commonjs/PanResponderAdapter.js.map +1 -1
- package/lib/commonjs/TabView.js +3 -1
- package/lib/commonjs/TabView.js.map +1 -1
- package/lib/commonjs/types.js.map +1 -1
- package/lib/module/PagerViewAdapter.js +23 -7
- package/lib/module/PagerViewAdapter.js.map +1 -1
- package/lib/module/PanResponderAdapter.js +27 -18
- package/lib/module/PanResponderAdapter.js.map +1 -1
- package/lib/module/TabView.js +3 -1
- package/lib/module/TabView.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/lib/typescript/PagerViewAdapter.d.ts +1 -1
- package/lib/typescript/PanResponderAdapter.d.ts +1 -1
- package/lib/typescript/TabView.d.ts +1 -1
- package/lib/typescript/types.d.ts +1 -0
- package/package.json +1 -1
- package/src/PagerViewAdapter.tsx +23 -9
- package/src/PanResponderAdapter.tsx +23 -17
- package/src/TabView.tsx +2 -0
- package/src/types.tsx +1 -0
package/README.md
CHANGED
|
@@ -308,6 +308,10 @@ String indicating whether the keyboard gets dismissed in response to a drag gest
|
|
|
308
308
|
|
|
309
309
|
Boolean indicating whether to enable swipe gestures. Swipe gestures are enabled by default. Passing `false` will disable swipe gestures, but the user can still switch tabs by pressing the tab bar.
|
|
310
310
|
|
|
311
|
+
#### `animationEnabled`
|
|
312
|
+
|
|
313
|
+
Enables animation when changing tab. By default it's true.
|
|
314
|
+
|
|
311
315
|
##### `onSwipeStart`
|
|
312
316
|
|
|
313
317
|
Callback which is called when the swipe gesture starts, i.e. the user touches the screen and moves it.
|
|
@@ -33,6 +33,7 @@ function PagerViewAdapter(_ref) {
|
|
|
33
33
|
onSwipeEnd,
|
|
34
34
|
children,
|
|
35
35
|
style,
|
|
36
|
+
animationEnabled,
|
|
36
37
|
...rest
|
|
37
38
|
} = _ref;
|
|
38
39
|
const {
|
|
@@ -48,22 +49,37 @@ function PagerViewAdapter(_ref) {
|
|
|
48
49
|
navigationStateRef.current = navigationState;
|
|
49
50
|
});
|
|
50
51
|
const jumpTo = React.useCallback(key => {
|
|
51
|
-
var _pagerRef$current;
|
|
52
|
-
|
|
53
52
|
const index = navigationStateRef.current.routes.findIndex(route => route.key === key);
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
|
|
54
|
+
if (animationEnabled) {
|
|
55
|
+
var _pagerRef$current;
|
|
56
|
+
|
|
57
|
+
(_pagerRef$current = pagerRef.current) === null || _pagerRef$current === void 0 ? void 0 : _pagerRef$current.setPage(index);
|
|
58
|
+
} else {
|
|
59
|
+
var _pagerRef$current2;
|
|
60
|
+
|
|
61
|
+
(_pagerRef$current2 = pagerRef.current) === null || _pagerRef$current2 === void 0 ? void 0 : _pagerRef$current2.setPageWithoutAnimation(index);
|
|
62
|
+
position.setValue(index);
|
|
63
|
+
}
|
|
64
|
+
}, [animationEnabled, position]);
|
|
56
65
|
React.useEffect(() => {
|
|
57
66
|
if (keyboardDismissMode === 'auto') {
|
|
58
67
|
_reactNative.Keyboard.dismiss();
|
|
59
68
|
}
|
|
60
69
|
|
|
61
70
|
if (indexRef.current !== index) {
|
|
62
|
-
|
|
71
|
+
if (animationEnabled) {
|
|
72
|
+
var _pagerRef$current3;
|
|
63
73
|
|
|
64
|
-
|
|
74
|
+
(_pagerRef$current3 = pagerRef.current) === null || _pagerRef$current3 === void 0 ? void 0 : _pagerRef$current3.setPage(index);
|
|
75
|
+
} else {
|
|
76
|
+
var _pagerRef$current4;
|
|
77
|
+
|
|
78
|
+
(_pagerRef$current4 = pagerRef.current) === null || _pagerRef$current4 === void 0 ? void 0 : _pagerRef$current4.setPageWithoutAnimation(index);
|
|
79
|
+
position.setValue(index);
|
|
80
|
+
}
|
|
65
81
|
}
|
|
66
|
-
}, [keyboardDismissMode, index]);
|
|
82
|
+
}, [keyboardDismissMode, index, animationEnabled, position]);
|
|
67
83
|
|
|
68
84
|
const onPageScrollStateChanged = state => {
|
|
69
85
|
const {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["AnimatedViewPager","Animated","createAnimatedComponent","ViewPager","PagerViewAdapter","keyboardDismissMode","swipeEnabled","navigationState","onIndexChange","onSwipeStart","onSwipeEnd","children","style","rest","index","listenersRef","React","useRef","pagerRef","indexRef","navigationStateRef","position","useAnimatedValue","offset","useEffect","current","jumpTo","useCallback","key","routes","findIndex","route","setPage","Keyboard","dismiss","onPageScrollStateChanged","state","pageScrollState","nativeEvent","subscription","addListener","value","next","Math","ceil","floor","forEach","listener","removeListener","addEnterListener","push","indexOf","splice","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 ...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((key: string) => {\n
|
|
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","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 return children({\n position: Animated.add(position, offset),\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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"}
|
|
@@ -38,7 +38,8 @@ function PanResponderAdapter(_ref) {
|
|
|
38
38
|
onSwipeStart,
|
|
39
39
|
onSwipeEnd,
|
|
40
40
|
children,
|
|
41
|
-
style
|
|
41
|
+
style,
|
|
42
|
+
animationEnabled = false
|
|
42
43
|
} = _ref;
|
|
43
44
|
const {
|
|
44
45
|
routes,
|
|
@@ -53,29 +54,36 @@ function PanResponderAdapter(_ref) {
|
|
|
53
54
|
const pendingIndexRef = React.useRef();
|
|
54
55
|
const swipeVelocityThreshold = 0.15;
|
|
55
56
|
const swipeDistanceThreshold = layout.width / 1.75;
|
|
56
|
-
const jumpToIndex = React.useCallback(index
|
|
57
|
+
const jumpToIndex = React.useCallback(function (index) {
|
|
58
|
+
let animate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : animationEnabled;
|
|
57
59
|
const offset = -index * layoutRef.current.width;
|
|
58
60
|
const {
|
|
59
61
|
timing,
|
|
60
62
|
...transitionConfig
|
|
61
63
|
} = DefaultTransitionSpec;
|
|
62
64
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
65
|
+
if (animate) {
|
|
66
|
+
_reactNative.Animated.parallel([timing(panX, { ...transitionConfig,
|
|
67
|
+
toValue: offset,
|
|
68
|
+
useNativeDriver: false
|
|
69
|
+
})]).start(_ref2 => {
|
|
70
|
+
let {
|
|
71
|
+
finished
|
|
72
|
+
} = _ref2;
|
|
73
|
+
|
|
74
|
+
if (finished) {
|
|
75
|
+
onIndexChangeRef.current(index);
|
|
76
|
+
pendingIndexRef.current = undefined;
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
pendingIndexRef.current = index;
|
|
81
|
+
} else {
|
|
82
|
+
panX.setValue(offset);
|
|
83
|
+
onIndexChangeRef.current(index);
|
|
84
|
+
pendingIndexRef.current = undefined;
|
|
85
|
+
}
|
|
86
|
+
}, [animationEnabled, panX]);
|
|
79
87
|
React.useEffect(() => {
|
|
80
88
|
navigationStateRef.current = navigationState;
|
|
81
89
|
layoutRef.current = layout;
|
|
@@ -158,7 +166,7 @@ function PanResponderAdapter(_ref) {
|
|
|
158
166
|
nextIndex = currentIndex;
|
|
159
167
|
}
|
|
160
168
|
|
|
161
|
-
jumpToIndex(nextIndex);
|
|
169
|
+
jumpToIndex(nextIndex, true);
|
|
162
170
|
}; // TODO: use the listeners
|
|
163
171
|
|
|
164
172
|
|
|
@@ -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","routes","index","panX","useAnimatedValue","listenersRef","React","useRef","navigationStateRef","layoutRef","onIndexChangeRef","currentIndexRef","pendingIndexRef","swipeVelocityThreshold","swipeDistanceThreshold","width","jumpToIndex","useCallback","offset","current","transitionConfig","parallel","toValue","useNativeDriver","start","finished","undefined","useEffect","setValue","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","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}: 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) => {\n const offset = -index * layoutRef.current.width;\n\n const { timing, ...transitionConfig } = DefaultTransitionSpec;\n\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\n pendingIndexRef.current = index;\n },\n [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);\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 return children({\n position: layout.width\n ? Animated.divide(panX, -layout.width)\n : 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","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 return children({\n position: layout.width\n ? Animated.divide(panX, -layout.width)\n : 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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"}
|
package/lib/commonjs/TabView.js
CHANGED
|
@@ -40,7 +40,8 @@ function TabView(_ref) {
|
|
|
40
40
|
pagerStyle,
|
|
41
41
|
style,
|
|
42
42
|
swipeEnabled = true,
|
|
43
|
-
tabBarPosition = 'top'
|
|
43
|
+
tabBarPosition = 'top',
|
|
44
|
+
animationEnabled = true
|
|
44
45
|
} = _ref;
|
|
45
46
|
const [layout, setLayout] = React.useState({
|
|
46
47
|
width: 0,
|
|
@@ -82,6 +83,7 @@ function TabView(_ref) {
|
|
|
82
83
|
onSwipeStart: onSwipeStart,
|
|
83
84
|
onSwipeEnd: onSwipeEnd,
|
|
84
85
|
onIndexChange: jumpToIndex,
|
|
86
|
+
animationEnabled: animationEnabled,
|
|
85
87
|
style: pagerStyle
|
|
86
88
|
}, _ref2 => {
|
|
87
89
|
let {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["TabView","onIndexChange","navigationState","renderScene","initialLayout","keyboardDismissMode","lazy","lazyPreloadDistance","onSwipeStart","onSwipeEnd","renderLazyPlaceholder","renderTabBar","props","sceneContainerStyle","pagerStyle","style","swipeEnabled","tabBarPosition","layout","setLayout","React","useState","width","height","jumpToIndex","index","handleLayout","e","nativeEvent","prevLayout","styles","pager","position","render","addEnterListener","jumpTo","sceneRendererProps","routes","map","route","i","key","loading","StyleSheet","create","flex","overflow"],"sources":["TabView.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n StyleSheet,\n View,\n StyleProp,\n ViewStyle,\n LayoutChangeEvent,\n} from 'react-native';\nimport TabBar from './TabBar';\nimport SceneView from './SceneView';\nimport Pager from './Pager';\nimport type {\n Layout,\n NavigationState,\n Route,\n SceneRendererProps,\n PagerProps,\n} from './types';\n\nexport type Props<T extends Route> = PagerProps & {\n onIndexChange: (index: number) => void;\n navigationState: NavigationState<T>;\n renderScene: (props: SceneRendererProps & { route: T }) => React.ReactNode;\n renderLazyPlaceholder?: (props: { route: T }) => React.ReactNode;\n renderTabBar?: (\n props: SceneRendererProps & { navigationState: NavigationState<T> }\n ) => React.ReactNode;\n tabBarPosition?: 'top' | 'bottom';\n initialLayout?: Partial<Layout>;\n lazy?: ((props: { route: T }) => boolean) | boolean;\n lazyPreloadDistance?: number;\n sceneContainerStyle?: StyleProp<ViewStyle>;\n pagerStyle?: StyleProp<ViewStyle>;\n style?: StyleProp<ViewStyle>;\n};\n\nexport default function TabView<T extends Route>({\n onIndexChange,\n navigationState,\n renderScene,\n initialLayout,\n keyboardDismissMode = 'auto',\n lazy = false,\n lazyPreloadDistance = 0,\n onSwipeStart,\n onSwipeEnd,\n renderLazyPlaceholder = () => null,\n renderTabBar = (props) => <TabBar {...props} />,\n sceneContainerStyle,\n pagerStyle,\n style,\n swipeEnabled = true,\n tabBarPosition = 'top',\n}: Props<T>) {\n const [layout, setLayout] = React.useState({\n width: 0,\n height: 0,\n ...initialLayout,\n });\n\n const jumpToIndex = (index: number) => {\n if (index !== navigationState.index) {\n onIndexChange(index);\n }\n };\n\n const handleLayout = (e: LayoutChangeEvent) => {\n const { height, width } = e.nativeEvent.layout;\n\n setLayout((prevLayout) => {\n if (prevLayout.width === width && prevLayout.height === height) {\n return prevLayout;\n }\n\n return { height, width };\n });\n };\n\n return (\n <View onLayout={handleLayout} style={[styles.pager, style]}>\n <Pager\n layout={layout}\n navigationState={navigationState}\n keyboardDismissMode={keyboardDismissMode}\n swipeEnabled={swipeEnabled}\n onSwipeStart={onSwipeStart}\n onSwipeEnd={onSwipeEnd}\n onIndexChange={jumpToIndex}\n style={pagerStyle}\n >\n {({ position, render, addEnterListener, jumpTo }) => {\n // All of the props here must not change between re-renders\n // This is crucial to optimizing the routes with PureComponent\n const sceneRendererProps = {\n position,\n layout,\n jumpTo,\n };\n\n return (\n <React.Fragment>\n {tabBarPosition === 'top' &&\n renderTabBar({\n ...sceneRendererProps,\n navigationState,\n })}\n {render(\n navigationState.routes.map((route, i) => {\n return (\n <SceneView\n {...sceneRendererProps}\n addEnterListener={addEnterListener}\n key={route.key}\n index={i}\n lazy={typeof lazy === 'function' ? lazy({ route }) : lazy}\n lazyPreloadDistance={lazyPreloadDistance}\n navigationState={navigationState}\n style={sceneContainerStyle}\n >\n {({ loading }) =>\n loading\n ? renderLazyPlaceholder({ route })\n : renderScene({\n ...sceneRendererProps,\n route,\n })\n }\n </SceneView>\n );\n })\n )}\n {tabBarPosition === 'bottom' &&\n renderTabBar({\n ...sceneRendererProps,\n navigationState,\n })}\n </React.Fragment>\n );\n }}\n </Pager>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n pager: {\n flex: 1,\n overflow: 'hidden',\n },\n});\n"],"mappings":";;;;;;;AAAA;;AACA;;AAOA;;AACA;;AACA;;;;;;;;;;AA0Be,SAASA,OAAT,
|
|
1
|
+
{"version":3,"names":["TabView","onIndexChange","navigationState","renderScene","initialLayout","keyboardDismissMode","lazy","lazyPreloadDistance","onSwipeStart","onSwipeEnd","renderLazyPlaceholder","renderTabBar","props","sceneContainerStyle","pagerStyle","style","swipeEnabled","tabBarPosition","animationEnabled","layout","setLayout","React","useState","width","height","jumpToIndex","index","handleLayout","e","nativeEvent","prevLayout","styles","pager","position","render","addEnterListener","jumpTo","sceneRendererProps","routes","map","route","i","key","loading","StyleSheet","create","flex","overflow"],"sources":["TabView.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n StyleSheet,\n View,\n StyleProp,\n ViewStyle,\n LayoutChangeEvent,\n} from 'react-native';\nimport TabBar from './TabBar';\nimport SceneView from './SceneView';\nimport Pager from './Pager';\nimport type {\n Layout,\n NavigationState,\n Route,\n SceneRendererProps,\n PagerProps,\n} from './types';\n\nexport type Props<T extends Route> = PagerProps & {\n onIndexChange: (index: number) => void;\n navigationState: NavigationState<T>;\n renderScene: (props: SceneRendererProps & { route: T }) => React.ReactNode;\n renderLazyPlaceholder?: (props: { route: T }) => React.ReactNode;\n renderTabBar?: (\n props: SceneRendererProps & { navigationState: NavigationState<T> }\n ) => React.ReactNode;\n tabBarPosition?: 'top' | 'bottom';\n initialLayout?: Partial<Layout>;\n lazy?: ((props: { route: T }) => boolean) | boolean;\n lazyPreloadDistance?: number;\n sceneContainerStyle?: StyleProp<ViewStyle>;\n pagerStyle?: StyleProp<ViewStyle>;\n style?: StyleProp<ViewStyle>;\n};\n\nexport default function TabView<T extends Route>({\n onIndexChange,\n navigationState,\n renderScene,\n initialLayout,\n keyboardDismissMode = 'auto',\n lazy = false,\n lazyPreloadDistance = 0,\n onSwipeStart,\n onSwipeEnd,\n renderLazyPlaceholder = () => null,\n renderTabBar = (props) => <TabBar {...props} />,\n sceneContainerStyle,\n pagerStyle,\n style,\n swipeEnabled = true,\n tabBarPosition = 'top',\n animationEnabled = true,\n}: Props<T>) {\n const [layout, setLayout] = React.useState({\n width: 0,\n height: 0,\n ...initialLayout,\n });\n\n const jumpToIndex = (index: number) => {\n if (index !== navigationState.index) {\n onIndexChange(index);\n }\n };\n\n const handleLayout = (e: LayoutChangeEvent) => {\n const { height, width } = e.nativeEvent.layout;\n\n setLayout((prevLayout) => {\n if (prevLayout.width === width && prevLayout.height === height) {\n return prevLayout;\n }\n\n return { height, width };\n });\n };\n\n return (\n <View onLayout={handleLayout} style={[styles.pager, style]}>\n <Pager\n layout={layout}\n navigationState={navigationState}\n keyboardDismissMode={keyboardDismissMode}\n swipeEnabled={swipeEnabled}\n onSwipeStart={onSwipeStart}\n onSwipeEnd={onSwipeEnd}\n onIndexChange={jumpToIndex}\n animationEnabled={animationEnabled}\n style={pagerStyle}\n >\n {({ position, render, addEnterListener, jumpTo }) => {\n // All of the props here must not change between re-renders\n // This is crucial to optimizing the routes with PureComponent\n const sceneRendererProps = {\n position,\n layout,\n jumpTo,\n };\n\n return (\n <React.Fragment>\n {tabBarPosition === 'top' &&\n renderTabBar({\n ...sceneRendererProps,\n navigationState,\n })}\n {render(\n navigationState.routes.map((route, i) => {\n return (\n <SceneView\n {...sceneRendererProps}\n addEnterListener={addEnterListener}\n key={route.key}\n index={i}\n lazy={typeof lazy === 'function' ? lazy({ route }) : lazy}\n lazyPreloadDistance={lazyPreloadDistance}\n navigationState={navigationState}\n style={sceneContainerStyle}\n >\n {({ loading }) =>\n loading\n ? renderLazyPlaceholder({ route })\n : renderScene({\n ...sceneRendererProps,\n route,\n })\n }\n </SceneView>\n );\n })\n )}\n {tabBarPosition === 'bottom' &&\n renderTabBar({\n ...sceneRendererProps,\n navigationState,\n })}\n </React.Fragment>\n );\n }}\n </Pager>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n pager: {\n flex: 1,\n overflow: 'hidden',\n },\n});\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["types.tsx"],"sourcesContent":["import type { Animated } from 'react-native';\nimport type { PagerViewProps } from 'react-native-pager-view';\n\nexport type Route = {\n key: string;\n icon?: string;\n title?: string;\n accessible?: boolean;\n accessibilityLabel?: string;\n testID?: string;\n};\n\nexport type Event = {\n defaultPrevented: boolean;\n preventDefault(): void;\n};\n\nexport type Scene<T extends Route> = {\n route: T;\n};\n\nexport type NavigationState<T extends Route> = {\n index: number;\n routes: T[];\n};\n\nexport type Layout = {\n width: number;\n height: number;\n};\n\nexport type Listener = (value: number) => void;\n\nexport type SceneRendererProps = {\n layout: Layout;\n position: Animated.AnimatedInterpolation;\n jumpTo: (key: string) => void;\n};\n\nexport type EventEmitterProps = {\n addEnterListener: (listener: Listener) => () => void;\n};\n\nexport type PagerProps = Omit<\n PagerViewProps,\n | 'initialPage'\n | 'scrollEnabled'\n | 'onPageScroll'\n | 'onPageSelected'\n | 'onPageScrollStateChanged'\n | 'keyboardDismissMode'\n | 'children'\n> & {\n keyboardDismissMode?: 'none' | 'on-drag' | 'auto';\n swipeEnabled?: boolean;\n onSwipeStart?: () => void;\n onSwipeEnd?: () => void;\n};\n"],"mappings":""}
|
|
1
|
+
{"version":3,"names":[],"sources":["types.tsx"],"sourcesContent":["import type { Animated } from 'react-native';\nimport type { PagerViewProps } from 'react-native-pager-view';\n\nexport type Route = {\n key: string;\n icon?: string;\n title?: string;\n accessible?: boolean;\n accessibilityLabel?: string;\n testID?: string;\n};\n\nexport type Event = {\n defaultPrevented: boolean;\n preventDefault(): void;\n};\n\nexport type Scene<T extends Route> = {\n route: T;\n};\n\nexport type NavigationState<T extends Route> = {\n index: number;\n routes: T[];\n};\n\nexport type Layout = {\n width: number;\n height: number;\n};\n\nexport type Listener = (value: number) => void;\n\nexport type SceneRendererProps = {\n layout: Layout;\n position: Animated.AnimatedInterpolation;\n jumpTo: (key: string) => void;\n};\n\nexport type EventEmitterProps = {\n addEnterListener: (listener: Listener) => () => void;\n};\n\nexport type PagerProps = Omit<\n PagerViewProps,\n | 'initialPage'\n | 'scrollEnabled'\n | 'onPageScroll'\n | 'onPageSelected'\n | 'onPageScrollStateChanged'\n | 'keyboardDismissMode'\n | 'children'\n> & {\n keyboardDismissMode?: 'none' | 'on-drag' | 'auto';\n swipeEnabled?: boolean;\n animationEnabled?: boolean;\n onSwipeStart?: () => void;\n onSwipeEnd?: () => void;\n};\n"],"mappings":""}
|
|
@@ -15,6 +15,7 @@ export default function PagerViewAdapter(_ref) {
|
|
|
15
15
|
onSwipeEnd,
|
|
16
16
|
children,
|
|
17
17
|
style,
|
|
18
|
+
animationEnabled,
|
|
18
19
|
...rest
|
|
19
20
|
} = _ref;
|
|
20
21
|
const {
|
|
@@ -30,22 +31,37 @@ export default function PagerViewAdapter(_ref) {
|
|
|
30
31
|
navigationStateRef.current = navigationState;
|
|
31
32
|
});
|
|
32
33
|
const jumpTo = React.useCallback(key => {
|
|
33
|
-
var _pagerRef$current;
|
|
34
|
-
|
|
35
34
|
const index = navigationStateRef.current.routes.findIndex(route => route.key === key);
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
|
|
36
|
+
if (animationEnabled) {
|
|
37
|
+
var _pagerRef$current;
|
|
38
|
+
|
|
39
|
+
(_pagerRef$current = pagerRef.current) === null || _pagerRef$current === void 0 ? void 0 : _pagerRef$current.setPage(index);
|
|
40
|
+
} else {
|
|
41
|
+
var _pagerRef$current2;
|
|
42
|
+
|
|
43
|
+
(_pagerRef$current2 = pagerRef.current) === null || _pagerRef$current2 === void 0 ? void 0 : _pagerRef$current2.setPageWithoutAnimation(index);
|
|
44
|
+
position.setValue(index);
|
|
45
|
+
}
|
|
46
|
+
}, [animationEnabled, position]);
|
|
38
47
|
React.useEffect(() => {
|
|
39
48
|
if (keyboardDismissMode === 'auto') {
|
|
40
49
|
Keyboard.dismiss();
|
|
41
50
|
}
|
|
42
51
|
|
|
43
52
|
if (indexRef.current !== index) {
|
|
44
|
-
|
|
53
|
+
if (animationEnabled) {
|
|
54
|
+
var _pagerRef$current3;
|
|
45
55
|
|
|
46
|
-
|
|
56
|
+
(_pagerRef$current3 = pagerRef.current) === null || _pagerRef$current3 === void 0 ? void 0 : _pagerRef$current3.setPage(index);
|
|
57
|
+
} else {
|
|
58
|
+
var _pagerRef$current4;
|
|
59
|
+
|
|
60
|
+
(_pagerRef$current4 = pagerRef.current) === null || _pagerRef$current4 === void 0 ? void 0 : _pagerRef$current4.setPageWithoutAnimation(index);
|
|
61
|
+
position.setValue(index);
|
|
62
|
+
}
|
|
47
63
|
}
|
|
48
|
-
}, [keyboardDismissMode, index]);
|
|
64
|
+
}, [keyboardDismissMode, index, animationEnabled, position]);
|
|
49
65
|
|
|
50
66
|
const onPageScrollStateChanged = state => {
|
|
51
67
|
const {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","Animated","Keyboard","StyleSheet","ViewPager","useAnimatedValue","AnimatedViewPager","createAnimatedComponent","PagerViewAdapter","keyboardDismissMode","swipeEnabled","navigationState","onIndexChange","onSwipeStart","onSwipeEnd","children","style","rest","index","listenersRef","useRef","pagerRef","indexRef","navigationStateRef","position","offset","useEffect","current","jumpTo","useCallback","key","routes","findIndex","route","setPage","dismiss","onPageScrollStateChanged","state","pageScrollState","nativeEvent","subscription","addListener","value","next","Math","ceil","floor","forEach","listener","removeListener","addEnterListener","push","indexOf","splice","add","render","styles","container","event","useNativeDriver","e","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 ...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((key: string) => {\n
|
|
1
|
+
{"version":3,"names":["React","Animated","Keyboard","StyleSheet","ViewPager","useAnimatedValue","AnimatedViewPager","createAnimatedComponent","PagerViewAdapter","keyboardDismissMode","swipeEnabled","navigationState","onIndexChange","onSwipeStart","onSwipeEnd","children","style","animationEnabled","rest","index","listenersRef","useRef","pagerRef","indexRef","navigationStateRef","position","offset","useEffect","current","jumpTo","useCallback","key","routes","findIndex","route","setPage","setPageWithoutAnimation","setValue","dismiss","onPageScrollStateChanged","state","pageScrollState","nativeEvent","subscription","addListener","value","next","Math","ceil","floor","forEach","listener","removeListener","addEnterListener","push","indexOf","splice","add","render","styles","container","event","useNativeDriver","e","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 return children({\n position: Animated.add(position, offset),\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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"}
|
|
@@ -21,7 +21,8 @@ export default function PanResponderAdapter(_ref) {
|
|
|
21
21
|
onSwipeStart,
|
|
22
22
|
onSwipeEnd,
|
|
23
23
|
children,
|
|
24
|
-
style
|
|
24
|
+
style,
|
|
25
|
+
animationEnabled = false
|
|
25
26
|
} = _ref;
|
|
26
27
|
const {
|
|
27
28
|
routes,
|
|
@@ -36,27 +37,35 @@ export default function PanResponderAdapter(_ref) {
|
|
|
36
37
|
const pendingIndexRef = React.useRef();
|
|
37
38
|
const swipeVelocityThreshold = 0.15;
|
|
38
39
|
const swipeDistanceThreshold = layout.width / 1.75;
|
|
39
|
-
const jumpToIndex = React.useCallback(index
|
|
40
|
+
const jumpToIndex = React.useCallback(function (index) {
|
|
41
|
+
let animate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : animationEnabled;
|
|
40
42
|
const offset = -index * layoutRef.current.width;
|
|
41
43
|
const {
|
|
42
44
|
timing,
|
|
43
45
|
...transitionConfig
|
|
44
46
|
} = DefaultTransitionSpec;
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
47
|
+
|
|
48
|
+
if (animate) {
|
|
49
|
+
Animated.parallel([timing(panX, { ...transitionConfig,
|
|
50
|
+
toValue: offset,
|
|
51
|
+
useNativeDriver: false
|
|
52
|
+
})]).start(_ref2 => {
|
|
53
|
+
let {
|
|
54
|
+
finished
|
|
55
|
+
} = _ref2;
|
|
56
|
+
|
|
57
|
+
if (finished) {
|
|
58
|
+
onIndexChangeRef.current(index);
|
|
59
|
+
pendingIndexRef.current = undefined;
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
pendingIndexRef.current = index;
|
|
63
|
+
} else {
|
|
64
|
+
panX.setValue(offset);
|
|
65
|
+
onIndexChangeRef.current(index);
|
|
66
|
+
pendingIndexRef.current = undefined;
|
|
67
|
+
}
|
|
68
|
+
}, [animationEnabled, panX]);
|
|
60
69
|
React.useEffect(() => {
|
|
61
70
|
navigationStateRef.current = navigationState;
|
|
62
71
|
layoutRef.current = layout;
|
|
@@ -139,7 +148,7 @@ export default function PanResponderAdapter(_ref) {
|
|
|
139
148
|
nextIndex = currentIndex;
|
|
140
149
|
}
|
|
141
150
|
|
|
142
|
-
jumpToIndex(nextIndex);
|
|
151
|
+
jumpToIndex(nextIndex, true);
|
|
143
152
|
}; // TODO: use the listeners
|
|
144
153
|
|
|
145
154
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","Animated","PanResponder","Keyboard","StyleSheet","I18nManager","View","useAnimatedValue","DEAD_ZONE","DefaultTransitionSpec","timing","spring","stiffness","damping","mass","overshootClamping","PanResponderAdapter","layout","keyboardDismissMode","swipeEnabled","navigationState","onIndexChange","onSwipeStart","onSwipeEnd","children","style","routes","index","panX","listenersRef","useRef","navigationStateRef","layoutRef","onIndexChangeRef","currentIndexRef","pendingIndexRef","swipeVelocityThreshold","swipeDistanceThreshold","width","jumpToIndex","useCallback","offset","current","transitionConfig","parallel","toValue","useNativeDriver","start","finished","undefined","useEffect","setValue","dismiss","isMovingHorizontally","_","gestureState","Math","abs","dx","dy","vx","vy","canMoveScreen","event","diffX","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","create","onMoveShouldSetPanResponder","onMoveShouldSetPanResponderCapture","onPanResponderGrant","onPanResponderMove","onPanResponderTerminate","onPanResponderRelease","onPanResponderTerminationRequest","maxTranslate","translateX","multiply","interpolate","inputRange","outputRange","extrapolate","divide","Value","render","styles","sheet","transform","panHandlers","Children","map","child","i","focused","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}: 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) => {\n const offset = -index * layoutRef.current.width;\n\n const { timing, ...transitionConfig } = DefaultTransitionSpec;\n\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\n pendingIndexRef.current = index;\n },\n [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);\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 return children({\n position: layout.width\n ? Animated.divide(panX, -layout.width)\n : 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":["React","Animated","PanResponder","Keyboard","StyleSheet","I18nManager","View","useAnimatedValue","DEAD_ZONE","DefaultTransitionSpec","timing","spring","stiffness","damping","mass","overshootClamping","PanResponderAdapter","layout","keyboardDismissMode","swipeEnabled","navigationState","onIndexChange","onSwipeStart","onSwipeEnd","children","style","animationEnabled","routes","index","panX","listenersRef","useRef","navigationStateRef","layoutRef","onIndexChangeRef","currentIndexRef","pendingIndexRef","swipeVelocityThreshold","swipeDistanceThreshold","width","jumpToIndex","useCallback","animate","offset","current","transitionConfig","parallel","toValue","useNativeDriver","start","finished","undefined","setValue","useEffect","dismiss","isMovingHorizontally","_","gestureState","Math","abs","dx","dy","vx","vy","canMoveScreen","event","diffX","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","create","onMoveShouldSetPanResponder","onMoveShouldSetPanResponderCapture","onPanResponderGrant","onPanResponderMove","onPanResponderTerminate","onPanResponderRelease","onPanResponderTerminationRequest","maxTranslate","translateX","multiply","interpolate","inputRange","outputRange","extrapolate","divide","Value","render","styles","sheet","transform","panHandlers","Children","map","child","i","focused","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 return children({\n position: layout.width\n ? Animated.divide(panX, -layout.width)\n : 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":";;AAAA,OAAO,KAAKA,KAAZ,MAAuB,OAAvB;AACA,SACEC,QADF,EAEEC,YAFF,EAGEC,QAHF,EAIEC,UAJF,EAOEC,WAPF,EAQEC,IARF,QASO,cATP;AAUA,OAAOC,gBAAP,MAA6B,oBAA7B;AA6BA,MAAMC,SAAS,GAAG,EAAlB;AAEA,MAAMC,qBAAqB,GAAG;EAC5BC,MAAM,EAAET,QAAQ,CAACU,MADW;EAE5BC,SAAS,EAAE,IAFiB;EAG5BC,OAAO,EAAE,GAHmB;EAI5BC,IAAI,EAAE,CAJsB;EAK5BC,iBAAiB,EAAE;AALS,CAA9B;AAQA,eAAe,SAASC,mBAAT,OAWF;EAAA,IAXgD;IAC3DC,MAD2D;IAE3DC,mBAAmB,GAAG,MAFqC;IAG3DC,YAAY,GAAG,IAH4C;IAI3DC,eAJ2D;IAK3DC,aAL2D;IAM3DC,YAN2D;IAO3DC,UAP2D;IAQ3DC,QAR2D;IAS3DC,KAT2D;IAU3DC,gBAAgB,GAAG;EAVwC,CAWhD;EACX,MAAM;IAAEC,MAAF;IAAUC;EAAV,IAAoBR,eAA1B;EAEA,MAAMS,IAAI,GAAGtB,gBAAgB,CAAC,CAAD,CAA7B;EAEA,MAAMuB,YAAY,GAAG9B,KAAK,CAAC+B,MAAN,CAAyB,EAAzB,CAArB;EAEA,MAAMC,kBAAkB,GAAGhC,KAAK,CAAC+B,MAAN,CAAaX,eAAb,CAA3B;EACA,MAAMa,SAAS,GAAGjC,KAAK,CAAC+B,MAAN,CAAad,MAAb,CAAlB;EACA,MAAMiB,gBAAgB,GAAGlC,KAAK,CAAC+B,MAAN,CAAaV,aAAb,CAAzB;EAEA,MAAMc,eAAe,GAAGnC,KAAK,CAAC+B,MAAN,CAAaH,KAAb,CAAxB;EACA,MAAMQ,eAAe,GAAGpC,KAAK,CAAC+B,MAAN,EAAxB;EAEA,MAAMM,sBAAsB,GAAG,IAA/B;EACA,MAAMC,sBAAsB,GAAGrB,MAAM,CAACsB,KAAP,GAAe,IAA9C;EAEA,MAAMC,WAAW,GAAGxC,KAAK,CAACyC,WAAN,CAClB,UAACb,KAAD,EAA+C;IAAA,IAA/Bc,OAA+B,uEAArBhB,gBAAqB;IAC7C,MAAMiB,MAAM,GAAG,CAACf,KAAD,GAASK,SAAS,CAACW,OAAV,CAAkBL,KAA1C;IAEA,MAAM;MAAE7B,MAAF;MAAU,GAAGmC;IAAb,IAAkCpC,qBAAxC;;IAEA,IAAIiC,OAAJ,EAAa;MACXzC,QAAQ,CAAC6C,QAAT,CAAkB,CAChBpC,MAAM,CAACmB,IAAD,EAAO,EACX,GAAGgB,gBADQ;QAEXE,OAAO,EAAEJ,MAFE;QAGXK,eAAe,EAAE;MAHN,CAAP,CADU,CAAlB,EAMGC,KANH,CAMS,SAAkB;QAAA,IAAjB;UAAEC;QAAF,CAAiB;;QACzB,IAAIA,QAAJ,EAAc;UACZhB,gBAAgB,CAACU,OAAjB,CAAyBhB,KAAzB;UACAQ,eAAe,CAACQ,OAAhB,GAA0BO,SAA1B;QACD;MACF,CAXD;MAYAf,eAAe,CAACQ,OAAhB,GAA0BhB,KAA1B;IACD,CAdD,MAcO;MACLC,IAAI,CAACuB,QAAL,CAAcT,MAAd;MACAT,gBAAgB,CAACU,OAAjB,CAAyBhB,KAAzB;MACAQ,eAAe,CAACQ,OAAhB,GAA0BO,SAA1B;IACD;EACF,CAzBiB,EA0BlB,CAACzB,gBAAD,EAAmBG,IAAnB,CA1BkB,CAApB;EA6BA7B,KAAK,CAACqD,SAAN,CAAgB,MAAM;IACpBrB,kBAAkB,CAACY,OAAnB,GAA6BxB,eAA7B;IACAa,SAAS,CAACW,OAAV,GAAoB3B,MAApB;IACAiB,gBAAgB,CAACU,OAAjB,GAA2BvB,aAA3B;EACD,CAJD;EAMArB,KAAK,CAACqD,SAAN,CAAgB,MAAM;IACpB,MAAMV,MAAM,GAAG,CAACX,kBAAkB,CAACY,OAAnB,CAA2BhB,KAA5B,GAAoCX,MAAM,CAACsB,KAA1D;IAEAV,IAAI,CAACuB,QAAL,CAAcT,MAAd;EACD,CAJD,EAIG,CAAC1B,MAAM,CAACsB,KAAR,EAAeV,IAAf,CAJH;EAMA7B,KAAK,CAACqD,SAAN,CAAgB,MAAM;IACpB,IAAInC,mBAAmB,KAAK,MAA5B,EAAoC;MAClCf,QAAQ,CAACmD,OAAT;IACD;;IAED,IAAIrC,MAAM,CAACsB,KAAP,IAAgBJ,eAAe,CAACS,OAAhB,KAA4BhB,KAAhD,EAAuD;MACrDO,eAAe,CAACS,OAAhB,GAA0BhB,KAA1B;MACAY,WAAW,CAACZ,KAAD,CAAX;IACD;EACF,CATD,EASG,CAACY,WAAD,EAActB,mBAAd,EAAmCD,MAAM,CAACsB,KAA1C,EAAiDX,KAAjD,CATH;;EAWA,MAAM2B,oBAAoB,GAAG,CAC3BC,CAD2B,EAE3BC,YAF2B,KAGxB;IACH,OACEC,IAAI,CAACC,GAAL,CAASF,YAAY,CAACG,EAAtB,IAA4BF,IAAI,CAACC,GAAL,CAASF,YAAY,CAACI,EAAb,GAAkB,CAA3B,CAA5B,IACAH,IAAI,CAACC,GAAL,CAASF,YAAY,CAACK,EAAtB,IAA4BJ,IAAI,CAACC,GAAL,CAASF,YAAY,CAACM,EAAb,GAAkB,CAA3B,CAF9B;EAID,CARD;;EAUA,MAAMC,aAAa,GAAG,CACpBC,KADoB,EAEpBR,YAFoB,KAGjB;IACH,IAAItC,YAAY,KAAK,KAArB,EAA4B;MAC1B,OAAO,KAAP;IACD;;IAED,MAAM+C,KAAK,GAAG7D,WAAW,CAAC8D,KAAZ,GAAoB,CAACV,YAAY,CAACG,EAAlC,GAAuCH,YAAY,CAACG,EAAlE;IAEA,OACEL,oBAAoB,CAACU,KAAD,EAAQR,YAAR,CAApB,KACES,KAAK,IAAI1D,SAAT,IAAsB2B,eAAe,CAACS,OAAhB,GAA0B,CAAjD,IACEsB,KAAK,IAAI,CAAC1D,SAAV,IAAuB2B,eAAe,CAACS,OAAhB,GAA0BjB,MAAM,CAACyC,MAAP,GAAgB,CAFpE,CADF;EAKD,CAfD;;EAiBA,MAAMC,YAAY,GAAG,MAAM;IACzB/C,YAAY,SAAZ,IAAAA,YAAY,WAAZ,YAAAA,YAAY;;IAEZ,IAAIJ,mBAAmB,KAAK,SAA5B,EAAuC;MACrCf,QAAQ,CAACmD,OAAT;IACD;;IAEDzB,IAAI,CAACyC,aAAL,GAPyB,CAQzB;;IACAzC,IAAI,CAAC0C,SAAL,CAAe1C,IAAI,CAAC2C,MAApB;EACD,CAVD;;EAYA,MAAMC,gBAAgB,GAAG,CACvBjB,CADuB,EAEvBC,YAFuB,KAGpB;IACH,MAAMS,KAAK,GAAG7D,WAAW,CAAC8D,KAAZ,GAAoB,CAACV,YAAY,CAACG,EAAlC,GAAuCH,YAAY,CAACG,EAAlE;;IAEA,KACE;IACCM,KAAK,GAAG,CAAR,IAAatC,KAAK,IAAI,CAAvB,IACA;IACCsC,KAAK,GAAG,CAAR,IAAatC,KAAK,IAAID,MAAM,CAACyC,MAAP,GAAgB,CAJzC,EAKE;MACA;IACD;;IAED,IAAInD,MAAM,CAACsB,KAAX,EAAkB;MAChB;MACA,MAAMmC,QAAQ,GAAG,CAAC7C,IAAI,CAAC8C,OAAL,GAAeT,KAAhB,IAAyB,CAACjD,MAAM,CAACsB,KAAlD;MACA,MAAMqC,IAAI,GACRF,QAAQ,GAAG9C,KAAX,GAAmB8B,IAAI,CAACmB,IAAL,CAAUH,QAAV,CAAnB,GAAyChB,IAAI,CAACoB,KAAL,CAAWJ,QAAX,CAD3C;;MAGA,IAAIE,IAAI,KAAKhD,KAAb,EAAoB;QAClBE,YAAY,CAACc,OAAb,CAAqBmC,OAArB,CAA8BC,QAAD,IAAcA,QAAQ,CAACJ,IAAD,CAAnD;MACD;IACF;;IAED/C,IAAI,CAACuB,QAAL,CAAcc,KAAd;EACD,CA3BD;;EA6BA,MAAMe,aAAa,GAAG,CACpBzB,CADoB,EAEpBC,YAFoB,KAGjB;IACH5B,IAAI,CAACqD,aAAL;IAEA3D,UAAU,SAAV,IAAAA,UAAU,WAAV,YAAAA,UAAU;IAEV,MAAM4D,YAAY,GAChB,OAAO/C,eAAe,CAACQ,OAAvB,KAAmC,QAAnC,GACIR,eAAe,CAACQ,OADpB,GAEIT,eAAe,CAACS,OAHtB;IAKA,IAAIwC,SAAS,GAAGD,YAAhB;;IAEA,IACEzB,IAAI,CAACC,GAAL,CAASF,YAAY,CAACG,EAAtB,IAA4BF,IAAI,CAACC,GAAL,CAASF,YAAY,CAACI,EAAtB,CAA5B,IACAH,IAAI,CAACC,GAAL,CAASF,YAAY,CAACK,EAAtB,IAA4BJ,IAAI,CAACC,GAAL,CAASF,YAAY,CAACM,EAAtB,CAD5B,KAECL,IAAI,CAACC,GAAL,CAASF,YAAY,CAACG,EAAtB,IAA4BtB,sBAA5B,IACCoB,IAAI,CAACC,GAAL,CAASF,YAAY,CAACK,EAAtB,IAA4BzB,sBAH9B,CADF,EAKE;MACA+C,SAAS,GAAG1B,IAAI,CAAC2B,KAAL,CACV3B,IAAI,CAAC4B,GAAL,CACE5B,IAAI,CAAC6B,GAAL,CACE,CADF,EAEElF,WAAW,CAAC8D,KAAZ,GACIgB,YAAY,GAAG1B,YAAY,CAACG,EAAb,GAAkBF,IAAI,CAACC,GAAL,CAASF,YAAY,CAACG,EAAtB,CADrC,GAEIuB,YAAY,GAAG1B,YAAY,CAACG,EAAb,GAAkBF,IAAI,CAACC,GAAL,CAASF,YAAY,CAACG,EAAtB,CAJvC,CADF,EAOEjC,MAAM,CAACyC,MAAP,GAAgB,CAPlB,CADU,CAAZ;MAYAjC,eAAe,CAACS,OAAhB,GAA0BwC,SAA1B;IACD;;IAED,IAAI,CAACI,QAAQ,CAACJ,SAAD,CAAb,EAA0B;MACxBA,SAAS,GAAGD,YAAZ;IACD;;IAED3C,WAAW,CAAC4C,SAAD,EAAY,IAAZ,CAAX;EACD,CAzCD,CAzIW,CAoLX;;;EACA,MAAMK,gBAAgB,GAAGzF,KAAK,CAACyC,WAAN,CAAmBuC,QAAD,IAAwB;IACjElD,YAAY,CAACc,OAAb,CAAqB8C,IAArB,CAA0BV,QAA1B;IAEA,OAAO,MAAM;MACX,MAAMpD,KAAK,GAAGE,YAAY,CAACc,OAAb,CAAqB+C,OAArB,CAA6BX,QAA7B,CAAd;;MAEA,IAAIpD,KAAK,GAAG,CAAC,CAAb,EAAgB;QACdE,YAAY,CAACc,OAAb,CAAqBgD,MAArB,CAA4BhE,KAA5B,EAAmC,CAAnC;MACD;IACF,CAND;EAOD,CAVwB,EAUtB,EAVsB,CAAzB;EAYA,MAAMiE,MAAM,GAAG7F,KAAK,CAACyC,WAAN,CACZqD,GAAD,IAAiB;IACf,MAAMlE,KAAK,GAAGI,kBAAkB,CAACY,OAAnB,CAA2BjB,MAA3B,CAAkCoE,SAAlC,CACXC,KAAD,IAA4BA,KAAK,CAACF,GAAN,KAAcA,GAD9B,CAAd;IAIAtD,WAAW,CAACZ,KAAD,CAAX;EACD,CAPY,EAQb,CAACY,WAAD,CARa,CAAf;EAWA,MAAMyD,YAAY,GAAG/F,YAAY,CAACgG,MAAb,CAAoB;IACvCC,2BAA2B,EAAEnC,aADU;IAEvCoC,kCAAkC,EAAEpC,aAFG;IAGvCqC,mBAAmB,EAAEhC,YAHkB;IAIvCiC,kBAAkB,EAAE7B,gBAJmB;IAKvC8B,uBAAuB,EAAEtB,aALc;IAMvCuB,qBAAqB,EAAEvB,aANgB;IAOvCwB,gCAAgC,EAAE,MAAM;EAPD,CAApB,CAArB;EAUA,MAAMC,YAAY,GAAGzF,MAAM,CAACsB,KAAP,IAAgBZ,MAAM,CAACyC,MAAP,GAAgB,CAAhC,CAArB;EACA,MAAMuC,UAAU,GAAG1G,QAAQ,CAAC2G,QAAT,CACjB/E,IAAI,CAACgF,WAAL,CAAiB;IACfC,UAAU,EAAE,CAAC,CAACJ,YAAF,EAAgB,CAAhB,CADG;IAEfK,WAAW,EAAE,CAAC,CAACL,YAAF,EAAgB,CAAhB,CAFE;IAGfM,WAAW,EAAE;EAHE,CAAjB,CADiB,EAMjB3G,WAAW,CAAC8D,KAAZ,GAAoB,CAAC,CAArB,GAAyB,CANR,CAAnB;EASA,OAAO3C,QAAQ,CAAC;IACdkD,QAAQ,EAAEzD,MAAM,CAACsB,KAAP,GACNtC,QAAQ,CAACgH,MAAT,CAAgBpF,IAAhB,EAAsB,CAACZ,MAAM,CAACsB,KAA9B,CADM,GAEN,IAAItC,QAAQ,CAACiH,KAAb,CAAmBtF,KAAnB,CAHU;IAId6D,gBAJc;IAKdI,MALc;IAMdsB,MAAM,EAAG3F,QAAD,iBACN,oBAAC,QAAD,CAAU,IAAV;MACE,KAAK,EAAE,CACL4F,MAAM,CAACC,KADF,EAELpG,MAAM,CAACsB,KAAP,GACI;QACEA,KAAK,EAAEZ,MAAM,CAACyC,MAAP,GAAgBnD,MAAM,CAACsB,KADhC;QAEE+E,SAAS,EAAE,CAAC;UAAEX;QAAF,CAAD;MAFb,CADJ,GAKI,IAPC,EAQLlF,KARK;IADT,GAWMwE,YAAY,CAACsB,WAXnB,GAaGvH,KAAK,CAACwH,QAAN,CAAeC,GAAf,CAAmBjG,QAAnB,EAA6B,CAACkG,KAAD,EAAQC,CAAR,KAAc;MAC1C,MAAM3B,KAAK,GAAGrE,MAAM,CAACgG,CAAD,CAApB;MACA,MAAMC,OAAO,GAAGD,CAAC,KAAK/F,KAAtB;MAEA,oBACE,oBAAC,IAAD;QACE,GAAG,EAAEoE,KAAK,CAACF,GADb;QAEE,KAAK,EACH7E,MAAM,CAACsB,KAAP,GACI;UAAEA,KAAK,EAAEtB,MAAM,CAACsB;QAAhB,CADJ,GAEIqF,OAAO,GACPxH,UAAU,CAACyH,YADJ,GAEP;MAPR,GAUGD,OAAO,IAAI3G,MAAM,CAACsB,KAAlB,GAA0BmF,KAA1B,GAAkC,IAVrC,CADF;IAcD,CAlBA,CAbH;EAPY,CAAD,CAAf;AA0CD;AAED,MAAMN,MAAM,GAAGhH,UAAU,CAAC8F,MAAX,CAAkB;EAC/BmB,KAAK,EAAE;IACLS,IAAI,EAAE,CADD;IAELC,aAAa,EAAE,KAFV;IAGLC,UAAU,EAAE;EAHP;AADwB,CAAlB,CAAf"}
|
package/lib/module/TabView.js
CHANGED
|
@@ -22,7 +22,8 @@ export default function TabView(_ref) {
|
|
|
22
22
|
pagerStyle,
|
|
23
23
|
style,
|
|
24
24
|
swipeEnabled = true,
|
|
25
|
-
tabBarPosition = 'top'
|
|
25
|
+
tabBarPosition = 'top',
|
|
26
|
+
animationEnabled = true
|
|
26
27
|
} = _ref;
|
|
27
28
|
const [layout, setLayout] = React.useState({
|
|
28
29
|
width: 0,
|
|
@@ -64,6 +65,7 @@ export default function TabView(_ref) {
|
|
|
64
65
|
onSwipeStart: onSwipeStart,
|
|
65
66
|
onSwipeEnd: onSwipeEnd,
|
|
66
67
|
onIndexChange: jumpToIndex,
|
|
68
|
+
animationEnabled: animationEnabled,
|
|
67
69
|
style: pagerStyle
|
|
68
70
|
}, _ref2 => {
|
|
69
71
|
let {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","StyleSheet","View","TabBar","SceneView","Pager","TabView","onIndexChange","navigationState","renderScene","initialLayout","keyboardDismissMode","lazy","lazyPreloadDistance","onSwipeStart","onSwipeEnd","renderLazyPlaceholder","renderTabBar","props","sceneContainerStyle","pagerStyle","style","swipeEnabled","tabBarPosition","layout","setLayout","useState","width","height","jumpToIndex","index","handleLayout","e","nativeEvent","prevLayout","styles","pager","position","render","addEnterListener","jumpTo","sceneRendererProps","routes","map","route","i","key","loading","create","flex","overflow"],"sources":["TabView.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n StyleSheet,\n View,\n StyleProp,\n ViewStyle,\n LayoutChangeEvent,\n} from 'react-native';\nimport TabBar from './TabBar';\nimport SceneView from './SceneView';\nimport Pager from './Pager';\nimport type {\n Layout,\n NavigationState,\n Route,\n SceneRendererProps,\n PagerProps,\n} from './types';\n\nexport type Props<T extends Route> = PagerProps & {\n onIndexChange: (index: number) => void;\n navigationState: NavigationState<T>;\n renderScene: (props: SceneRendererProps & { route: T }) => React.ReactNode;\n renderLazyPlaceholder?: (props: { route: T }) => React.ReactNode;\n renderTabBar?: (\n props: SceneRendererProps & { navigationState: NavigationState<T> }\n ) => React.ReactNode;\n tabBarPosition?: 'top' | 'bottom';\n initialLayout?: Partial<Layout>;\n lazy?: ((props: { route: T }) => boolean) | boolean;\n lazyPreloadDistance?: number;\n sceneContainerStyle?: StyleProp<ViewStyle>;\n pagerStyle?: StyleProp<ViewStyle>;\n style?: StyleProp<ViewStyle>;\n};\n\nexport default function TabView<T extends Route>({\n onIndexChange,\n navigationState,\n renderScene,\n initialLayout,\n keyboardDismissMode = 'auto',\n lazy = false,\n lazyPreloadDistance = 0,\n onSwipeStart,\n onSwipeEnd,\n renderLazyPlaceholder = () => null,\n renderTabBar = (props) => <TabBar {...props} />,\n sceneContainerStyle,\n pagerStyle,\n style,\n swipeEnabled = true,\n tabBarPosition = 'top',\n}: Props<T>) {\n const [layout, setLayout] = React.useState({\n width: 0,\n height: 0,\n ...initialLayout,\n });\n\n const jumpToIndex = (index: number) => {\n if (index !== navigationState.index) {\n onIndexChange(index);\n }\n };\n\n const handleLayout = (e: LayoutChangeEvent) => {\n const { height, width } = e.nativeEvent.layout;\n\n setLayout((prevLayout) => {\n if (prevLayout.width === width && prevLayout.height === height) {\n return prevLayout;\n }\n\n return { height, width };\n });\n };\n\n return (\n <View onLayout={handleLayout} style={[styles.pager, style]}>\n <Pager\n layout={layout}\n navigationState={navigationState}\n keyboardDismissMode={keyboardDismissMode}\n swipeEnabled={swipeEnabled}\n onSwipeStart={onSwipeStart}\n onSwipeEnd={onSwipeEnd}\n onIndexChange={jumpToIndex}\n style={pagerStyle}\n >\n {({ position, render, addEnterListener, jumpTo }) => {\n // All of the props here must not change between re-renders\n // This is crucial to optimizing the routes with PureComponent\n const sceneRendererProps = {\n position,\n layout,\n jumpTo,\n };\n\n return (\n <React.Fragment>\n {tabBarPosition === 'top' &&\n renderTabBar({\n ...sceneRendererProps,\n navigationState,\n })}\n {render(\n navigationState.routes.map((route, i) => {\n return (\n <SceneView\n {...sceneRendererProps}\n addEnterListener={addEnterListener}\n key={route.key}\n index={i}\n lazy={typeof lazy === 'function' ? lazy({ route }) : lazy}\n lazyPreloadDistance={lazyPreloadDistance}\n navigationState={navigationState}\n style={sceneContainerStyle}\n >\n {({ loading }) =>\n loading\n ? renderLazyPlaceholder({ route })\n : renderScene({\n ...sceneRendererProps,\n route,\n })\n }\n </SceneView>\n );\n })\n )}\n {tabBarPosition === 'bottom' &&\n renderTabBar({\n ...sceneRendererProps,\n navigationState,\n })}\n </React.Fragment>\n );\n }}\n </Pager>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n pager: {\n flex: 1,\n overflow: 'hidden',\n },\n});\n"],"mappings":";;AAAA,OAAO,KAAKA,KAAZ,MAAuB,OAAvB;AACA,SACEC,UADF,EAEEC,IAFF,QAMO,cANP;AAOA,OAAOC,MAAP,MAAmB,UAAnB;AACA,OAAOC,SAAP,MAAsB,aAAtB;AACA,OAAOC,KAAP,MAAkB,SAAlB;AA0BA,eAAe,SAASC,OAAT,
|
|
1
|
+
{"version":3,"names":["React","StyleSheet","View","TabBar","SceneView","Pager","TabView","onIndexChange","navigationState","renderScene","initialLayout","keyboardDismissMode","lazy","lazyPreloadDistance","onSwipeStart","onSwipeEnd","renderLazyPlaceholder","renderTabBar","props","sceneContainerStyle","pagerStyle","style","swipeEnabled","tabBarPosition","animationEnabled","layout","setLayout","useState","width","height","jumpToIndex","index","handleLayout","e","nativeEvent","prevLayout","styles","pager","position","render","addEnterListener","jumpTo","sceneRendererProps","routes","map","route","i","key","loading","create","flex","overflow"],"sources":["TabView.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n StyleSheet,\n View,\n StyleProp,\n ViewStyle,\n LayoutChangeEvent,\n} from 'react-native';\nimport TabBar from './TabBar';\nimport SceneView from './SceneView';\nimport Pager from './Pager';\nimport type {\n Layout,\n NavigationState,\n Route,\n SceneRendererProps,\n PagerProps,\n} from './types';\n\nexport type Props<T extends Route> = PagerProps & {\n onIndexChange: (index: number) => void;\n navigationState: NavigationState<T>;\n renderScene: (props: SceneRendererProps & { route: T }) => React.ReactNode;\n renderLazyPlaceholder?: (props: { route: T }) => React.ReactNode;\n renderTabBar?: (\n props: SceneRendererProps & { navigationState: NavigationState<T> }\n ) => React.ReactNode;\n tabBarPosition?: 'top' | 'bottom';\n initialLayout?: Partial<Layout>;\n lazy?: ((props: { route: T }) => boolean) | boolean;\n lazyPreloadDistance?: number;\n sceneContainerStyle?: StyleProp<ViewStyle>;\n pagerStyle?: StyleProp<ViewStyle>;\n style?: StyleProp<ViewStyle>;\n};\n\nexport default function TabView<T extends Route>({\n onIndexChange,\n navigationState,\n renderScene,\n initialLayout,\n keyboardDismissMode = 'auto',\n lazy = false,\n lazyPreloadDistance = 0,\n onSwipeStart,\n onSwipeEnd,\n renderLazyPlaceholder = () => null,\n renderTabBar = (props) => <TabBar {...props} />,\n sceneContainerStyle,\n pagerStyle,\n style,\n swipeEnabled = true,\n tabBarPosition = 'top',\n animationEnabled = true,\n}: Props<T>) {\n const [layout, setLayout] = React.useState({\n width: 0,\n height: 0,\n ...initialLayout,\n });\n\n const jumpToIndex = (index: number) => {\n if (index !== navigationState.index) {\n onIndexChange(index);\n }\n };\n\n const handleLayout = (e: LayoutChangeEvent) => {\n const { height, width } = e.nativeEvent.layout;\n\n setLayout((prevLayout) => {\n if (prevLayout.width === width && prevLayout.height === height) {\n return prevLayout;\n }\n\n return { height, width };\n });\n };\n\n return (\n <View onLayout={handleLayout} style={[styles.pager, style]}>\n <Pager\n layout={layout}\n navigationState={navigationState}\n keyboardDismissMode={keyboardDismissMode}\n swipeEnabled={swipeEnabled}\n onSwipeStart={onSwipeStart}\n onSwipeEnd={onSwipeEnd}\n onIndexChange={jumpToIndex}\n animationEnabled={animationEnabled}\n style={pagerStyle}\n >\n {({ position, render, addEnterListener, jumpTo }) => {\n // All of the props here must not change between re-renders\n // This is crucial to optimizing the routes with PureComponent\n const sceneRendererProps = {\n position,\n layout,\n jumpTo,\n };\n\n return (\n <React.Fragment>\n {tabBarPosition === 'top' &&\n renderTabBar({\n ...sceneRendererProps,\n navigationState,\n })}\n {render(\n navigationState.routes.map((route, i) => {\n return (\n <SceneView\n {...sceneRendererProps}\n addEnterListener={addEnterListener}\n key={route.key}\n index={i}\n lazy={typeof lazy === 'function' ? lazy({ route }) : lazy}\n lazyPreloadDistance={lazyPreloadDistance}\n navigationState={navigationState}\n style={sceneContainerStyle}\n >\n {({ loading }) =>\n loading\n ? renderLazyPlaceholder({ route })\n : renderScene({\n ...sceneRendererProps,\n route,\n })\n }\n </SceneView>\n );\n })\n )}\n {tabBarPosition === 'bottom' &&\n renderTabBar({\n ...sceneRendererProps,\n navigationState,\n })}\n </React.Fragment>\n );\n }}\n </Pager>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n pager: {\n flex: 1,\n overflow: 'hidden',\n },\n});\n"],"mappings":"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"}
|
package/lib/module/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["types.tsx"],"sourcesContent":["import type { Animated } from 'react-native';\nimport type { PagerViewProps } from 'react-native-pager-view';\n\nexport type Route = {\n key: string;\n icon?: string;\n title?: string;\n accessible?: boolean;\n accessibilityLabel?: string;\n testID?: string;\n};\n\nexport type Event = {\n defaultPrevented: boolean;\n preventDefault(): void;\n};\n\nexport type Scene<T extends Route> = {\n route: T;\n};\n\nexport type NavigationState<T extends Route> = {\n index: number;\n routes: T[];\n};\n\nexport type Layout = {\n width: number;\n height: number;\n};\n\nexport type Listener = (value: number) => void;\n\nexport type SceneRendererProps = {\n layout: Layout;\n position: Animated.AnimatedInterpolation;\n jumpTo: (key: string) => void;\n};\n\nexport type EventEmitterProps = {\n addEnterListener: (listener: Listener) => () => void;\n};\n\nexport type PagerProps = Omit<\n PagerViewProps,\n | 'initialPage'\n | 'scrollEnabled'\n | 'onPageScroll'\n | 'onPageSelected'\n | 'onPageScrollStateChanged'\n | 'keyboardDismissMode'\n | 'children'\n> & {\n keyboardDismissMode?: 'none' | 'on-drag' | 'auto';\n swipeEnabled?: boolean;\n onSwipeStart?: () => void;\n onSwipeEnd?: () => void;\n};\n"],"mappings":""}
|
|
1
|
+
{"version":3,"names":[],"sources":["types.tsx"],"sourcesContent":["import type { Animated } from 'react-native';\nimport type { PagerViewProps } from 'react-native-pager-view';\n\nexport type Route = {\n key: string;\n icon?: string;\n title?: string;\n accessible?: boolean;\n accessibilityLabel?: string;\n testID?: string;\n};\n\nexport type Event = {\n defaultPrevented: boolean;\n preventDefault(): void;\n};\n\nexport type Scene<T extends Route> = {\n route: T;\n};\n\nexport type NavigationState<T extends Route> = {\n index: number;\n routes: T[];\n};\n\nexport type Layout = {\n width: number;\n height: number;\n};\n\nexport type Listener = (value: number) => void;\n\nexport type SceneRendererProps = {\n layout: Layout;\n position: Animated.AnimatedInterpolation;\n jumpTo: (key: string) => void;\n};\n\nexport type EventEmitterProps = {\n addEnterListener: (listener: Listener) => () => void;\n};\n\nexport type PagerProps = Omit<\n PagerViewProps,\n | 'initialPage'\n | 'scrollEnabled'\n | 'onPageScroll'\n | 'onPageSelected'\n | 'onPageScrollStateChanged'\n | 'keyboardDismissMode'\n | 'children'\n> & {\n keyboardDismissMode?: 'none' | 'on-drag' | 'auto';\n swipeEnabled?: boolean;\n animationEnabled?: boolean;\n onSwipeStart?: () => void;\n onSwipeEnd?: () => void;\n};\n"],"mappings":""}
|
|
@@ -10,5 +10,5 @@ declare type Props<T extends Route> = PagerProps & {
|
|
|
10
10
|
jumpTo: (key: string) => void;
|
|
11
11
|
}) => React.ReactElement;
|
|
12
12
|
};
|
|
13
|
-
export default function PagerViewAdapter<T extends Route>({ keyboardDismissMode, swipeEnabled, navigationState, onIndexChange, onSwipeStart, onSwipeEnd, children, style, ...rest }: Props<T>): React.ReactElement<any, string | React.JSXElementConstructor<any>>;
|
|
13
|
+
export default function PagerViewAdapter<T extends Route>({ keyboardDismissMode, swipeEnabled, navigationState, onIndexChange, onSwipeStart, onSwipeEnd, children, style, animationEnabled, ...rest }: Props<T>): React.ReactElement<any, string | React.JSXElementConstructor<any>>;
|
|
14
14
|
export {};
|
|
@@ -11,5 +11,5 @@ declare type Props<T extends Route> = PagerProps & {
|
|
|
11
11
|
jumpTo: (key: string) => void;
|
|
12
12
|
}) => React.ReactElement;
|
|
13
13
|
};
|
|
14
|
-
export default function PanResponderAdapter<T extends Route>({ layout, keyboardDismissMode, swipeEnabled, navigationState, onIndexChange, onSwipeStart, onSwipeEnd, children, style, }: Props<T>): React.ReactElement<any, string | React.JSXElementConstructor<any>>;
|
|
14
|
+
export default function PanResponderAdapter<T extends Route>({ layout, keyboardDismissMode, swipeEnabled, navigationState, onIndexChange, onSwipeStart, onSwipeEnd, children, style, animationEnabled, }: Props<T>): React.ReactElement<any, string | React.JSXElementConstructor<any>>;
|
|
15
15
|
export {};
|
|
@@ -23,4 +23,4 @@ export declare type Props<T extends Route> = PagerProps & {
|
|
|
23
23
|
pagerStyle?: StyleProp<ViewStyle>;
|
|
24
24
|
style?: StyleProp<ViewStyle>;
|
|
25
25
|
};
|
|
26
|
-
export default function TabView<T extends Route>({ onIndexChange, navigationState, renderScene, initialLayout, keyboardDismissMode, lazy, lazyPreloadDistance, onSwipeStart, onSwipeEnd, renderLazyPlaceholder, renderTabBar, sceneContainerStyle, pagerStyle, style, swipeEnabled, tabBarPosition, }: Props<T>): JSX.Element;
|
|
26
|
+
export default function TabView<T extends Route>({ onIndexChange, navigationState, renderScene, initialLayout, keyboardDismissMode, lazy, lazyPreloadDistance, onSwipeStart, onSwipeEnd, renderLazyPlaceholder, renderTabBar, sceneContainerStyle, pagerStyle, style, swipeEnabled, tabBarPosition, animationEnabled, }: Props<T>): JSX.Element;
|
|
@@ -35,6 +35,7 @@ export declare type EventEmitterProps = {
|
|
|
35
35
|
export declare type PagerProps = Omit<PagerViewProps, 'initialPage' | 'scrollEnabled' | 'onPageScroll' | 'onPageSelected' | 'onPageScrollStateChanged' | 'keyboardDismissMode' | 'children'> & {
|
|
36
36
|
keyboardDismissMode?: 'none' | 'on-drag' | 'auto';
|
|
37
37
|
swipeEnabled?: boolean;
|
|
38
|
+
animationEnabled?: boolean;
|
|
38
39
|
onSwipeStart?: () => void;
|
|
39
40
|
onSwipeEnd?: () => void;
|
|
40
41
|
};
|
package/package.json
CHANGED
package/src/PagerViewAdapter.tsx
CHANGED
|
@@ -41,6 +41,7 @@ export default function PagerViewAdapter<T extends Route>({
|
|
|
41
41
|
onSwipeEnd,
|
|
42
42
|
children,
|
|
43
43
|
style,
|
|
44
|
+
animationEnabled,
|
|
44
45
|
...rest
|
|
45
46
|
}: Props<T>) {
|
|
46
47
|
const { index } = navigationState;
|
|
@@ -58,13 +59,21 @@ export default function PagerViewAdapter<T extends Route>({
|
|
|
58
59
|
navigationStateRef.current = navigationState;
|
|
59
60
|
});
|
|
60
61
|
|
|
61
|
-
const jumpTo = React.useCallback(
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
62
|
+
const jumpTo = React.useCallback(
|
|
63
|
+
(key: string) => {
|
|
64
|
+
const index = navigationStateRef.current.routes.findIndex(
|
|
65
|
+
(route: { key: string }) => route.key === key
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
if (animationEnabled) {
|
|
69
|
+
pagerRef.current?.setPage(index);
|
|
70
|
+
} else {
|
|
71
|
+
pagerRef.current?.setPageWithoutAnimation(index);
|
|
72
|
+
position.setValue(index);
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
[animationEnabled, position]
|
|
76
|
+
);
|
|
68
77
|
|
|
69
78
|
React.useEffect(() => {
|
|
70
79
|
if (keyboardDismissMode === 'auto') {
|
|
@@ -72,9 +81,14 @@ export default function PagerViewAdapter<T extends Route>({
|
|
|
72
81
|
}
|
|
73
82
|
|
|
74
83
|
if (indexRef.current !== index) {
|
|
75
|
-
|
|
84
|
+
if (animationEnabled) {
|
|
85
|
+
pagerRef.current?.setPage(index);
|
|
86
|
+
} else {
|
|
87
|
+
pagerRef.current?.setPageWithoutAnimation(index);
|
|
88
|
+
position.setValue(index);
|
|
89
|
+
}
|
|
76
90
|
}
|
|
77
|
-
}, [keyboardDismissMode, index]);
|
|
91
|
+
}, [keyboardDismissMode, index, animationEnabled, position]);
|
|
78
92
|
|
|
79
93
|
const onPageScrollStateChanged = (
|
|
80
94
|
state: PageScrollStateChangedNativeEvent
|
|
@@ -58,6 +58,7 @@ export default function PanResponderAdapter<T extends Route>({
|
|
|
58
58
|
onSwipeEnd,
|
|
59
59
|
children,
|
|
60
60
|
style,
|
|
61
|
+
animationEnabled = false,
|
|
61
62
|
}: Props<T>) {
|
|
62
63
|
const { routes, index } = navigationState;
|
|
63
64
|
|
|
@@ -76,27 +77,32 @@ export default function PanResponderAdapter<T extends Route>({
|
|
|
76
77
|
const swipeDistanceThreshold = layout.width / 1.75;
|
|
77
78
|
|
|
78
79
|
const jumpToIndex = React.useCallback(
|
|
79
|
-
(index: number) => {
|
|
80
|
+
(index: number, animate = animationEnabled) => {
|
|
80
81
|
const offset = -index * layoutRef.current.width;
|
|
81
82
|
|
|
82
83
|
const { timing, ...transitionConfig } = DefaultTransitionSpec;
|
|
83
84
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
85
|
+
if (animate) {
|
|
86
|
+
Animated.parallel([
|
|
87
|
+
timing(panX, {
|
|
88
|
+
...transitionConfig,
|
|
89
|
+
toValue: offset,
|
|
90
|
+
useNativeDriver: false,
|
|
91
|
+
}),
|
|
92
|
+
]).start(({ finished }) => {
|
|
93
|
+
if (finished) {
|
|
94
|
+
onIndexChangeRef.current(index);
|
|
95
|
+
pendingIndexRef.current = undefined;
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
pendingIndexRef.current = index;
|
|
99
|
+
} else {
|
|
100
|
+
panX.setValue(offset);
|
|
101
|
+
onIndexChangeRef.current(index);
|
|
102
|
+
pendingIndexRef.current = undefined;
|
|
103
|
+
}
|
|
98
104
|
},
|
|
99
|
-
[panX]
|
|
105
|
+
[animationEnabled, panX]
|
|
100
106
|
);
|
|
101
107
|
|
|
102
108
|
React.useEffect(() => {
|
|
@@ -230,7 +236,7 @@ export default function PanResponderAdapter<T extends Route>({
|
|
|
230
236
|
nextIndex = currentIndex;
|
|
231
237
|
}
|
|
232
238
|
|
|
233
|
-
jumpToIndex(nextIndex);
|
|
239
|
+
jumpToIndex(nextIndex, true);
|
|
234
240
|
};
|
|
235
241
|
|
|
236
242
|
// TODO: use the listeners
|
package/src/TabView.tsx
CHANGED
|
@@ -51,6 +51,7 @@ export default function TabView<T extends Route>({
|
|
|
51
51
|
style,
|
|
52
52
|
swipeEnabled = true,
|
|
53
53
|
tabBarPosition = 'top',
|
|
54
|
+
animationEnabled = true,
|
|
54
55
|
}: Props<T>) {
|
|
55
56
|
const [layout, setLayout] = React.useState({
|
|
56
57
|
width: 0,
|
|
@@ -86,6 +87,7 @@ export default function TabView<T extends Route>({
|
|
|
86
87
|
onSwipeStart={onSwipeStart}
|
|
87
88
|
onSwipeEnd={onSwipeEnd}
|
|
88
89
|
onIndexChange={jumpToIndex}
|
|
90
|
+
animationEnabled={animationEnabled}
|
|
89
91
|
style={pagerStyle}
|
|
90
92
|
>
|
|
91
93
|
{({ position, render, addEnterListener, jumpTo }) => {
|