react-native-dates-picker 0.1.4 → 0.1.6
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/WheelPicker/WheelNativePicker/wheel-picker.js +36 -9
- package/lib/commonjs/components/WheelPicker/WheelNativePicker/wheel-picker.js.map +1 -1
- package/lib/module/components/WheelPicker/WheelNativePicker/wheel-picker.js +36 -9
- package/lib/module/components/WheelPicker/WheelNativePicker/wheel-picker.js.map +1 -1
- package/lib/typescript/components/WheelPicker/WheelNativePicker/wheel-picker.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/WheelPicker/WheelNativePicker/wheel-picker.tsx +39 -8
|
@@ -27,8 +27,8 @@ const WheelPicker = ({
|
|
|
27
27
|
const {
|
|
28
28
|
theme
|
|
29
29
|
} = (0, _CalendarContext.useCalendarContext)();
|
|
30
|
+
const momentumStarted = (0, _react.useRef)(false);
|
|
30
31
|
const selectedIndex = options.findIndex(item => item.value === value);
|
|
31
|
-
const timerRef = (0, _react.useRef)();
|
|
32
32
|
const flatListRef = (0, _react.useRef)(null);
|
|
33
33
|
const [scrollY] = (0, _react.useState)(new _reactNative.Animated.Value(selectedIndex * itemHeight));
|
|
34
34
|
const containerHeight = (1 + visibleRest * 2) * itemHeight;
|
|
@@ -44,7 +44,6 @@ const WheelPicker = ({
|
|
|
44
44
|
const currentScrollIndex = (0, _react.useMemo)(() => _reactNative.Animated.add(_reactNative.Animated.divide(scrollY, itemHeight), visibleRest), [visibleRest, scrollY, itemHeight]);
|
|
45
45
|
const handleScrollEnd = event => {
|
|
46
46
|
var _options$index;
|
|
47
|
-
if (timerRef.current) clearTimeout(timerRef.current);
|
|
48
47
|
const offsetY = Math.min(itemHeight * (options.length - 1), Math.max(event.nativeEvent.contentOffset.y, 0));
|
|
49
48
|
let index = Math.floor(offsetY / itemHeight);
|
|
50
49
|
const remainder = offsetY % itemHeight;
|
|
@@ -53,13 +52,38 @@ const WheelPicker = ({
|
|
|
53
52
|
}
|
|
54
53
|
const value = ((_options$index = options[index]) === null || _options$index === void 0 ? void 0 : _options$index.value) || 0;
|
|
55
54
|
if (index !== selectedIndex) {
|
|
56
|
-
|
|
57
|
-
onChange(value);
|
|
58
|
-
clearTimeout(timerRef.current);
|
|
59
|
-
timerRef.current = undefined;
|
|
60
|
-
}, 100);
|
|
55
|
+
onChange(value);
|
|
61
56
|
}
|
|
62
57
|
};
|
|
58
|
+
const handleMomentumScrollBegin = () => {
|
|
59
|
+
momentumStarted.current = true;
|
|
60
|
+
};
|
|
61
|
+
const handleMomentumScrollEnd = event => {
|
|
62
|
+
momentumStarted.current = false;
|
|
63
|
+
handleScrollEnd(event);
|
|
64
|
+
};
|
|
65
|
+
const handleScrollEndDrag = event => {
|
|
66
|
+
var _event$nativeEvent$co;
|
|
67
|
+
// Capture the offset value immediately
|
|
68
|
+
const offsetY = (_event$nativeEvent$co = event.nativeEvent.contentOffset) === null || _event$nativeEvent$co === void 0 ? void 0 : _event$nativeEvent$co.y;
|
|
69
|
+
|
|
70
|
+
// We'll start a short timer to see if momentum scroll begins
|
|
71
|
+
setTimeout(() => {
|
|
72
|
+
// If momentum scroll hasn't started within the timeout,
|
|
73
|
+
// then it was a slow scroll that won't trigger momentum
|
|
74
|
+
if (!momentumStarted.current && offsetY !== undefined) {
|
|
75
|
+
// Create a synthetic event with just the data we need
|
|
76
|
+
const syntheticEvent = {
|
|
77
|
+
nativeEvent: {
|
|
78
|
+
contentOffset: {
|
|
79
|
+
y: offsetY
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
handleScrollEnd(syntheticEvent);
|
|
84
|
+
}
|
|
85
|
+
}, 50);
|
|
86
|
+
};
|
|
63
87
|
const scrollEvent = (0, _react.useMemo)(() => _reactNative.Animated.event([{
|
|
64
88
|
nativeEvent: {
|
|
65
89
|
contentOffset: {
|
|
@@ -67,8 +91,7 @@ const WheelPicker = ({
|
|
|
67
91
|
}
|
|
68
92
|
}
|
|
69
93
|
}], {
|
|
70
|
-
useNativeDriver: true
|
|
71
|
-
listener: handleScrollEnd
|
|
94
|
+
useNativeDriver: true
|
|
72
95
|
}),
|
|
73
96
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
74
97
|
[]);
|
|
@@ -108,6 +131,9 @@ const WheelPicker = ({
|
|
|
108
131
|
scrollEventThrottle: 16,
|
|
109
132
|
onScroll: scrollEvent,
|
|
110
133
|
snapToOffsets: offsets,
|
|
134
|
+
onScrollEndDrag: handleScrollEndDrag,
|
|
135
|
+
onMomentumScrollBegin: handleMomentumScrollBegin,
|
|
136
|
+
onMomentumScrollEnd: handleMomentumScrollEnd,
|
|
111
137
|
decelerationRate: decelerationRate,
|
|
112
138
|
initialScrollIndex: selectedIndex,
|
|
113
139
|
getItemLayout: (_, index) => ({
|
|
@@ -115,6 +141,7 @@ const WheelPicker = ({
|
|
|
115
141
|
offset: itemHeight * index,
|
|
116
142
|
index
|
|
117
143
|
}),
|
|
144
|
+
maxToRenderPerBatch: 20,
|
|
118
145
|
data: paddedOptions,
|
|
119
146
|
keyExtractor: (item, index) => item ? `${item.value}-${item.text}-${index}` : `-${index}`,
|
|
120
147
|
renderItem: ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_wheelPickerItem","_interopRequireDefault","_CalendarContext","obj","__esModule","default","_getRequireWildcardCache","e","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","_extends","assign","bind","target","arguments","length","source","key","apply","WheelPicker","value","options","onChange","itemHeight","scaleFunction","x","rotationFunction","Math","pow","opacityFunction","visibleRest","decelerationRate","containerProps","theme","useCalendarContext","
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_wheelPickerItem","_interopRequireDefault","_CalendarContext","obj","__esModule","default","_getRequireWildcardCache","e","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","_extends","assign","bind","target","arguments","length","source","key","apply","WheelPicker","value","options","onChange","itemHeight","scaleFunction","x","rotationFunction","Math","pow","opacityFunction","visibleRest","decelerationRate","containerProps","theme","useCalendarContext","momentumStarted","useRef","selectedIndex","findIndex","item","flatListRef","scrollY","useState","Animated","Value","containerHeight","paddedOptions","useMemo","array","unshift","push","offsets","Array","map","_","currentScrollIndex","add","divide","handleScrollEnd","event","_options$index","offsetY","min","max","nativeEvent","contentOffset","y","index","floor","remainder","handleMomentumScrollBegin","current","handleMomentumScrollEnd","handleScrollEndDrag","_event$nativeEvent$co","setTimeout","undefined","syntheticEvent","scrollEvent","useNativeDriver","useEffect","Error","_flatListRef$current","scrollToIndex","animated","Platform","OS","createElement","View","style","styles","container","height","wheelPickerContainerStyle","selectedIndicator","transform","translateY","wheelPickerSelectedIndicatorStyle","FlatList","ref","nestedScrollEnabled","scrollView","showsVerticalScrollIndicator","scrollEventThrottle","onScroll","snapToOffsets","onScrollEndDrag","onMomentumScrollBegin","onMomentumScrollEnd","initialScrollIndex","getItemLayout","offset","maxToRenderPerBatch","data","keyExtractor","text","renderItem","option","StyleSheet","create","display","position","width","top","overflow","flex","_default","exports","memo"],"sourceRoot":"../../../../../src","sources":["components/WheelPicker/WheelNativePicker/wheel-picker.tsx"],"mappings":"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"}
|
|
@@ -18,8 +18,8 @@ const WheelPicker = ({
|
|
|
18
18
|
const {
|
|
19
19
|
theme
|
|
20
20
|
} = useCalendarContext();
|
|
21
|
+
const momentumStarted = useRef(false);
|
|
21
22
|
const selectedIndex = options.findIndex(item => item.value === value);
|
|
22
|
-
const timerRef = useRef();
|
|
23
23
|
const flatListRef = useRef(null);
|
|
24
24
|
const [scrollY] = useState(new Animated.Value(selectedIndex * itemHeight));
|
|
25
25
|
const containerHeight = (1 + visibleRest * 2) * itemHeight;
|
|
@@ -35,7 +35,6 @@ const WheelPicker = ({
|
|
|
35
35
|
const currentScrollIndex = useMemo(() => Animated.add(Animated.divide(scrollY, itemHeight), visibleRest), [visibleRest, scrollY, itemHeight]);
|
|
36
36
|
const handleScrollEnd = event => {
|
|
37
37
|
var _options$index;
|
|
38
|
-
if (timerRef.current) clearTimeout(timerRef.current);
|
|
39
38
|
const offsetY = Math.min(itemHeight * (options.length - 1), Math.max(event.nativeEvent.contentOffset.y, 0));
|
|
40
39
|
let index = Math.floor(offsetY / itemHeight);
|
|
41
40
|
const remainder = offsetY % itemHeight;
|
|
@@ -44,13 +43,38 @@ const WheelPicker = ({
|
|
|
44
43
|
}
|
|
45
44
|
const value = ((_options$index = options[index]) === null || _options$index === void 0 ? void 0 : _options$index.value) || 0;
|
|
46
45
|
if (index !== selectedIndex) {
|
|
47
|
-
|
|
48
|
-
onChange(value);
|
|
49
|
-
clearTimeout(timerRef.current);
|
|
50
|
-
timerRef.current = undefined;
|
|
51
|
-
}, 100);
|
|
46
|
+
onChange(value);
|
|
52
47
|
}
|
|
53
48
|
};
|
|
49
|
+
const handleMomentumScrollBegin = () => {
|
|
50
|
+
momentumStarted.current = true;
|
|
51
|
+
};
|
|
52
|
+
const handleMomentumScrollEnd = event => {
|
|
53
|
+
momentumStarted.current = false;
|
|
54
|
+
handleScrollEnd(event);
|
|
55
|
+
};
|
|
56
|
+
const handleScrollEndDrag = event => {
|
|
57
|
+
var _event$nativeEvent$co;
|
|
58
|
+
// Capture the offset value immediately
|
|
59
|
+
const offsetY = (_event$nativeEvent$co = event.nativeEvent.contentOffset) === null || _event$nativeEvent$co === void 0 ? void 0 : _event$nativeEvent$co.y;
|
|
60
|
+
|
|
61
|
+
// We'll start a short timer to see if momentum scroll begins
|
|
62
|
+
setTimeout(() => {
|
|
63
|
+
// If momentum scroll hasn't started within the timeout,
|
|
64
|
+
// then it was a slow scroll that won't trigger momentum
|
|
65
|
+
if (!momentumStarted.current && offsetY !== undefined) {
|
|
66
|
+
// Create a synthetic event with just the data we need
|
|
67
|
+
const syntheticEvent = {
|
|
68
|
+
nativeEvent: {
|
|
69
|
+
contentOffset: {
|
|
70
|
+
y: offsetY
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
handleScrollEnd(syntheticEvent);
|
|
75
|
+
}
|
|
76
|
+
}, 50);
|
|
77
|
+
};
|
|
54
78
|
const scrollEvent = useMemo(() => Animated.event([{
|
|
55
79
|
nativeEvent: {
|
|
56
80
|
contentOffset: {
|
|
@@ -58,8 +82,7 @@ const WheelPicker = ({
|
|
|
58
82
|
}
|
|
59
83
|
}
|
|
60
84
|
}], {
|
|
61
|
-
useNativeDriver: true
|
|
62
|
-
listener: handleScrollEnd
|
|
85
|
+
useNativeDriver: true
|
|
63
86
|
}),
|
|
64
87
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
65
88
|
[]);
|
|
@@ -99,6 +122,9 @@ const WheelPicker = ({
|
|
|
99
122
|
scrollEventThrottle: 16,
|
|
100
123
|
onScroll: scrollEvent,
|
|
101
124
|
snapToOffsets: offsets,
|
|
125
|
+
onScrollEndDrag: handleScrollEndDrag,
|
|
126
|
+
onMomentumScrollBegin: handleMomentumScrollBegin,
|
|
127
|
+
onMomentumScrollEnd: handleMomentumScrollEnd,
|
|
102
128
|
decelerationRate: decelerationRate,
|
|
103
129
|
initialScrollIndex: selectedIndex,
|
|
104
130
|
getItemLayout: (_, index) => ({
|
|
@@ -106,6 +132,7 @@ const WheelPicker = ({
|
|
|
106
132
|
offset: itemHeight * index,
|
|
107
133
|
index
|
|
108
134
|
}),
|
|
135
|
+
maxToRenderPerBatch: 20,
|
|
109
136
|
data: paddedOptions,
|
|
110
137
|
keyExtractor: (item, index) => item ? `${item.value}-${item.text}-${index}` : `-${index}`,
|
|
111
138
|
renderItem: ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useEffect","useMemo","useRef","useState","memo","Animated","View","Platform","StyleSheet","WheelPickerItem","useCalendarContext","WheelPicker","value","options","onChange","itemHeight","scaleFunction","x","rotationFunction","Math","pow","opacityFunction","visibleRest","decelerationRate","containerProps","theme","selectedIndex","findIndex","item","
|
|
1
|
+
{"version":3,"names":["React","useEffect","useMemo","useRef","useState","memo","Animated","View","Platform","StyleSheet","WheelPickerItem","useCalendarContext","WheelPicker","value","options","onChange","itemHeight","scaleFunction","x","rotationFunction","Math","pow","opacityFunction","visibleRest","decelerationRate","containerProps","theme","momentumStarted","selectedIndex","findIndex","item","flatListRef","scrollY","Value","containerHeight","paddedOptions","array","i","unshift","push","offsets","Array","length","map","_","currentScrollIndex","add","divide","handleScrollEnd","event","_options$index","offsetY","min","max","nativeEvent","contentOffset","y","index","floor","remainder","handleMomentumScrollBegin","current","handleMomentumScrollEnd","handleScrollEndDrag","_event$nativeEvent$co","setTimeout","undefined","syntheticEvent","scrollEvent","useNativeDriver","Error","_flatListRef$current","scrollToIndex","animated","OS","createElement","_extends","style","styles","container","height","wheelPickerContainerStyle","selectedIndicator","transform","translateY","wheelPickerSelectedIndicatorStyle","FlatList","ref","nestedScrollEnabled","scrollView","showsVerticalScrollIndicator","scrollEventThrottle","onScroll","snapToOffsets","onScrollEndDrag","onMomentumScrollBegin","onMomentumScrollEnd","initialScrollIndex","getItemLayout","offset","maxToRenderPerBatch","data","keyExtractor","text","renderItem","option","key","create","display","position","width","top","overflow","flex"],"sourceRoot":"../../../../../src","sources":["components/WheelPicker/WheelNativePicker/wheel-picker.tsx"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wheel-picker.d.ts","sourceRoot":"","sources":["../../../../../src/components/WheelPicker/WheelNativePicker/wheel-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqD,MAAM,OAAO,CAAC;AAC1E,OAAO,EAKL,SAAS,EAIV,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC1C,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACtC,gBAAgB,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzC,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;CAC/C;;
|
|
1
|
+
{"version":3,"file":"wheel-picker.d.ts","sourceRoot":"","sources":["../../../../../src/components/WheelPicker/WheelNativePicker/wheel-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqD,MAAM,OAAO,CAAC;AAC1E,OAAO,EAKL,SAAS,EAIV,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC1C,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACtC,gBAAgB,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzC,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;CAC/C;;AAoMD,wBAAiC"}
|
package/package.json
CHANGED
|
@@ -39,8 +39,8 @@ const WheelPicker: React.FC<Props> = ({
|
|
|
39
39
|
containerProps = {},
|
|
40
40
|
}) => {
|
|
41
41
|
const { theme } = useCalendarContext();
|
|
42
|
+
const momentumStarted = useRef(false);
|
|
42
43
|
const selectedIndex = options.findIndex((item) => item.value === value);
|
|
43
|
-
const timerRef = useRef<NodeJS.Timeout>();
|
|
44
44
|
|
|
45
45
|
const flatListRef = useRef<FlatList>(null);
|
|
46
46
|
const [scrollY] = useState(new Animated.Value(selectedIndex * itemHeight));
|
|
@@ -66,7 +66,6 @@ const WheelPicker: React.FC<Props> = ({
|
|
|
66
66
|
);
|
|
67
67
|
|
|
68
68
|
const handleScrollEnd = (event: NativeSyntheticEvent<NativeScrollEvent>) => {
|
|
69
|
-
if (timerRef.current) clearTimeout(timerRef.current);
|
|
70
69
|
const offsetY = Math.min(
|
|
71
70
|
itemHeight * (options.length - 1),
|
|
72
71
|
Math.max(event.nativeEvent.contentOffset.y, 0)
|
|
@@ -78,19 +77,47 @@ const WheelPicker: React.FC<Props> = ({
|
|
|
78
77
|
}
|
|
79
78
|
const value = options[index]?.value || 0;
|
|
80
79
|
if (index !== selectedIndex) {
|
|
81
|
-
|
|
82
|
-
onChange(value);
|
|
83
|
-
clearTimeout(timerRef.current!);
|
|
84
|
-
timerRef.current = undefined;
|
|
85
|
-
}, 100);
|
|
80
|
+
onChange(value);
|
|
86
81
|
}
|
|
87
82
|
};
|
|
88
83
|
|
|
84
|
+
const handleMomentumScrollBegin = () => {
|
|
85
|
+
momentumStarted.current = true;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
const handleMomentumScrollEnd = (
|
|
89
|
+
event: NativeSyntheticEvent<NativeScrollEvent>
|
|
90
|
+
) => {
|
|
91
|
+
momentumStarted.current = false;
|
|
92
|
+
handleScrollEnd(event);
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const handleScrollEndDrag = (
|
|
96
|
+
event: NativeSyntheticEvent<NativeScrollEvent>
|
|
97
|
+
) => {
|
|
98
|
+
// Capture the offset value immediately
|
|
99
|
+
const offsetY = event.nativeEvent.contentOffset?.y;
|
|
100
|
+
|
|
101
|
+
// We'll start a short timer to see if momentum scroll begins
|
|
102
|
+
setTimeout(() => {
|
|
103
|
+
// If momentum scroll hasn't started within the timeout,
|
|
104
|
+
// then it was a slow scroll that won't trigger momentum
|
|
105
|
+
if (!momentumStarted.current && offsetY !== undefined) {
|
|
106
|
+
// Create a synthetic event with just the data we need
|
|
107
|
+
const syntheticEvent = {
|
|
108
|
+
nativeEvent: {
|
|
109
|
+
contentOffset: { y: offsetY },
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
handleScrollEnd(syntheticEvent as any);
|
|
113
|
+
}
|
|
114
|
+
}, 50);
|
|
115
|
+
};
|
|
116
|
+
|
|
89
117
|
const scrollEvent = useMemo(
|
|
90
118
|
() =>
|
|
91
119
|
Animated.event([{ nativeEvent: { contentOffset: { y: scrollY } } }], {
|
|
92
120
|
useNativeDriver: true,
|
|
93
|
-
listener: handleScrollEnd,
|
|
94
121
|
}),
|
|
95
122
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
96
123
|
[]
|
|
@@ -144,6 +171,9 @@ const WheelPicker: React.FC<Props> = ({
|
|
|
144
171
|
scrollEventThrottle={16}
|
|
145
172
|
onScroll={scrollEvent}
|
|
146
173
|
snapToOffsets={offsets}
|
|
174
|
+
onScrollEndDrag={handleScrollEndDrag}
|
|
175
|
+
onMomentumScrollBegin={handleMomentumScrollBegin}
|
|
176
|
+
onMomentumScrollEnd={handleMomentumScrollEnd}
|
|
147
177
|
decelerationRate={decelerationRate}
|
|
148
178
|
initialScrollIndex={selectedIndex}
|
|
149
179
|
getItemLayout={(_, index) => ({
|
|
@@ -151,6 +181,7 @@ const WheelPicker: React.FC<Props> = ({
|
|
|
151
181
|
offset: itemHeight * index,
|
|
152
182
|
index,
|
|
153
183
|
})}
|
|
184
|
+
maxToRenderPerBatch={20}
|
|
154
185
|
data={paddedOptions}
|
|
155
186
|
keyExtractor={(item, index) =>
|
|
156
187
|
item ? `${item.value}-${item.text}-${index}` : `-${index}`
|