react-navigation-reanimated-top-tabs 0.9.0 → 0.9.2
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/lib/commonjs/components/ReanimatedTopTab/AnimationHelper.js +6 -4
- package/lib/commonjs/components/ReanimatedTopTab/AnimationHelper.js.map +1 -1
- package/lib/commonjs/components/ReanimatedTopTab/ReanimatedTabView.js +9 -29
- package/lib/commonjs/components/ReanimatedTopTab/ReanimatedTabView.js.map +1 -1
- package/lib/module/components/ReanimatedTopTab/AnimationHelper.js +7 -5
- package/lib/module/components/ReanimatedTopTab/AnimationHelper.js.map +1 -1
- package/lib/module/components/ReanimatedTopTab/ReanimatedTabView.js +10 -30
- package/lib/module/components/ReanimatedTopTab/ReanimatedTabView.js.map +1 -1
- package/lib/typescript/src/components/ReanimatedTopTab/AnimationHelper.d.ts +4 -8
- package/lib/typescript/src/components/ReanimatedTopTab/AnimationHelper.d.ts.map +1 -1
- package/lib/typescript/src/components/ReanimatedTopTab/ReanimatedTabView.d.ts.map +1 -1
- package/lib/typescript/src/components/ReanimatedTopTab/types.d.ts +0 -1
- package/lib/typescript/src/components/ReanimatedTopTab/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/ReanimatedTopTab/AnimationHelper.ts +11 -10
- package/src/components/ReanimatedTopTab/ReanimatedTabView.tsx +16 -41
- package/src/components/ReanimatedTopTab/types.ts +0 -1
|
@@ -11,7 +11,7 @@ const onChange = (event, animationValue, width, navigationState) => {
|
|
|
11
11
|
if (animationValue > 0) {
|
|
12
12
|
return 0;
|
|
13
13
|
}
|
|
14
|
-
const routesLength = navigationState.
|
|
14
|
+
const routesLength = navigationState.routes.length - 1;
|
|
15
15
|
if (animationValue < -width * routesLength) {
|
|
16
16
|
return -width * routesLength;
|
|
17
17
|
}
|
|
@@ -20,7 +20,7 @@ const onChange = (event, animationValue, width, navigationState) => {
|
|
|
20
20
|
const getIndex = (navigationState, type) => {
|
|
21
21
|
'worklet';
|
|
22
22
|
|
|
23
|
-
const max = navigationState.
|
|
23
|
+
const max = navigationState.routes.length - 1;
|
|
24
24
|
const current = navigationState.index;
|
|
25
25
|
if (type === 'increment' && current < max) {
|
|
26
26
|
return current + 1;
|
|
@@ -56,11 +56,13 @@ const onEnd = (event, minimumValueToChangeView, width, navigationState) => {
|
|
|
56
56
|
value: -width * navigationState.index
|
|
57
57
|
};
|
|
58
58
|
};
|
|
59
|
-
const animation = (newValue,
|
|
59
|
+
const animation = (newValue, onFinished) => {
|
|
60
60
|
'worklet';
|
|
61
61
|
|
|
62
62
|
return (0, _reactNativeReanimated.withTiming)(newValue, {
|
|
63
|
-
duration
|
|
63
|
+
duration: 350
|
|
64
|
+
}, finished => {
|
|
65
|
+
if (finished && onFinished) (0, _reactNativeReanimated.runOnJS)(onFinished)();
|
|
64
66
|
});
|
|
65
67
|
};
|
|
66
68
|
const AnimationHelper = exports.AnimationHelper = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNativeReanimated","require","onChange","event","animationValue","width","navigationState","routesLength","
|
|
1
|
+
{"version":3,"names":["_reactNativeReanimated","require","onChange","event","animationValue","width","navigationState","routesLength","routes","length","changeX","getIndex","type","max","current","index","onEnd","minimumValueToChangeView","velocityX","translationX","newIndex","value","animation","newValue","onFinished","withTiming","duration","finished","runOnJS","AnimationHelper","exports"],"sourceRoot":"../../../../src","sources":["components/ReanimatedTopTab/AnimationHelper.ts"],"mappings":";;;;;;AAMA,IAAAA,sBAAA,GAAAC,OAAA;AAGA,MAAMC,QAAQ,GAAGA,CACfC,KAEC,EACDC,cAAsB,EACtBC,KAAa,EACbC,eAAuD,KACpD;EACH,SAAS;;EACT,IAAIF,cAAc,GAAG,CAAC,EAAE;IACtB,OAAO,CAAC;EACV;EACA,MAAMG,YAAY,GAAGD,eAAe,CAACE,MAAM,CAACC,MAAM,GAAG,CAAC;EACtD,IAAIL,cAAc,GAAG,CAACC,KAAK,GAAGE,YAAY,EAAE;IAC1C,OAAO,CAACF,KAAK,GAAGE,YAAY;EAC9B;EACA,OAAOH,cAAc,GAAGD,KAAK,CAACO,OAAO;AACvC,CAAC;AAED,MAAMC,QAAQ,GAAGA,CACfL,eAAuD,EACvDM,IAA+B,KAC5B;EACH,SAAS;;EACT,MAAMC,GAAG,GAAGP,eAAe,CAACE,MAAM,CAACC,MAAM,GAAG,CAAC;EAC7C,MAAMK,OAAO,GAAGR,eAAe,CAACS,KAAK;EAErC,IAAIH,IAAI,KAAK,WAAW,IAAIE,OAAO,GAAGD,GAAG,EAAE;IACzC,OAAOC,OAAO,GAAG,CAAC;EACpB;EAEA,IAAIF,IAAI,KAAK,WAAW,IAAIE,OAAO,GAAG,CAAC,EAAE;IACvC,OAAOA,OAAO,GAAG,CAAC;EACpB;EAEA,OAAOA,OAAO;AAChB,CAAC;AAED,MAAME,KAAK,GAAGA,CACZb,KAA6D,EAC7Dc,wBAAgC,EAChCZ,KAAa,EACbC,eAAuD,KACpD;EACH,SAAS;;EACT,MAAM;IAAEY,SAAS;IAAEC;EAAa,CAAC,GAAGhB,KAAK;EAEzC,IAAIe,SAAS,GAAG,CAAC,GAAG,IAAIC,YAAY,GAAG,CAACF,wBAAwB,EAAE;IAChE,MAAMG,QAAQ,GAAGT,QAAQ,CAACL,eAAe,EAAE,WAAW,CAAC;IACvD,OAAO;MACLS,KAAK,EAAEK,QAAQ;MACfC,KAAK,EAAE,CAAChB,KAAK,GAAGe;IAClB,CAAC;EACH;EACA,IAAIF,SAAS,GAAG,GAAG,IAAIC,YAAY,GAAGF,wBAAwB,EAAE;IAC9D,MAAMG,QAAQ,GAAGT,QAAQ,CAACL,eAAe,EAAE,WAAW,CAAC;IACvD,OAAO;MACLS,KAAK,EAAEK,QAAQ;MACfC,KAAK,EAAE,CAAChB,KAAK,GAAGe;IAClB,CAAC;EACH;EACA,OAAO;IACLL,KAAK,EAAET,eAAe,CAACS,KAAK;IAC5BM,KAAK,EAAE,CAAChB,KAAK,GAAGC,eAAe,CAACS;EAClC,CAAC;AACH,CAAC;AAED,MAAMO,SAAS,GAAGA,CAACC,QAAgB,EAAEC,UAAuB,KAAK;EAC/D,SAAS;;EACT,OAAO,IAAAC,iCAAU,EAACF,QAAQ,EAAE;IAAEG,QAAQ,EAAE;EAAI,CAAC,EAAGC,QAAQ,IAAK;IAC3D,IAAIA,QAAQ,IAAIH,UAAU,EAAE,IAAAI,8BAAO,EAACJ,UAAU,CAAC,CAAC,CAAC;EACnD,CAAC,CAAC;AACJ,CAAC;AAEM,MAAMK,eAAe,GAAAC,OAAA,CAAAD,eAAA,GAAG;EAC7BP,SAAS;EACTpB,QAAQ;EACRc;AACF,CAAC","ignoreList":[]}
|
|
@@ -27,52 +27,36 @@ const ReanimatedTabView = exports.ReanimatedTabView = /*#__PURE__*/_react.defaul
|
|
|
27
27
|
width
|
|
28
28
|
} = (0, _reactNative.useWindowDimensions)();
|
|
29
29
|
const loadedScreens = (0, _react.useRef)([navigationState.routes[navigationState.index]]);
|
|
30
|
+
const navigationStateRef = (0, _reactNativeReanimated.useSharedValue)(navigationState);
|
|
30
31
|
const scrollPosition = (0, _reactNativeReanimated.useSharedValue)(navigationState.index);
|
|
31
32
|
const {
|
|
32
33
|
positionX
|
|
33
34
|
} = (0, _useTabContext.useTabContext)();
|
|
35
|
+
(0, _react.useEffect)(() => {
|
|
36
|
+
navigationStateRef.value = navigationState;
|
|
37
|
+
}, [navigationState]);
|
|
34
38
|
(0, _reactNativeReanimated.useAnimatedReaction)(() => scrollPosition.value, value => {
|
|
35
39
|
positionX.value = (0, _reactNativeReanimated.interpolate)(value, navigationState.routes.map((_, i) => i * -width), navigationState.routes.map((_, i) => i), 'clamp');
|
|
36
40
|
});
|
|
37
41
|
const _navigate = index => {
|
|
38
|
-
scrollPosition.value = _AnimationHelper.AnimationHelper.animation(-index * width);
|
|
39
|
-
navigate(index);
|
|
42
|
+
scrollPosition.value = _AnimationHelper.AnimationHelper.animation(-index * width, () => navigate(index));
|
|
40
43
|
};
|
|
41
44
|
const minimumValueToChangeView = (0, _react.useMemo)(() => width * percentageTrigger, [percentageTrigger, width]);
|
|
42
|
-
const _navigationState = (0, _reactNativeReanimated.useSharedValue)({
|
|
43
|
-
size: 0,
|
|
44
|
-
index: 0
|
|
45
|
-
});
|
|
46
|
-
(0, _react.useEffect)(() => {
|
|
47
|
-
(0, _reactNativeReanimated.runOnUI)(() => {
|
|
48
|
-
_navigationState.value.size = navigationState.routes.length;
|
|
49
|
-
_navigationState.value.index = navigationState.index;
|
|
50
|
-
})();
|
|
51
|
-
}, [navigationState]);
|
|
52
45
|
const panGesture = _react.default.useMemo(() => _reactNativeGestureHandler.Gesture.Pan().failOffsetY([-10, 10]).activeOffsetX([-20, 20]).onChange(event => {
|
|
53
46
|
'worklet';
|
|
54
47
|
|
|
55
|
-
scrollPosition.value = _AnimationHelper.AnimationHelper.onChange(event, scrollPosition.value, width,
|
|
48
|
+
scrollPosition.value = _AnimationHelper.AnimationHelper.onChange(event, scrollPosition.value, width, navigationStateRef.value);
|
|
56
49
|
}).onEnd(event => {
|
|
57
50
|
'worklet';
|
|
58
51
|
|
|
59
|
-
const state = _AnimationHelper.AnimationHelper.onEnd(event, minimumValueToChangeView, width,
|
|
60
|
-
|
|
61
|
-
_navigationState.value.index = state.index;
|
|
62
|
-
(0, _reactNativeReanimated.runOnJS)(navigate)(state.index);
|
|
52
|
+
const state = _AnimationHelper.AnimationHelper.onEnd(event, minimumValueToChangeView, width, navigationStateRef.value);
|
|
53
|
+
(0, _reactNativeReanimated.runOnJS)(_navigate)(state.index);
|
|
63
54
|
}), [minimumValueToChangeView, width]);
|
|
64
55
|
const scrollPositionStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => ({
|
|
65
56
|
transform: [{
|
|
66
57
|
translateX: (0, _reactNativeReanimated.interpolate)(scrollPosition.value, [-width * (navigationState.routes.length - 1), 0], [-width * (navigationState.routes.length - 1), 0], 'clamp')
|
|
67
58
|
}]
|
|
68
59
|
}));
|
|
69
|
-
const jumpTo = _react.default.useCallback(key => {
|
|
70
|
-
const newIndex = navigationState.routes.findIndex(route => route.key === key);
|
|
71
|
-
if (newIndex === -1) {
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
scrollPosition.value = _AnimationHelper.AnimationHelper.animation(-newIndex * width);
|
|
75
|
-
}, [navigationState.routes, scrollPosition, width]);
|
|
76
60
|
const chooseRender = (0, _react.useCallback)((params, useRenderScene = true) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
77
61
|
style: {
|
|
78
62
|
width
|
|
@@ -82,29 +66,25 @@ const ReanimatedTabView = exports.ReanimatedTabView = /*#__PURE__*/_react.defaul
|
|
|
82
66
|
const Routes = (0, _react.useMemo)(() => navigationState.routes.map((route, index) => {
|
|
83
67
|
if (!lazy) {
|
|
84
68
|
return chooseRender({
|
|
85
|
-
jumpTo,
|
|
86
69
|
route
|
|
87
70
|
});
|
|
88
71
|
}
|
|
89
72
|
const screen = loadedScreens.current.find(loadedScreen => loadedScreen?.key === route.key);
|
|
90
73
|
if (screen !== undefined) {
|
|
91
74
|
return chooseRender({
|
|
92
|
-
jumpTo,
|
|
93
75
|
route
|
|
94
76
|
});
|
|
95
77
|
}
|
|
96
78
|
if (navigationState.index === index) {
|
|
97
79
|
loadedScreens.current.push(route);
|
|
98
80
|
return chooseRender({
|
|
99
|
-
jumpTo,
|
|
100
81
|
route
|
|
101
82
|
});
|
|
102
83
|
}
|
|
103
84
|
return chooseRender({
|
|
104
|
-
jumpTo,
|
|
105
85
|
route
|
|
106
86
|
}, false);
|
|
107
|
-
}), [navigationState.routes, navigationState.index, lazy, chooseRender
|
|
87
|
+
}), [navigationState.routes, navigationState.index, lazy, chooseRender]);
|
|
108
88
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeGestureHandler.GestureHandlerRootView, {
|
|
109
89
|
style: defaultStyles.flex,
|
|
110
90
|
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNativeReanimated.default.View, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_reactNativeGestureHandler","_reactNativeReanimated","_useTabContext","_AnimationHelper","_jsxRuntime","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","ReanimatedTabView","exports","React","memo","LazyPlaceholder","lazy","navigationState","percentageTrigger","renderScene","renderTabBar","navigate","screenOptions","width","useWindowDimensions","loadedScreens","useRef","routes","index","
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_reactNativeGestureHandler","_reactNativeReanimated","_useTabContext","_AnimationHelper","_jsxRuntime","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","ReanimatedTabView","exports","React","memo","LazyPlaceholder","lazy","navigationState","percentageTrigger","renderScene","renderTabBar","navigate","screenOptions","width","useWindowDimensions","loadedScreens","useRef","routes","index","navigationStateRef","useSharedValue","scrollPosition","positionX","useTabContext","useEffect","value","useAnimatedReaction","interpolate","map","_","_navigate","AnimationHelper","animation","minimumValueToChangeView","useMemo","panGesture","Gesture","Pan","failOffsetY","activeOffsetX","onChange","event","onEnd","state","runOnJS","scrollPositionStyle","useAnimatedStyle","transform","translateX","length","chooseRender","useCallback","params","useRenderScene","jsx","View","style","children","route","key","Routes","screen","current","find","loadedScreen","undefined","push","GestureHandlerRootView","defaultStyles","flex","jsxs","layout","LinearTransition","GestureDetector","gesture","viewsContainer","StyleSheet","create","flexDirection"],"sourceRoot":"../../../../src","sources":["components/ReanimatedTopTab/ReanimatedTabView.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { withTiming } from 'react-native-reanimated';
|
|
3
|
+
import { runOnJS, withTiming } from 'react-native-reanimated';
|
|
4
4
|
const onChange = (event, animationValue, width, navigationState) => {
|
|
5
5
|
'worklet';
|
|
6
6
|
|
|
7
7
|
if (animationValue > 0) {
|
|
8
8
|
return 0;
|
|
9
9
|
}
|
|
10
|
-
const routesLength = navigationState.
|
|
10
|
+
const routesLength = navigationState.routes.length - 1;
|
|
11
11
|
if (animationValue < -width * routesLength) {
|
|
12
12
|
return -width * routesLength;
|
|
13
13
|
}
|
|
@@ -16,7 +16,7 @@ const onChange = (event, animationValue, width, navigationState) => {
|
|
|
16
16
|
const getIndex = (navigationState, type) => {
|
|
17
17
|
'worklet';
|
|
18
18
|
|
|
19
|
-
const max = navigationState.
|
|
19
|
+
const max = navigationState.routes.length - 1;
|
|
20
20
|
const current = navigationState.index;
|
|
21
21
|
if (type === 'increment' && current < max) {
|
|
22
22
|
return current + 1;
|
|
@@ -52,11 +52,13 @@ const onEnd = (event, minimumValueToChangeView, width, navigationState) => {
|
|
|
52
52
|
value: -width * navigationState.index
|
|
53
53
|
};
|
|
54
54
|
};
|
|
55
|
-
const animation = (newValue,
|
|
55
|
+
const animation = (newValue, onFinished) => {
|
|
56
56
|
'worklet';
|
|
57
57
|
|
|
58
58
|
return withTiming(newValue, {
|
|
59
|
-
duration
|
|
59
|
+
duration: 350
|
|
60
|
+
}, finished => {
|
|
61
|
+
if (finished && onFinished) runOnJS(onFinished)();
|
|
60
62
|
});
|
|
61
63
|
};
|
|
62
64
|
export const AnimationHelper = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["withTiming","onChange","event","animationValue","width","navigationState","routesLength","
|
|
1
|
+
{"version":3,"names":["runOnJS","withTiming","onChange","event","animationValue","width","navigationState","routesLength","routes","length","changeX","getIndex","type","max","current","index","onEnd","minimumValueToChangeView","velocityX","translationX","newIndex","value","animation","newValue","onFinished","duration","finished","AnimationHelper"],"sourceRoot":"../../../../src","sources":["components/ReanimatedTopTab/AnimationHelper.ts"],"mappings":";;AAMA,SAASA,OAAO,EAAEC,UAAU,QAAQ,yBAAyB;AAG7D,MAAMC,QAAQ,GAAGA,CACfC,KAEC,EACDC,cAAsB,EACtBC,KAAa,EACbC,eAAuD,KACpD;EACH,SAAS;;EACT,IAAIF,cAAc,GAAG,CAAC,EAAE;IACtB,OAAO,CAAC;EACV;EACA,MAAMG,YAAY,GAAGD,eAAe,CAACE,MAAM,CAACC,MAAM,GAAG,CAAC;EACtD,IAAIL,cAAc,GAAG,CAACC,KAAK,GAAGE,YAAY,EAAE;IAC1C,OAAO,CAACF,KAAK,GAAGE,YAAY;EAC9B;EACA,OAAOH,cAAc,GAAGD,KAAK,CAACO,OAAO;AACvC,CAAC;AAED,MAAMC,QAAQ,GAAGA,CACfL,eAAuD,EACvDM,IAA+B,KAC5B;EACH,SAAS;;EACT,MAAMC,GAAG,GAAGP,eAAe,CAACE,MAAM,CAACC,MAAM,GAAG,CAAC;EAC7C,MAAMK,OAAO,GAAGR,eAAe,CAACS,KAAK;EAErC,IAAIH,IAAI,KAAK,WAAW,IAAIE,OAAO,GAAGD,GAAG,EAAE;IACzC,OAAOC,OAAO,GAAG,CAAC;EACpB;EAEA,IAAIF,IAAI,KAAK,WAAW,IAAIE,OAAO,GAAG,CAAC,EAAE;IACvC,OAAOA,OAAO,GAAG,CAAC;EACpB;EAEA,OAAOA,OAAO;AAChB,CAAC;AAED,MAAME,KAAK,GAAGA,CACZb,KAA6D,EAC7Dc,wBAAgC,EAChCZ,KAAa,EACbC,eAAuD,KACpD;EACH,SAAS;;EACT,MAAM;IAAEY,SAAS;IAAEC;EAAa,CAAC,GAAGhB,KAAK;EAEzC,IAAIe,SAAS,GAAG,CAAC,GAAG,IAAIC,YAAY,GAAG,CAACF,wBAAwB,EAAE;IAChE,MAAMG,QAAQ,GAAGT,QAAQ,CAACL,eAAe,EAAE,WAAW,CAAC;IACvD,OAAO;MACLS,KAAK,EAAEK,QAAQ;MACfC,KAAK,EAAE,CAAChB,KAAK,GAAGe;IAClB,CAAC;EACH;EACA,IAAIF,SAAS,GAAG,GAAG,IAAIC,YAAY,GAAGF,wBAAwB,EAAE;IAC9D,MAAMG,QAAQ,GAAGT,QAAQ,CAACL,eAAe,EAAE,WAAW,CAAC;IACvD,OAAO;MACLS,KAAK,EAAEK,QAAQ;MACfC,KAAK,EAAE,CAAChB,KAAK,GAAGe;IAClB,CAAC;EACH;EACA,OAAO;IACLL,KAAK,EAAET,eAAe,CAACS,KAAK;IAC5BM,KAAK,EAAE,CAAChB,KAAK,GAAGC,eAAe,CAACS;EAClC,CAAC;AACH,CAAC;AAED,MAAMO,SAAS,GAAGA,CAACC,QAAgB,EAAEC,UAAuB,KAAK;EAC/D,SAAS;;EACT,OAAOvB,UAAU,CAACsB,QAAQ,EAAE;IAAEE,QAAQ,EAAE;EAAI,CAAC,EAAGC,QAAQ,IAAK;IAC3D,IAAIA,QAAQ,IAAIF,UAAU,EAAExB,OAAO,CAACwB,UAAU,CAAC,CAAC,CAAC;EACnD,CAAC,CAAC;AACJ,CAAC;AAED,OAAO,MAAMG,eAAe,GAAG;EAC7BL,SAAS;EACTpB,QAAQ;EACRc;AACF,CAAC","ignoreList":[]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import React, { useCallback, useEffect, useMemo, useRef } from 'react';
|
|
4
4
|
import { StyleSheet, useWindowDimensions, View } from 'react-native';
|
|
5
5
|
import { Gesture, GestureDetector, GestureHandlerRootView } from 'react-native-gesture-handler';
|
|
6
|
-
import Reanimated, { interpolate, LinearTransition, runOnJS,
|
|
6
|
+
import Reanimated, { interpolate, LinearTransition, runOnJS, useAnimatedReaction, useAnimatedStyle, useSharedValue } from 'react-native-reanimated';
|
|
7
7
|
import { useTabContext } from '../../hooks/useTabContext';
|
|
8
8
|
import { AnimationHelper } from './AnimationHelper';
|
|
9
9
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
@@ -21,52 +21,36 @@ export const ReanimatedTabView = /*#__PURE__*/React.memo(({
|
|
|
21
21
|
width
|
|
22
22
|
} = useWindowDimensions();
|
|
23
23
|
const loadedScreens = useRef([navigationState.routes[navigationState.index]]);
|
|
24
|
+
const navigationStateRef = useSharedValue(navigationState);
|
|
24
25
|
const scrollPosition = useSharedValue(navigationState.index);
|
|
25
26
|
const {
|
|
26
27
|
positionX
|
|
27
28
|
} = useTabContext();
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
navigationStateRef.value = navigationState;
|
|
31
|
+
}, [navigationState]);
|
|
28
32
|
useAnimatedReaction(() => scrollPosition.value, value => {
|
|
29
33
|
positionX.value = interpolate(value, navigationState.routes.map((_, i) => i * -width), navigationState.routes.map((_, i) => i), 'clamp');
|
|
30
34
|
});
|
|
31
35
|
const _navigate = index => {
|
|
32
|
-
scrollPosition.value = AnimationHelper.animation(-index * width);
|
|
33
|
-
navigate(index);
|
|
36
|
+
scrollPosition.value = AnimationHelper.animation(-index * width, () => navigate(index));
|
|
34
37
|
};
|
|
35
38
|
const minimumValueToChangeView = useMemo(() => width * percentageTrigger, [percentageTrigger, width]);
|
|
36
|
-
const _navigationState = useSharedValue({
|
|
37
|
-
size: 0,
|
|
38
|
-
index: 0
|
|
39
|
-
});
|
|
40
|
-
useEffect(() => {
|
|
41
|
-
runOnUI(() => {
|
|
42
|
-
_navigationState.value.size = navigationState.routes.length;
|
|
43
|
-
_navigationState.value.index = navigationState.index;
|
|
44
|
-
})();
|
|
45
|
-
}, [navigationState]);
|
|
46
39
|
const panGesture = React.useMemo(() => Gesture.Pan().failOffsetY([-10, 10]).activeOffsetX([-20, 20]).onChange(event => {
|
|
47
40
|
'worklet';
|
|
48
41
|
|
|
49
|
-
scrollPosition.value = AnimationHelper.onChange(event, scrollPosition.value, width,
|
|
42
|
+
scrollPosition.value = AnimationHelper.onChange(event, scrollPosition.value, width, navigationStateRef.value);
|
|
50
43
|
}).onEnd(event => {
|
|
51
44
|
'worklet';
|
|
52
45
|
|
|
53
|
-
const state = AnimationHelper.onEnd(event, minimumValueToChangeView, width,
|
|
54
|
-
|
|
55
|
-
_navigationState.value.index = state.index;
|
|
56
|
-
runOnJS(navigate)(state.index);
|
|
46
|
+
const state = AnimationHelper.onEnd(event, minimumValueToChangeView, width, navigationStateRef.value);
|
|
47
|
+
runOnJS(_navigate)(state.index);
|
|
57
48
|
}), [minimumValueToChangeView, width]);
|
|
58
49
|
const scrollPositionStyle = useAnimatedStyle(() => ({
|
|
59
50
|
transform: [{
|
|
60
51
|
translateX: interpolate(scrollPosition.value, [-width * (navigationState.routes.length - 1), 0], [-width * (navigationState.routes.length - 1), 0], 'clamp')
|
|
61
52
|
}]
|
|
62
53
|
}));
|
|
63
|
-
const jumpTo = React.useCallback(key => {
|
|
64
|
-
const newIndex = navigationState.routes.findIndex(route => route.key === key);
|
|
65
|
-
if (newIndex === -1) {
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
scrollPosition.value = AnimationHelper.animation(-newIndex * width);
|
|
69
|
-
}, [navigationState.routes, scrollPosition, width]);
|
|
70
54
|
const chooseRender = useCallback((params, useRenderScene = true) => /*#__PURE__*/_jsx(View, {
|
|
71
55
|
style: {
|
|
72
56
|
width
|
|
@@ -76,29 +60,25 @@ export const ReanimatedTabView = /*#__PURE__*/React.memo(({
|
|
|
76
60
|
const Routes = useMemo(() => navigationState.routes.map((route, index) => {
|
|
77
61
|
if (!lazy) {
|
|
78
62
|
return chooseRender({
|
|
79
|
-
jumpTo,
|
|
80
63
|
route
|
|
81
64
|
});
|
|
82
65
|
}
|
|
83
66
|
const screen = loadedScreens.current.find(loadedScreen => loadedScreen?.key === route.key);
|
|
84
67
|
if (screen !== undefined) {
|
|
85
68
|
return chooseRender({
|
|
86
|
-
jumpTo,
|
|
87
69
|
route
|
|
88
70
|
});
|
|
89
71
|
}
|
|
90
72
|
if (navigationState.index === index) {
|
|
91
73
|
loadedScreens.current.push(route);
|
|
92
74
|
return chooseRender({
|
|
93
|
-
jumpTo,
|
|
94
75
|
route
|
|
95
76
|
});
|
|
96
77
|
}
|
|
97
78
|
return chooseRender({
|
|
98
|
-
jumpTo,
|
|
99
79
|
route
|
|
100
80
|
}, false);
|
|
101
|
-
}), [navigationState.routes, navigationState.index, lazy, chooseRender
|
|
81
|
+
}), [navigationState.routes, navigationState.index, lazy, chooseRender]);
|
|
102
82
|
return /*#__PURE__*/_jsx(GestureHandlerRootView, {
|
|
103
83
|
style: defaultStyles.flex,
|
|
104
84
|
children: /*#__PURE__*/_jsxs(Reanimated.View, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useCallback","useEffect","useMemo","useRef","StyleSheet","useWindowDimensions","View","Gesture","GestureDetector","GestureHandlerRootView","Reanimated","interpolate","LinearTransition","runOnJS","
|
|
1
|
+
{"version":3,"names":["React","useCallback","useEffect","useMemo","useRef","StyleSheet","useWindowDimensions","View","Gesture","GestureDetector","GestureHandlerRootView","Reanimated","interpolate","LinearTransition","runOnJS","useAnimatedReaction","useAnimatedStyle","useSharedValue","useTabContext","AnimationHelper","jsx","_jsx","jsxs","_jsxs","ReanimatedTabView","memo","LazyPlaceholder","lazy","navigationState","percentageTrigger","renderScene","renderTabBar","navigate","screenOptions","width","loadedScreens","routes","index","navigationStateRef","scrollPosition","positionX","value","map","_","i","_navigate","animation","minimumValueToChangeView","panGesture","Pan","failOffsetY","activeOffsetX","onChange","event","onEnd","state","scrollPositionStyle","transform","translateX","length","chooseRender","params","useRenderScene","style","children","route","key","Routes","screen","current","find","loadedScreen","undefined","push","defaultStyles","flex","layout","gesture","viewsContainer","create","flexDirection"],"sourceRoot":"../../../../src","sources":["components/ReanimatedTopTab/ReanimatedTabView.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
import type { GestureStateChangeEvent, GestureUpdateEvent, PanGestureChangeEventPayload, PanGestureHandlerEventPayload } from 'react-native-gesture-handler';
|
|
2
|
-
type
|
|
3
|
-
size: number;
|
|
4
|
-
index: number;
|
|
5
|
-
};
|
|
2
|
+
import type { ReanimatedTabViewTypes } from './types';
|
|
6
3
|
export declare const AnimationHelper: {
|
|
7
|
-
animation: (newValue: number,
|
|
8
|
-
onChange: (event: GestureUpdateEvent<PanGestureHandlerEventPayload & PanGestureChangeEventPayload>, animationValue: number, width: number, navigationState: NavigationState) => number;
|
|
9
|
-
onEnd: (event: GestureStateChangeEvent<PanGestureHandlerEventPayload>, minimumValueToChangeView: number, width: number, navigationState: NavigationState) => {
|
|
4
|
+
animation: (newValue: number, onFinished?: () => void) => number;
|
|
5
|
+
onChange: (event: GestureUpdateEvent<PanGestureHandlerEventPayload & PanGestureChangeEventPayload>, animationValue: number, width: number, navigationState: ReanimatedTabViewTypes.NavigationState) => number;
|
|
6
|
+
onEnd: (event: GestureStateChangeEvent<PanGestureHandlerEventPayload>, minimumValueToChangeView: number, width: number, navigationState: ReanimatedTabViewTypes.NavigationState) => {
|
|
10
7
|
index: number;
|
|
11
8
|
value: number;
|
|
12
9
|
};
|
|
13
10
|
};
|
|
14
|
-
export {};
|
|
15
11
|
//# sourceMappingURL=AnimationHelper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnimationHelper.d.ts","sourceRoot":"","sources":["../../../../../src/components/ReanimatedTopTab/AnimationHelper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,kBAAkB,EAClB,4BAA4B,EAC5B,6BAA6B,EAC9B,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"AnimationHelper.d.ts","sourceRoot":"","sources":["../../../../../src/components/ReanimatedTopTab/AnimationHelper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,kBAAkB,EAClB,4BAA4B,EAC5B,6BAA6B,EAC9B,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AA4EtD,eAAO,MAAM,eAAe;0BAPC,MAAM,eAAe,MAAM,IAAI;sBAlEnD,kBAAkB,CACvB,6BAA6B,GAAG,4BAA4B,CAC7D,kBACe,MAAM,SACf,MAAM,mBACI,sBAAsB,CAAC,eAAe;mBAiChD,uBAAuB,CAAC,6BAA6B,CAAC,4BACnC,MAAM,SACzB,MAAM,mBACI,sBAAsB,CAAC,eAAe;;;;CAoCxD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReanimatedTabView.d.ts","sourceRoot":"","sources":["../../../../../src/components/ReanimatedTopTab/ReanimatedTabView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkD,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ReanimatedTabView.d.ts","sourceRoot":"","sources":["../../../../../src/components/ReanimatedTopTab/ReanimatedTabView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAevE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAGvF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEtD,MAAM,WAAW,sBAAsB;IACrC,eAAe,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IACxC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,eAAe,EAAE,sBAAsB,CAAC,eAAe,CAAC;IACxD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,CAAC,MAAM,EAAE,sBAAsB,CAAC,UAAU,KAAK,KAAK,CAAC,SAAS,CAAC;IAC5E,YAAY,CAAC,EAAE,CACb,MAAM,EAAE,sBAAsB,CAAC,gBAAgB,KAC5C,KAAK,CAAC,SAAS,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,CAAC,EAAE,0BAA0B,CAAC,iBAAiB,CAAC;CAC9D;AAED,eAAO,MAAM,iBAAiB,oDA+I7B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/components/ReanimatedTopTab/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAEvF,yBAAiB,sBAAsB,CAAC;IACtC,UAAiB,KAAK;QACpB,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAC;QACpD,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB;IAED,KAAY,eAAe,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,KAAK,EAAE,CAAA;KAAE,CAAC;IAEjE,UAAiB,gBAAgB;QAC/B,eAAe,EAAE,eAAe,CAAC;QACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,aAAa,CAAC,EAAE,0BAA0B,CAAC,iBAAiB,CAAC;KAC9D;IAED,UAAiB,UAAU;QACzB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/components/ReanimatedTopTab/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAEvF,yBAAiB,sBAAsB,CAAC;IACtC,UAAiB,KAAK;QACpB,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAC;QACpD,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB;IAED,KAAY,eAAe,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,KAAK,EAAE,CAAA;KAAE,CAAC;IAEjE,UAAiB,gBAAgB;QAC/B,eAAe,EAAE,eAAe,CAAC;QACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,aAAa,CAAC,EAAE,0BAA0B,CAAC,iBAAiB,CAAC;KAC9D;IAED,UAAiB,UAAU;QACzB,KAAK,EAAE,KAAK,CAAC;KACd;CACF"}
|
package/package.json
CHANGED
|
@@ -4,9 +4,8 @@ import type {
|
|
|
4
4
|
PanGestureChangeEventPayload,
|
|
5
5
|
PanGestureHandlerEventPayload,
|
|
6
6
|
} from 'react-native-gesture-handler';
|
|
7
|
-
import { withTiming } from 'react-native-reanimated';
|
|
8
|
-
|
|
9
|
-
type NavigationState = { size: number; index: number };
|
|
7
|
+
import { runOnJS, withTiming } from 'react-native-reanimated';
|
|
8
|
+
import type { ReanimatedTabViewTypes } from './types';
|
|
10
9
|
|
|
11
10
|
const onChange = (
|
|
12
11
|
event: GestureUpdateEvent<
|
|
@@ -14,13 +13,13 @@ const onChange = (
|
|
|
14
13
|
>,
|
|
15
14
|
animationValue: number,
|
|
16
15
|
width: number,
|
|
17
|
-
navigationState: NavigationState
|
|
16
|
+
navigationState: ReanimatedTabViewTypes.NavigationState
|
|
18
17
|
) => {
|
|
19
18
|
'worklet';
|
|
20
19
|
if (animationValue > 0) {
|
|
21
20
|
return 0;
|
|
22
21
|
}
|
|
23
|
-
const routesLength = navigationState.
|
|
22
|
+
const routesLength = navigationState.routes.length - 1;
|
|
24
23
|
if (animationValue < -width * routesLength) {
|
|
25
24
|
return -width * routesLength;
|
|
26
25
|
}
|
|
@@ -28,11 +27,11 @@ const onChange = (
|
|
|
28
27
|
};
|
|
29
28
|
|
|
30
29
|
const getIndex = (
|
|
31
|
-
navigationState: NavigationState,
|
|
30
|
+
navigationState: ReanimatedTabViewTypes.NavigationState,
|
|
32
31
|
type: 'increment' | 'decrement'
|
|
33
32
|
) => {
|
|
34
33
|
'worklet';
|
|
35
|
-
const max = navigationState.
|
|
34
|
+
const max = navigationState.routes.length - 1;
|
|
36
35
|
const current = navigationState.index;
|
|
37
36
|
|
|
38
37
|
if (type === 'increment' && current < max) {
|
|
@@ -50,7 +49,7 @@ const onEnd = (
|
|
|
50
49
|
event: GestureStateChangeEvent<PanGestureHandlerEventPayload>,
|
|
51
50
|
minimumValueToChangeView: number,
|
|
52
51
|
width: number,
|
|
53
|
-
navigationState: NavigationState
|
|
52
|
+
navigationState: ReanimatedTabViewTypes.NavigationState
|
|
54
53
|
) => {
|
|
55
54
|
'worklet';
|
|
56
55
|
const { velocityX, translationX } = event;
|
|
@@ -75,9 +74,11 @@ const onEnd = (
|
|
|
75
74
|
};
|
|
76
75
|
};
|
|
77
76
|
|
|
78
|
-
const animation = (newValue: number,
|
|
77
|
+
const animation = (newValue: number, onFinished?: () => void) => {
|
|
79
78
|
'worklet';
|
|
80
|
-
return withTiming(newValue, { duration })
|
|
79
|
+
return withTiming(newValue, { duration: 350 }, (finished) => {
|
|
80
|
+
if (finished && onFinished) runOnJS(onFinished)();
|
|
81
|
+
});
|
|
81
82
|
};
|
|
82
83
|
|
|
83
84
|
export const AnimationHelper = {
|
|
@@ -9,7 +9,6 @@ import Reanimated, {
|
|
|
9
9
|
interpolate,
|
|
10
10
|
LinearTransition,
|
|
11
11
|
runOnJS,
|
|
12
|
-
runOnUI,
|
|
13
12
|
useAnimatedReaction,
|
|
14
13
|
useAnimatedStyle,
|
|
15
14
|
useSharedValue,
|
|
@@ -47,9 +46,14 @@ export const ReanimatedTabView = React.memo<ReanimatedTabViewProps>(
|
|
|
47
46
|
const loadedScreens = useRef([
|
|
48
47
|
navigationState.routes[navigationState.index],
|
|
49
48
|
]);
|
|
49
|
+
const navigationStateRef = useSharedValue(navigationState);
|
|
50
50
|
const scrollPosition = useSharedValue(navigationState.index);
|
|
51
51
|
const { positionX } = useTabContext();
|
|
52
52
|
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
navigationStateRef.value = navigationState;
|
|
55
|
+
}, [navigationState]);
|
|
56
|
+
|
|
53
57
|
useAnimatedReaction(
|
|
54
58
|
() => scrollPosition.value,
|
|
55
59
|
(value) => {
|
|
@@ -63,8 +67,9 @@ export const ReanimatedTabView = React.memo<ReanimatedTabViewProps>(
|
|
|
63
67
|
);
|
|
64
68
|
|
|
65
69
|
const _navigate = (index: number) => {
|
|
66
|
-
scrollPosition.value = AnimationHelper.animation(-index * width)
|
|
67
|
-
|
|
70
|
+
scrollPosition.value = AnimationHelper.animation(-index * width, () =>
|
|
71
|
+
navigate(index)
|
|
72
|
+
);
|
|
68
73
|
};
|
|
69
74
|
|
|
70
75
|
const minimumValueToChangeView = useMemo(
|
|
@@ -72,15 +77,6 @@ export const ReanimatedTabView = React.memo<ReanimatedTabViewProps>(
|
|
|
72
77
|
[percentageTrigger, width]
|
|
73
78
|
);
|
|
74
79
|
|
|
75
|
-
const _navigationState = useSharedValue({ size: 0, index: 0 });
|
|
76
|
-
|
|
77
|
-
useEffect(() => {
|
|
78
|
-
runOnUI(() => {
|
|
79
|
-
_navigationState.value.size = navigationState.routes.length;
|
|
80
|
-
_navigationState.value.index = navigationState.index;
|
|
81
|
-
})();
|
|
82
|
-
}, [navigationState]);
|
|
83
|
-
|
|
84
80
|
const panGesture = React.useMemo(
|
|
85
81
|
() =>
|
|
86
82
|
Gesture.Pan()
|
|
@@ -92,7 +88,7 @@ export const ReanimatedTabView = React.memo<ReanimatedTabViewProps>(
|
|
|
92
88
|
event,
|
|
93
89
|
scrollPosition.value,
|
|
94
90
|
width,
|
|
95
|
-
|
|
91
|
+
navigationStateRef.value
|
|
96
92
|
);
|
|
97
93
|
})
|
|
98
94
|
.onEnd((event) => {
|
|
@@ -101,11 +97,9 @@ export const ReanimatedTabView = React.memo<ReanimatedTabViewProps>(
|
|
|
101
97
|
event,
|
|
102
98
|
minimumValueToChangeView,
|
|
103
99
|
width,
|
|
104
|
-
|
|
100
|
+
navigationStateRef.value
|
|
105
101
|
);
|
|
106
|
-
|
|
107
|
-
_navigationState.value.index = state.index;
|
|
108
|
-
runOnJS(navigate)(state.index);
|
|
102
|
+
runOnJS(_navigate)(state.index);
|
|
109
103
|
}),
|
|
110
104
|
[minimumValueToChangeView, width]
|
|
111
105
|
);
|
|
@@ -123,19 +117,6 @@ export const ReanimatedTabView = React.memo<ReanimatedTabViewProps>(
|
|
|
123
117
|
],
|
|
124
118
|
}));
|
|
125
119
|
|
|
126
|
-
const jumpTo = React.useCallback(
|
|
127
|
-
(key: string) => {
|
|
128
|
-
const newIndex = navigationState.routes.findIndex(
|
|
129
|
-
(route) => route.key === key
|
|
130
|
-
);
|
|
131
|
-
if (newIndex === -1) {
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
scrollPosition.value = AnimationHelper.animation(-newIndex * width);
|
|
135
|
-
},
|
|
136
|
-
[navigationState.routes, scrollPosition, width]
|
|
137
|
-
);
|
|
138
|
-
|
|
139
120
|
const chooseRender = useCallback(
|
|
140
121
|
(params: ReanimatedTabViewTypes.SceneProps, useRenderScene = true) => (
|
|
141
122
|
<View key={`RNNTabView_${params.route.key}`} style={{ width }}>
|
|
@@ -149,27 +130,21 @@ export const ReanimatedTabView = React.memo<ReanimatedTabViewProps>(
|
|
|
149
130
|
() =>
|
|
150
131
|
navigationState.routes.map((route, index) => {
|
|
151
132
|
if (!lazy) {
|
|
152
|
-
return chooseRender({
|
|
133
|
+
return chooseRender({ route });
|
|
153
134
|
}
|
|
154
135
|
const screen = loadedScreens.current.find(
|
|
155
136
|
(loadedScreen) => loadedScreen?.key === route.key
|
|
156
137
|
);
|
|
157
138
|
if (screen !== undefined) {
|
|
158
|
-
return chooseRender({
|
|
139
|
+
return chooseRender({ route });
|
|
159
140
|
}
|
|
160
141
|
if (navigationState.index === index) {
|
|
161
142
|
loadedScreens.current.push(route);
|
|
162
|
-
return chooseRender({
|
|
143
|
+
return chooseRender({ route });
|
|
163
144
|
}
|
|
164
|
-
return chooseRender({
|
|
145
|
+
return chooseRender({ route }, false);
|
|
165
146
|
}),
|
|
166
|
-
[
|
|
167
|
-
navigationState.routes,
|
|
168
|
-
navigationState.index,
|
|
169
|
-
lazy,
|
|
170
|
-
chooseRender,
|
|
171
|
-
jumpTo,
|
|
172
|
-
]
|
|
147
|
+
[navigationState.routes, navigationState.index, lazy, chooseRender]
|
|
173
148
|
);
|
|
174
149
|
|
|
175
150
|
return (
|