react-native-timer-picker 1.10.1 → 1.10.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +13 -0
  2. package/dist/commonjs/components/DurationScroll/index.js +108 -73
  3. package/dist/commonjs/components/DurationScroll/index.js.map +1 -1
  4. package/dist/commonjs/components/DurationScroll/types.js.map +1 -1
  5. package/dist/commonjs/components/TimerPicker/index.js +26 -11
  6. package/dist/commonjs/components/TimerPicker/index.js.map +1 -1
  7. package/dist/commonjs/components/TimerPicker/types.js.map +1 -1
  8. package/dist/commonjs/utils/generateNumbers.js +3 -3
  9. package/dist/commonjs/utils/generateNumbers.js.map +1 -1
  10. package/dist/commonjs/utils/getAdjustedLimit.js +4 -3
  11. package/dist/commonjs/utils/getAdjustedLimit.js.map +1 -1
  12. package/dist/commonjs/utils/getDurationAndIndexFromScrollOffset.js +23 -0
  13. package/dist/commonjs/utils/getDurationAndIndexFromScrollOffset.js.map +1 -0
  14. package/dist/commonjs/utils/getInitialScrollIndex.js +18 -0
  15. package/dist/commonjs/utils/getInitialScrollIndex.js.map +1 -0
  16. package/dist/module/components/DurationScroll/index.js +109 -74
  17. package/dist/module/components/DurationScroll/index.js.map +1 -1
  18. package/dist/module/components/DurationScroll/types.js.map +1 -1
  19. package/dist/module/components/TimerPicker/index.js +26 -11
  20. package/dist/module/components/TimerPicker/index.js.map +1 -1
  21. package/dist/module/components/TimerPicker/types.js.map +1 -1
  22. package/dist/module/utils/generateNumbers.js +3 -3
  23. package/dist/module/utils/generateNumbers.js.map +1 -1
  24. package/dist/module/utils/getAdjustedLimit.js +4 -3
  25. package/dist/module/utils/getAdjustedLimit.js.map +1 -1
  26. package/dist/module/utils/getDurationAndIndexFromScrollOffset.js +16 -0
  27. package/dist/module/utils/getDurationAndIndexFromScrollOffset.js.map +1 -0
  28. package/dist/module/utils/getInitialScrollIndex.js +11 -0
  29. package/dist/module/utils/getInitialScrollIndex.js.map +1 -0
  30. package/dist/typescript/components/DurationScroll/types.d.ts +1 -0
  31. package/dist/typescript/components/TimerPicker/types.d.ts +3 -0
  32. package/dist/typescript/utils/generateNumbers.d.ts +1 -1
  33. package/dist/typescript/utils/getDurationAndIndexFromScrollOffset.d.ts +10 -0
  34. package/dist/typescript/utils/getInitialScrollIndex.d.ts +7 -0
  35. package/package.json +1 -1
  36. package/dist/commonjs/utils/getScrollIndex.js +0 -17
  37. package/dist/commonjs/utils/getScrollIndex.js.map +0 -1
  38. package/dist/module/utils/getScrollIndex.js +0 -10
  39. package/dist/module/utils/getScrollIndex.js.map +0 -1
  40. package/dist/typescript/utils/getScrollIndex.d.ts +0 -6
package/README.md CHANGED
@@ -27,6 +27,7 @@ Includes iOS-style haptic and audio feedback 🍏
27
27
  - [Props 💅](#props-)
28
28
  - [TimerPicker ⏲️](#timerpicker-️)
29
29
  - [Custom Styles 👗](#custom-styles-)
30
+ - [Performance](#performance)
30
31
  - [Custom FlatList](#custom-flatlist)
31
32
  - [TimerPickerModal ⏰](#timerpickermodal-)
32
33
  - [Custom Styles 👕](#custom-styles--1)
@@ -448,6 +449,9 @@ return (
448
449
  | use12HourPicker | Switch the hour picker to 12-hour format with an AM / PM label | Boolean | false | false |
449
450
  | amLabel | Set the AM label if using the 12-hour picker | String | am | false |
450
451
  | pmLabel | Set the PM label if using the 12-hour picker | String | pm | false |
452
+ | repeatHourNumbersNTimes | Set the number of times the list of hours is repeated in the picker | Number | 7 | false |
453
+ | repeatMinuteNumbersNTimes | Set the number of times the list of minutes is repeated in the picker | Number | 3 | false |
454
+ | repeatSecondNumbersNTimes | Set the number of times the list of seconds is repeated in the picker | Number | 3 | false |
451
455
  | disableInfiniteScroll | Disable the infinite scroll feature | Boolean | false | false |
452
456
  | LinearGradient | Linear Gradient Component | [expo-linear-gradient](https://www.npmjs.com/package/expo-linear-gradient).LinearGradient or [react-native-linear-gradient](https://www.npmjs.com/package/react-native-linear-gradient).default | - | false |
453
457
  | Haptics | Haptics Namespace (required for Haptic feedback) | [expo-haptics](https://www.npmjs.com/package/expo-haptics) | - | false |
@@ -483,6 +487,15 @@ The following custom styles can be supplied to re-style the component in any way
483
487
  Note the minor limitations to the allowed styles for `pickerContainer` and `pickerItemContainer`. These are made because these styles are used for internal calculations and all possible `backgroundColor`/`height` types are not supported.
484
488
 
485
489
 
490
+ #### Performance
491
+
492
+ When the `disableInfiniteScroll` prop is not set, the picker gives the appearance of an infinitely scrolling picker by auto-scrolling forward/back when you near the start/end of the list. When the picker auto-scrolls, a momentary flicker is visible if you are scrolling very slowly.
493
+
494
+ To mitigate for this, you can modify the `repeatHourNumbersNTimes`, `repeatMinuteNumbersNTimes` and `repeatSecondNumbersNTimes` props. These set the number of times the list of numbers in each picker is repeated. These have a performance trade-off: higher values mean the picker has to auto-scroll less to maintain the infinite scroll, but has to render a longer list of numbers. By default, the props are set to 7, 3 and 3, respectively, which balances that trade-off effectively.
495
+
496
+ Note that you can avoid the auto-scroll flickering entirely by disabling infinite scroll. You could then set the above props to high values, so that a user has to scroll far down/up the list to reach the end of the list.
497
+
498
+
486
499
  #### Custom FlatList
487
500
 
488
501
  The library offers the ability to provide a custom component for the `<FlatList />`, instead of the default React Native component. This allows for more flexibility and integration with libraries like [react-native-gesture-handler](react-native-gesture-handler) or other components built on top of it, like [https://ui.gorhom.dev/components/bottom-sheet](https://ui.gorhom.dev/components/bottom-sheet).
@@ -9,7 +9,8 @@ var _reactNative = require("react-native");
9
9
  var _colorToRgba = require("../../utils/colorToRgba");
10
10
  var _generateNumbers = require("../../utils/generateNumbers");
11
11
  var _getAdjustedLimit = require("../../utils/getAdjustedLimit");
12
- var _getScrollIndex = require("../../utils/getScrollIndex");
12
+ var _getDurationAndIndexFromScrollOffset = require("../../utils/getDurationAndIndexFromScrollOffset");
13
+ var _getInitialScrollIndex = require("../../utils/getInitialScrollIndex");
13
14
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
14
15
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
15
16
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
@@ -36,29 +37,44 @@ const DurationScroll = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
36
37
  padWithNItems,
37
38
  pickerGradientOverlayProps,
38
39
  pmLabel,
40
+ repeatNumbersNTimes = 3,
39
41
  styles,
40
42
  testID,
41
43
  topPickerGradientOverlayProps
42
44
  } = props;
43
- const data = !is12HourPicker ? (0, _generateNumbers.generateNumbers)(numberOfItems, {
44
- padNumbersWithZero,
45
- repeatNTimes: 3,
46
- disableInfiniteScroll,
47
- padWithNItems
48
- }) : (0, _generateNumbers.generate12HourNumbers)({
49
- padNumbersWithZero,
50
- repeatNTimes: 3,
45
+ const safeRepeatNumbersNTimes = (0, _react.useMemo)(() => {
46
+ if (!disableInfiniteScroll && repeatNumbersNTimes < 2) {
47
+ return 2;
48
+ } else if (repeatNumbersNTimes < 1) {
49
+ return 1;
50
+ }
51
+ return Math.round(repeatNumbersNTimes);
52
+ }, [disableInfiniteScroll, repeatNumbersNTimes]);
53
+ const numbersForFlatList = (0, _react.useMemo)(() => {
54
+ if (is12HourPicker) {
55
+ return (0, _generateNumbers.generate12HourNumbers)({
56
+ padNumbersWithZero,
57
+ repeatNTimes: safeRepeatNumbersNTimes,
58
+ disableInfiniteScroll,
59
+ padWithNItems
60
+ });
61
+ }
62
+ return (0, _generateNumbers.generateNumbers)(numberOfItems, {
63
+ padNumbersWithZero,
64
+ repeatNTimes: safeRepeatNumbersNTimes,
65
+ disableInfiniteScroll,
66
+ padWithNItems
67
+ });
68
+ }, [disableInfiniteScroll, is12HourPicker, numberOfItems, padNumbersWithZero, padWithNItems, safeRepeatNumbersNTimes]);
69
+ const initialScrollIndex = (0, _react.useMemo)(() => (0, _getInitialScrollIndex.getInitialScrollIndex)({
51
70
  disableInfiniteScroll,
52
- padWithNItems
53
- });
54
- const numberOfItemsToShow = 1 + padWithNItems * 2;
55
- const adjustedLimited = (0, _getAdjustedLimit.getAdjustedLimit)(limit, numberOfItems);
56
- const initialScrollIndex = (0, _getScrollIndex.getScrollIndex)({
57
- value: initialValue,
58
71
  numberOfItems,
59
72
  padWithNItems,
60
- disableInfiniteScroll
61
- });
73
+ repeatNumbersNTimes: safeRepeatNumbersNTimes,
74
+ value: initialValue
75
+ }), [disableInfiniteScroll, initialValue, numberOfItems, padWithNItems, safeRepeatNumbersNTimes]);
76
+ const adjustedLimited = (0, _react.useMemo)(() => (0, _getAdjustedLimit.getAdjustedLimit)(limit, numberOfItems), [limit, numberOfItems]);
77
+ const numberOfItemsToShow = 1 + padWithNItems * 2;
62
78
 
63
79
  // keep track of the latest duration as it scrolls
64
80
  const latestDuration = (0, _react.useRef)(0);
@@ -91,28 +107,6 @@ const DurationScroll = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
91
107
  };
92
108
  // eslint-disable-next-line react-hooks/exhaustive-deps
93
109
  }, [Audio]);
94
- (0, _react.useImperativeHandle)(ref, () => ({
95
- reset: options => {
96
- var _flatListRef$current;
97
- (_flatListRef$current = flatListRef.current) === null || _flatListRef$current === void 0 || _flatListRef$current.scrollToIndex({
98
- animated: (options === null || options === void 0 ? void 0 : options.animated) ?? false,
99
- index: initialScrollIndex
100
- });
101
- },
102
- setValue: (value, options) => {
103
- var _flatListRef$current2;
104
- (_flatListRef$current2 = flatListRef.current) === null || _flatListRef$current2 === void 0 || _flatListRef$current2.scrollToIndex({
105
- animated: (options === null || options === void 0 ? void 0 : options.animated) ?? false,
106
- index: (0, _getScrollIndex.getScrollIndex)({
107
- value: value,
108
- numberOfItems,
109
- padWithNItems,
110
- disableInfiniteScroll
111
- })
112
- });
113
- },
114
- latestDuration: latestDuration
115
- }));
116
110
  const renderItem = (0, _react.useCallback)(({
117
111
  item
118
112
  }) => {
@@ -149,16 +143,21 @@ const DurationScroll = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
149
143
  return;
150
144
  }
151
145
  if (aggressivelyGetLatestDuration) {
152
- const newIndex = Math.round(e.nativeEvent.contentOffset.y / styles.pickerItemContainer.height);
153
- let newDuration = (disableInfiniteScroll ? newIndex : newIndex + padWithNItems) % (numberOfItems + 1);
154
- if (newDuration !== latestDuration.current) {
146
+ const newValues = (0, _getDurationAndIndexFromScrollOffset.getDurationAndIndexFromScrollOffset)({
147
+ disableInfiniteScroll,
148
+ itemHeight: styles.pickerItemContainer.height,
149
+ numberOfItems,
150
+ padWithNItems,
151
+ yContentOffset: e.nativeEvent.contentOffset.y
152
+ });
153
+ if (newValues.duration !== latestDuration.current) {
155
154
  // check limits
156
- if (newDuration > adjustedLimited.max) {
157
- newDuration = adjustedLimited.max;
158
- } else if (newDuration < adjustedLimited.min) {
159
- newDuration = adjustedLimited.min;
155
+ if (newValues.duration > adjustedLimited.max) {
156
+ newValues.duration = adjustedLimited.max;
157
+ } else if (newValues.duration < adjustedLimited.min) {
158
+ newValues.duration = adjustedLimited.min;
160
159
  }
161
- latestDuration.current = newDuration;
160
+ latestDuration.current = newValues.duration;
162
161
  }
163
162
  }
164
163
  if (Haptics || Audio) {
@@ -167,10 +166,18 @@ const DurationScroll = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
167
166
  // this check stops the feedback firing when the component mounts
168
167
  if (lastFeedbackIndex.current) {
169
168
  // fire haptic feedback if available
170
- Haptics === null || Haptics === void 0 || Haptics.selectionAsync();
169
+ try {
170
+ Haptics === null || Haptics === void 0 || Haptics.selectionAsync();
171
+ } catch {
172
+ // do nothing
173
+ }
171
174
 
172
175
  // play click sound if available
173
- clickSound === null || clickSound === void 0 || clickSound.replayAsync();
176
+ try {
177
+ clickSound === null || clickSound === void 0 || clickSound.replayAsync();
178
+ } catch {
179
+ // do nothing
180
+ }
174
181
  }
175
182
  lastFeedbackIndex.current = feedbackIndex;
176
183
  }
@@ -179,51 +186,56 @@ const DurationScroll = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
179
186
  // eslint-disable-next-line react-hooks/exhaustive-deps
180
187
  [adjustedLimited.max, adjustedLimited.min, aggressivelyGetLatestDuration, clickSound, disableInfiniteScroll, numberOfItems, padWithNItems, styles.pickerItemContainer.height]);
181
188
  const onMomentumScrollEnd = (0, _react.useCallback)(e => {
182
- const newIndex = Math.round(e.nativeEvent.contentOffset.y / styles.pickerItemContainer.height);
183
- let newDuration = (disableInfiniteScroll ? newIndex : newIndex + padWithNItems) % (numberOfItems + 1);
189
+ const newValues = (0, _getDurationAndIndexFromScrollOffset.getDurationAndIndexFromScrollOffset)({
190
+ disableInfiniteScroll,
191
+ itemHeight: styles.pickerItemContainer.height,
192
+ numberOfItems,
193
+ padWithNItems,
194
+ yContentOffset: e.nativeEvent.contentOffset.y
195
+ });
184
196
 
185
197
  // check limits
186
- if (newDuration > adjustedLimited.max) {
187
- var _flatListRef$current3;
188
- const targetScrollIndex = newIndex - (newDuration - adjustedLimited.max);
189
- (_flatListRef$current3 = flatListRef.current) === null || _flatListRef$current3 === void 0 || _flatListRef$current3.scrollToIndex({
198
+ if (newValues.duration > adjustedLimited.max) {
199
+ var _flatListRef$current;
200
+ const targetScrollIndex = newValues.index - (newValues.duration - adjustedLimited.max);
201
+ (_flatListRef$current = flatListRef.current) === null || _flatListRef$current === void 0 || _flatListRef$current.scrollToIndex({
190
202
  animated: true,
191
203
  index:
192
204
  // guard against scrolling beyond end of list
193
205
  targetScrollIndex >= 0 ? targetScrollIndex : adjustedLimited.max - 1
194
206
  }); // scroll down to max
195
- newDuration = adjustedLimited.max;
196
- } else if (newDuration < adjustedLimited.min) {
197
- var _flatListRef$current4;
198
- const targetScrollIndex = newIndex + (adjustedLimited.min - newDuration);
199
- (_flatListRef$current4 = flatListRef.current) === null || _flatListRef$current4 === void 0 || _flatListRef$current4.scrollToIndex({
207
+ newValues.duration = adjustedLimited.max;
208
+ } else if (newValues.duration < adjustedLimited.min) {
209
+ var _flatListRef$current2;
210
+ const targetScrollIndex = newValues.index + (adjustedLimited.min - newValues.duration);
211
+ (_flatListRef$current2 = flatListRef.current) === null || _flatListRef$current2 === void 0 || _flatListRef$current2.scrollToIndex({
200
212
  animated: true,
201
213
  index:
202
214
  // guard against scrolling beyond end of list
203
- targetScrollIndex <= data.length - 1 ? targetScrollIndex : adjustedLimited.min
215
+ targetScrollIndex <= numbersForFlatList.length - 1 ? targetScrollIndex : adjustedLimited.min
204
216
  }); // scroll up to min
205
- newDuration = adjustedLimited.min;
217
+ newValues.duration = adjustedLimited.min;
206
218
  }
207
- onDurationChange(newDuration);
208
- }, [adjustedLimited.max, adjustedLimited.min, data.length, disableInfiniteScroll, numberOfItems, onDurationChange, padWithNItems, styles.pickerItemContainer.height]);
219
+ onDurationChange(newValues.duration);
220
+ }, [adjustedLimited.max, adjustedLimited.min, numbersForFlatList.length, disableInfiniteScroll, numberOfItems, onDurationChange, padWithNItems, styles.pickerItemContainer.height]);
209
221
  const onViewableItemsChanged = (0, _react.useCallback)(({
210
222
  viewableItems
211
223
  }) => {
212
224
  var _viewableItems$, _viewableItems$2;
213
225
  if ((_viewableItems$ = viewableItems[0]) !== null && _viewableItems$ !== void 0 && _viewableItems$.index && viewableItems[0].index < numberOfItems * 0.5) {
214
- var _flatListRef$current5;
215
- (_flatListRef$current5 = flatListRef.current) === null || _flatListRef$current5 === void 0 || _flatListRef$current5.scrollToIndex({
226
+ var _flatListRef$current3;
227
+ (_flatListRef$current3 = flatListRef.current) === null || _flatListRef$current3 === void 0 || _flatListRef$current3.scrollToIndex({
216
228
  animated: false,
217
229
  index: viewableItems[0].index + numberOfItems
218
230
  });
219
- } else if ((_viewableItems$2 = viewableItems[0]) !== null && _viewableItems$2 !== void 0 && _viewableItems$2.index && viewableItems[0].index >= numberOfItems * 2.5) {
220
- var _flatListRef$current6;
221
- (_flatListRef$current6 = flatListRef.current) === null || _flatListRef$current6 === void 0 || _flatListRef$current6.scrollToIndex({
231
+ } else if ((_viewableItems$2 = viewableItems[0]) !== null && _viewableItems$2 !== void 0 && _viewableItems$2.index && viewableItems[0].index >= numberOfItems * (safeRepeatNumbersNTimes - 0.5)) {
232
+ var _flatListRef$current4;
233
+ (_flatListRef$current4 = flatListRef.current) === null || _flatListRef$current4 === void 0 || _flatListRef$current4.scrollToIndex({
222
234
  animated: false,
223
235
  index: viewableItems[0].index - numberOfItems
224
236
  });
225
237
  }
226
- }, [numberOfItems]);
238
+ }, [numberOfItems, safeRepeatNumbersNTimes]);
227
239
  const getItemLayout = (0, _react.useCallback)((_, index) => ({
228
240
  length: styles.pickerItemContainer.height,
229
241
  offset: styles.pickerItemContainer.height * index,
@@ -231,10 +243,33 @@ const DurationScroll = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
231
243
  }), [styles.pickerItemContainer.height]);
232
244
  const viewabilityConfigCallbackPairs = (0, _react.useRef)([{
233
245
  viewabilityConfig: {
234
- viewAreaCoveragePercentThreshold: 25
246
+ viewAreaCoveragePercentThreshold: 0
235
247
  },
236
248
  onViewableItemsChanged: onViewableItemsChanged
237
249
  }]);
250
+ (0, _react.useImperativeHandle)(ref, () => ({
251
+ reset: options => {
252
+ var _flatListRef$current5;
253
+ (_flatListRef$current5 = flatListRef.current) === null || _flatListRef$current5 === void 0 || _flatListRef$current5.scrollToIndex({
254
+ animated: (options === null || options === void 0 ? void 0 : options.animated) ?? false,
255
+ index: initialScrollIndex
256
+ });
257
+ },
258
+ setValue: (value, options) => {
259
+ var _flatListRef$current6;
260
+ (_flatListRef$current6 = flatListRef.current) === null || _flatListRef$current6 === void 0 || _flatListRef$current6.scrollToIndex({
261
+ animated: (options === null || options === void 0 ? void 0 : options.animated) ?? false,
262
+ index: (0, _getInitialScrollIndex.getInitialScrollIndex)({
263
+ disableInfiniteScroll,
264
+ numberOfItems,
265
+ padWithNItems,
266
+ repeatNumbersNTimes: safeRepeatNumbersNTimes,
267
+ value: value
268
+ })
269
+ });
270
+ },
271
+ latestDuration: latestDuration
272
+ }));
238
273
  return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
239
274
  pointerEvents: isDisabled ? "none" : undefined,
240
275
  style: [{
@@ -244,7 +279,7 @@ const DurationScroll = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
244
279
  testID: testID
245
280
  }, /*#__PURE__*/_react.default.createElement(FlatList, {
246
281
  ref: flatListRef,
247
- data: data,
282
+ data: numbersForFlatList,
248
283
  decelerationRate: 0.88,
249
284
  getItemLayout: getItemLayout,
250
285
  initialScrollIndex: initialScrollIndex,
@@ -259,7 +294,7 @@ const DurationScroll = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
259
294
  snapToAlignment: "start"
260
295
  // used in place of snapToOffset due to bug on Android
261
296
  ,
262
- snapToOffsets: [...Array(data.length)].map((_, i) => i * styles.pickerItemContainer.height),
297
+ snapToOffsets: [...Array(numbersForFlatList.length)].map((_, i) => i * styles.pickerItemContainer.height),
263
298
  testID: "duration-scroll-flatlist",
264
299
  viewabilityConfigCallbackPairs: !disableInfiniteScroll ? viewabilityConfigCallbackPairs === null || viewabilityConfigCallbackPairs === void 0 ? void 0 : viewabilityConfigCallbackPairs.current : undefined,
265
300
  windowSize: numberOfItemsToShow
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_colorToRgba","_generateNumbers","_getAdjustedLimit","_getScrollIndex","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","_extends","assign","bind","arguments","length","apply","DurationScroll","forwardRef","props","ref","aggressivelyGetLatestDuration","allowFontScaling","amLabel","Audio","bottomPickerGradientOverlayProps","clickSoundAsset","disableInfiniteScroll","FlatList","RNFlatList","Haptics","initialValue","is12HourPicker","isDisabled","label","limit","LinearGradient","numberOfItems","onDurationChange","padNumbersWithZero","padWithNItems","pickerGradientOverlayProps","pmLabel","styles","testID","topPickerGradientOverlayProps","data","generateNumbers","repeatNTimes","generate12HourNumbers","numberOfItemsToShow","adjustedLimited","getAdjustedLimit","initialScrollIndex","getScrollIndex","value","latestDuration","useRef","lastFeedbackIndex","flatListRef","clickSound","setClickSound","useState","useEffect","loadSound","sound","Sound","createAsync","uri","shouldPlay","unloadAsync","useImperativeHandle","reset","options","_flatListRef$current","current","scrollToIndex","animated","index","setValue","_flatListRef$current2","renderItem","useCallback","item","stringItem","intItem","isAm","parseInt","includes","replace","createElement","View","key","style","pickerItemContainer","Text","pickerItem","max","min","disabledPickerItem","pointerEvents","pickerAmPmContainer","pickerAmPmLabel","onScroll","newIndex","Math","round","nativeEvent","contentOffset","y","height","newDuration","feedbackIndex","selectionAsync","replayAsync","onMomentumScrollEnd","_flatListRef$current3","targetScrollIndex","_flatListRef$current4","onViewableItemsChanged","viewableItems","_viewableItems$","_viewableItems$2","_flatListRef$current5","_flatListRef$current6","getItemLayout","_","offset","viewabilityConfigCallbackPairs","viewabilityConfig","viewAreaCoveragePercentThreshold","undefined","overflow","disabledPickerContainer","decelerationRate","keyExtractor","toString","nestedScrollEnabled","scrollEnabled","scrollEventThrottle","showsVerticalScrollIndicator","snapToAlignment","snapToOffsets","Array","map","windowSize","pickerLabelContainer","pickerLabel","Fragment","colors","pickerContainer","backgroundColor","colorToRgba","color","opacity","end","x","start","pickerGradientOverlay","top","bottom","_default","exports","React","memo"],"sources":["index.tsx"],"sourcesContent":["import React, {\n useRef,\n useCallback,\n forwardRef,\n useImperativeHandle,\n useState,\n useEffect,\n} from \"react\";\n\nimport { View, Text, FlatList as RNFlatList } from \"react-native\";\nimport type {\n ViewabilityConfigCallbackPairs,\n ViewToken,\n NativeSyntheticEvent,\n NativeScrollEvent,\n} from \"react-native\";\n\nimport { colorToRgba } from \"../../utils/colorToRgba\";\nimport {\n generate12HourNumbers,\n generateNumbers,\n} from \"../../utils/generateNumbers\";\nimport { getAdjustedLimit } from \"../../utils/getAdjustedLimit\";\nimport { getScrollIndex } from \"../../utils/getScrollIndex\";\n\nimport type { DurationScrollProps, DurationScrollRef } from \"./types\";\n\nconst DurationScroll = forwardRef<DurationScrollRef, DurationScrollProps>(\n (props, ref) => {\n const {\n aggressivelyGetLatestDuration,\n allowFontScaling = false,\n amLabel,\n Audio,\n bottomPickerGradientOverlayProps,\n clickSoundAsset,\n disableInfiniteScroll = false,\n FlatList = RNFlatList,\n Haptics,\n initialValue = 0,\n is12HourPicker,\n isDisabled,\n label,\n limit,\n LinearGradient,\n numberOfItems,\n onDurationChange,\n padNumbersWithZero = false,\n padWithNItems,\n pickerGradientOverlayProps,\n pmLabel,\n styles,\n testID,\n topPickerGradientOverlayProps,\n } = props;\n\n const data = !is12HourPicker\n ? generateNumbers(numberOfItems, {\n padNumbersWithZero,\n repeatNTimes: 3,\n disableInfiniteScroll,\n padWithNItems,\n })\n : generate12HourNumbers({\n padNumbersWithZero,\n repeatNTimes: 3,\n disableInfiniteScroll,\n padWithNItems,\n });\n\n const numberOfItemsToShow = 1 + padWithNItems * 2;\n\n const adjustedLimited = getAdjustedLimit(limit, numberOfItems);\n\n const initialScrollIndex = getScrollIndex({\n value: initialValue,\n numberOfItems,\n padWithNItems,\n disableInfiniteScroll,\n });\n\n // keep track of the latest duration as it scrolls\n const latestDuration = useRef(0);\n // keep track of the last index scrolled past for haptic/audio feedback\n const lastFeedbackIndex = useRef(0);\n\n const flatListRef = useRef<RNFlatList | null>(null);\n\n const [clickSound, setClickSound] = useState<\n | {\n replayAsync: () => Promise<void>;\n unloadAsync: () => Promise<void>;\n }\n | undefined\n >();\n\n // Preload the sound when the component mounts\n useEffect(() => {\n const loadSound = async () => {\n if (Audio) {\n const { sound } = await Audio.Sound.createAsync(\n clickSoundAsset ?? {\n // use a hosted sound as a fallback (do not use local asset due to loader issues\n // in some environments when including mp3 in library)\n uri: \"https://drive.google.com/uc?export=download&id=10e1YkbNsRh-vGx1jmS1Nntz8xzkBp4_I\",\n },\n { shouldPlay: false }\n );\n setClickSound(sound);\n }\n };\n loadSound();\n\n // Unload sound when component unmounts\n return () => {\n clickSound?.unloadAsync();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [Audio]);\n\n useImperativeHandle(ref, () => ({\n reset: (options) => {\n flatListRef.current?.scrollToIndex({\n animated: options?.animated ?? false,\n index: initialScrollIndex,\n });\n },\n setValue: (value, options) => {\n flatListRef.current?.scrollToIndex({\n animated: options?.animated ?? false,\n index: getScrollIndex({\n value: value,\n numberOfItems,\n padWithNItems,\n disableInfiniteScroll,\n }),\n });\n },\n latestDuration: latestDuration,\n }));\n\n const renderItem = useCallback(\n ({ item }: { item: string }) => {\n let stringItem = item;\n let intItem: number;\n let isAm: boolean | undefined;\n\n if (!is12HourPicker) {\n intItem = parseInt(item);\n } else {\n isAm = item.includes(\"AM\");\n stringItem = item.replace(/\\s[AP]M/g, \"\");\n intItem = parseInt(stringItem);\n }\n\n return (\n <View\n key={item}\n style={styles.pickerItemContainer}\n testID=\"picker-item\">\n <Text\n allowFontScaling={allowFontScaling}\n style={[\n styles.pickerItem,\n intItem > adjustedLimited.max ||\n intItem < adjustedLimited.min\n ? styles.disabledPickerItem\n : {},\n ]}>\n {stringItem}\n </Text>\n {is12HourPicker ? (\n <View\n pointerEvents=\"none\"\n style={styles.pickerAmPmContainer}>\n <Text\n allowFontScaling={allowFontScaling}\n style={[styles.pickerAmPmLabel]}>\n {isAm ? amLabel : pmLabel}\n </Text>\n </View>\n ) : null}\n </View>\n );\n },\n [\n adjustedLimited.max,\n adjustedLimited.min,\n allowFontScaling,\n amLabel,\n is12HourPicker,\n pmLabel,\n styles.disabledPickerItem,\n styles.pickerAmPmContainer,\n styles.pickerAmPmLabel,\n styles.pickerItem,\n styles.pickerItemContainer,\n ]\n );\n\n const onScroll = useCallback(\n (e: NativeSyntheticEvent<NativeScrollEvent>) => {\n // this function is only used when the picker is in a modal and/or has Haptic/Audio feedback\n // it is used to ensure that the modal gets the latest duration on clicking\n // the confirm button, even if the scrollview is still scrolling\n if (!aggressivelyGetLatestDuration && !Haptics && !Audio) {\n return;\n }\n\n if (aggressivelyGetLatestDuration) {\n const newIndex = Math.round(\n e.nativeEvent.contentOffset.y /\n styles.pickerItemContainer.height\n );\n let newDuration =\n (disableInfiniteScroll\n ? newIndex\n : newIndex + padWithNItems) %\n (numberOfItems + 1);\n\n if (newDuration !== latestDuration.current) {\n // check limits\n if (newDuration > adjustedLimited.max) {\n newDuration = adjustedLimited.max;\n } else if (newDuration < adjustedLimited.min) {\n newDuration = adjustedLimited.min;\n }\n\n latestDuration.current = newDuration;\n }\n }\n\n if (Haptics || Audio) {\n const feedbackIndex = Math.round(\n (e.nativeEvent.contentOffset.y +\n styles.pickerItemContainer.height / 2) /\n styles.pickerItemContainer.height\n );\n\n if (feedbackIndex !== lastFeedbackIndex.current) {\n // this check stops the feedback firing when the component mounts\n if (lastFeedbackIndex.current) {\n // fire haptic feedback if available\n Haptics?.selectionAsync();\n\n // play click sound if available\n clickSound?.replayAsync();\n }\n\n lastFeedbackIndex.current = feedbackIndex;\n }\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n adjustedLimited.max,\n adjustedLimited.min,\n aggressivelyGetLatestDuration,\n clickSound,\n disableInfiniteScroll,\n numberOfItems,\n padWithNItems,\n styles.pickerItemContainer.height,\n ]\n );\n\n const onMomentumScrollEnd = useCallback(\n (e: NativeSyntheticEvent<NativeScrollEvent>) => {\n const newIndex = Math.round(\n e.nativeEvent.contentOffset.y /\n styles.pickerItemContainer.height\n );\n let newDuration =\n (disableInfiniteScroll\n ? newIndex\n : newIndex + padWithNItems) %\n (numberOfItems + 1);\n\n // check limits\n if (newDuration > adjustedLimited.max) {\n const targetScrollIndex =\n newIndex - (newDuration - adjustedLimited.max);\n flatListRef.current?.scrollToIndex({\n animated: true,\n index:\n // guard against scrolling beyond end of list\n targetScrollIndex >= 0\n ? targetScrollIndex\n : adjustedLimited.max - 1,\n }); // scroll down to max\n newDuration = adjustedLimited.max;\n } else if (newDuration < adjustedLimited.min) {\n const targetScrollIndex =\n newIndex + (adjustedLimited.min - newDuration);\n flatListRef.current?.scrollToIndex({\n animated: true,\n index:\n // guard against scrolling beyond end of list\n targetScrollIndex <= data.length - 1\n ? targetScrollIndex\n : adjustedLimited.min,\n }); // scroll up to min\n newDuration = adjustedLimited.min;\n }\n\n onDurationChange(newDuration);\n },\n [\n adjustedLimited.max,\n adjustedLimited.min,\n data.length,\n disableInfiniteScroll,\n numberOfItems,\n onDurationChange,\n padWithNItems,\n styles.pickerItemContainer.height,\n ]\n );\n\n const onViewableItemsChanged = useCallback(\n ({ viewableItems }: { viewableItems: ViewToken[] }) => {\n if (\n viewableItems[0]?.index &&\n viewableItems[0].index < numberOfItems * 0.5\n ) {\n flatListRef.current?.scrollToIndex({\n animated: false,\n index: viewableItems[0].index + numberOfItems,\n });\n } else if (\n viewableItems[0]?.index &&\n viewableItems[0].index >= numberOfItems * 2.5\n ) {\n flatListRef.current?.scrollToIndex({\n animated: false,\n index: viewableItems[0].index - numberOfItems,\n });\n }\n },\n [numberOfItems]\n );\n\n const getItemLayout = useCallback(\n (_: ArrayLike<string> | null | undefined, index: number) => ({\n length: styles.pickerItemContainer.height,\n offset: styles.pickerItemContainer.height * index,\n index,\n }),\n [styles.pickerItemContainer.height]\n );\n\n const viewabilityConfigCallbackPairs =\n useRef<ViewabilityConfigCallbackPairs>([\n {\n viewabilityConfig: { viewAreaCoveragePercentThreshold: 25 },\n onViewableItemsChanged: onViewableItemsChanged,\n },\n ]);\n\n return (\n <View\n pointerEvents={isDisabled ? \"none\" : undefined}\n style={[\n {\n height:\n styles.pickerItemContainer.height *\n numberOfItemsToShow,\n overflow: \"visible\",\n },\n isDisabled && styles.disabledPickerContainer,\n ]}\n testID={testID}>\n <FlatList\n ref={flatListRef}\n data={data}\n decelerationRate={0.88}\n getItemLayout={getItemLayout}\n initialScrollIndex={initialScrollIndex}\n keyExtractor={(_, index) => index.toString()}\n nestedScrollEnabled\n onMomentumScrollEnd={onMomentumScrollEnd}\n onScroll={onScroll}\n renderItem={renderItem}\n scrollEnabled={!isDisabled}\n scrollEventThrottle={16}\n showsVerticalScrollIndicator={false}\n snapToAlignment=\"start\"\n // used in place of snapToOffset due to bug on Android\n snapToOffsets={[...Array(data.length)].map(\n (_, i) => i * styles.pickerItemContainer.height\n )}\n testID=\"duration-scroll-flatlist\"\n viewabilityConfigCallbackPairs={\n !disableInfiniteScroll\n ? viewabilityConfigCallbackPairs?.current\n : undefined\n }\n windowSize={numberOfItemsToShow}\n />\n <View pointerEvents=\"none\" style={styles.pickerLabelContainer}>\n {typeof label === \"string\" ? (\n <Text\n allowFontScaling={allowFontScaling}\n style={styles.pickerLabel}>\n {label}\n </Text>\n ) : (\n label ?? null\n )}\n </View>\n {LinearGradient ? (\n <>\n <LinearGradient\n colors={[\n styles.pickerContainer.backgroundColor ??\n \"white\",\n colorToRgba({\n color:\n styles.pickerContainer\n .backgroundColor ?? \"white\",\n opacity: 0,\n }),\n ]}\n end={{ x: 1, y: 1 }}\n pointerEvents=\"none\"\n start={{ x: 1, y: 0.3 }}\n {...pickerGradientOverlayProps}\n {...topPickerGradientOverlayProps}\n style={[styles.pickerGradientOverlay, { top: 0 }]}\n />\n <LinearGradient\n colors={[\n colorToRgba({\n color:\n styles.pickerContainer\n .backgroundColor ?? \"white\",\n opacity: 0,\n }),\n styles.pickerContainer.backgroundColor ??\n \"white\",\n ]}\n end={{ x: 1, y: 0.7 }}\n pointerEvents=\"none\"\n start={{ x: 1, y: 0 }}\n {...pickerGradientOverlayProps}\n {...bottomPickerGradientOverlayProps}\n style={[\n styles.pickerGradientOverlay,\n { bottom: -1 },\n ]}\n />\n </>\n ) : null}\n </View>\n );\n }\n);\n\nexport default React.memo(DurationScroll);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_colorToRgba","_generateNumbers","_getAdjustedLimit","_getDurationAndIndexFromScrollOffset","_getInitialScrollIndex","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","_extends","assign","bind","arguments","length","apply","DurationScroll","forwardRef","props","ref","aggressivelyGetLatestDuration","allowFontScaling","amLabel","Audio","bottomPickerGradientOverlayProps","clickSoundAsset","disableInfiniteScroll","FlatList","RNFlatList","Haptics","initialValue","is12HourPicker","isDisabled","label","limit","LinearGradient","numberOfItems","onDurationChange","padNumbersWithZero","padWithNItems","pickerGradientOverlayProps","pmLabel","repeatNumbersNTimes","styles","testID","topPickerGradientOverlayProps","safeRepeatNumbersNTimes","useMemo","Math","round","numbersForFlatList","generate12HourNumbers","repeatNTimes","generateNumbers","initialScrollIndex","getInitialScrollIndex","value","adjustedLimited","getAdjustedLimit","numberOfItemsToShow","latestDuration","useRef","lastFeedbackIndex","flatListRef","clickSound","setClickSound","useState","useEffect","loadSound","sound","Sound","createAsync","uri","shouldPlay","unloadAsync","renderItem","useCallback","item","stringItem","intItem","isAm","parseInt","includes","replace","createElement","View","key","style","pickerItemContainer","Text","pickerItem","max","min","disabledPickerItem","pointerEvents","pickerAmPmContainer","pickerAmPmLabel","onScroll","newValues","getDurationAndIndexFromScrollOffset","itemHeight","height","yContentOffset","nativeEvent","contentOffset","y","duration","current","feedbackIndex","selectionAsync","replayAsync","onMomentumScrollEnd","_flatListRef$current","targetScrollIndex","index","scrollToIndex","animated","_flatListRef$current2","onViewableItemsChanged","viewableItems","_viewableItems$","_viewableItems$2","_flatListRef$current3","_flatListRef$current4","getItemLayout","_","offset","viewabilityConfigCallbackPairs","viewabilityConfig","viewAreaCoveragePercentThreshold","useImperativeHandle","reset","options","_flatListRef$current5","setValue","_flatListRef$current6","undefined","overflow","disabledPickerContainer","data","decelerationRate","keyExtractor","toString","nestedScrollEnabled","scrollEnabled","scrollEventThrottle","showsVerticalScrollIndicator","snapToAlignment","snapToOffsets","Array","map","windowSize","pickerLabelContainer","pickerLabel","Fragment","colors","pickerContainer","backgroundColor","colorToRgba","color","opacity","end","x","start","pickerGradientOverlay","top","bottom","_default","exports","React","memo"],"sources":["index.tsx"],"sourcesContent":["import React, {\n useRef,\n useCallback,\n forwardRef,\n useImperativeHandle,\n useState,\n useEffect,\n useMemo,\n} from \"react\";\n\nimport { View, Text, FlatList as RNFlatList } from \"react-native\";\nimport type {\n ViewabilityConfigCallbackPairs,\n ViewToken,\n NativeSyntheticEvent,\n NativeScrollEvent,\n} from \"react-native\";\n\nimport { colorToRgba } from \"../../utils/colorToRgba\";\nimport {\n generate12HourNumbers,\n generateNumbers,\n} from \"../../utils/generateNumbers\";\nimport { getAdjustedLimit } from \"../../utils/getAdjustedLimit\";\nimport { getDurationAndIndexFromScrollOffset } from \"../../utils/getDurationAndIndexFromScrollOffset\";\nimport { getInitialScrollIndex } from \"../../utils/getInitialScrollIndex\";\n\nimport type { DurationScrollProps, DurationScrollRef } from \"./types\";\n\nconst DurationScroll = forwardRef<DurationScrollRef, DurationScrollProps>(\n (props, ref) => {\n const {\n aggressivelyGetLatestDuration,\n allowFontScaling = false,\n amLabel,\n Audio,\n bottomPickerGradientOverlayProps,\n clickSoundAsset,\n disableInfiniteScroll = false,\n FlatList = RNFlatList,\n Haptics,\n initialValue = 0,\n is12HourPicker,\n isDisabled,\n label,\n limit,\n LinearGradient,\n numberOfItems,\n onDurationChange,\n padNumbersWithZero = false,\n padWithNItems,\n pickerGradientOverlayProps,\n pmLabel,\n repeatNumbersNTimes = 3,\n styles,\n testID,\n topPickerGradientOverlayProps,\n } = props;\n\n const safeRepeatNumbersNTimes = useMemo(() => {\n if (!disableInfiniteScroll && repeatNumbersNTimes < 2) {\n return 2;\n } else if (repeatNumbersNTimes < 1) {\n return 1;\n }\n\n return Math.round(repeatNumbersNTimes);\n }, [disableInfiniteScroll, repeatNumbersNTimes]);\n\n const numbersForFlatList = useMemo(() => {\n if (is12HourPicker) {\n return generate12HourNumbers({\n padNumbersWithZero,\n repeatNTimes: safeRepeatNumbersNTimes,\n disableInfiniteScroll,\n padWithNItems,\n });\n }\n\n return generateNumbers(numberOfItems, {\n padNumbersWithZero,\n repeatNTimes: safeRepeatNumbersNTimes,\n disableInfiniteScroll,\n padWithNItems,\n });\n }, [\n disableInfiniteScroll,\n is12HourPicker,\n numberOfItems,\n padNumbersWithZero,\n padWithNItems,\n safeRepeatNumbersNTimes,\n ]);\n\n const initialScrollIndex = useMemo(\n () =>\n getInitialScrollIndex({\n disableInfiniteScroll,\n numberOfItems,\n padWithNItems,\n repeatNumbersNTimes: safeRepeatNumbersNTimes,\n value: initialValue,\n }),\n [\n disableInfiniteScroll,\n initialValue,\n numberOfItems,\n padWithNItems,\n safeRepeatNumbersNTimes,\n ]\n );\n\n const adjustedLimited = useMemo(\n () => getAdjustedLimit(limit, numberOfItems),\n [limit, numberOfItems]\n );\n\n const numberOfItemsToShow = 1 + padWithNItems * 2;\n\n // keep track of the latest duration as it scrolls\n const latestDuration = useRef(0);\n // keep track of the last index scrolled past for haptic/audio feedback\n const lastFeedbackIndex = useRef(0);\n\n const flatListRef = useRef<RNFlatList | null>(null);\n\n const [clickSound, setClickSound] = useState<\n | {\n replayAsync: () => Promise<void>;\n unloadAsync: () => Promise<void>;\n }\n | undefined\n >();\n\n // Preload the sound when the component mounts\n useEffect(() => {\n const loadSound = async () => {\n if (Audio) {\n const { sound } = await Audio.Sound.createAsync(\n clickSoundAsset ?? {\n // use a hosted sound as a fallback (do not use local asset due to loader issues\n // in some environments when including mp3 in library)\n uri: \"https://drive.google.com/uc?export=download&id=10e1YkbNsRh-vGx1jmS1Nntz8xzkBp4_I\",\n },\n { shouldPlay: false }\n );\n setClickSound(sound);\n }\n };\n\n loadSound();\n\n // Unload sound when component unmounts\n return () => {\n clickSound?.unloadAsync();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [Audio]);\n\n const renderItem = useCallback(\n ({ item }: { item: string }) => {\n let stringItem = item;\n let intItem: number;\n let isAm: boolean | undefined;\n\n if (!is12HourPicker) {\n intItem = parseInt(item);\n } else {\n isAm = item.includes(\"AM\");\n stringItem = item.replace(/\\s[AP]M/g, \"\");\n intItem = parseInt(stringItem);\n }\n\n return (\n <View\n key={item}\n style={styles.pickerItemContainer}\n testID=\"picker-item\">\n <Text\n allowFontScaling={allowFontScaling}\n style={[\n styles.pickerItem,\n intItem > adjustedLimited.max ||\n intItem < adjustedLimited.min\n ? styles.disabledPickerItem\n : {},\n ]}>\n {stringItem}\n </Text>\n {is12HourPicker ? (\n <View\n pointerEvents=\"none\"\n style={styles.pickerAmPmContainer}>\n <Text\n allowFontScaling={allowFontScaling}\n style={[styles.pickerAmPmLabel]}>\n {isAm ? amLabel : pmLabel}\n </Text>\n </View>\n ) : null}\n </View>\n );\n },\n [\n adjustedLimited.max,\n adjustedLimited.min,\n allowFontScaling,\n amLabel,\n is12HourPicker,\n pmLabel,\n styles.disabledPickerItem,\n styles.pickerAmPmContainer,\n styles.pickerAmPmLabel,\n styles.pickerItem,\n styles.pickerItemContainer,\n ]\n );\n\n const onScroll = useCallback(\n (e: NativeSyntheticEvent<NativeScrollEvent>) => {\n // this function is only used when the picker is in a modal and/or has Haptic/Audio feedback\n // it is used to ensure that the modal gets the latest duration on clicking\n // the confirm button, even if the scrollview is still scrolling\n if (!aggressivelyGetLatestDuration && !Haptics && !Audio) {\n return;\n }\n\n if (aggressivelyGetLatestDuration) {\n const newValues = getDurationAndIndexFromScrollOffset({\n disableInfiniteScroll,\n itemHeight: styles.pickerItemContainer.height,\n numberOfItems,\n padWithNItems,\n yContentOffset: e.nativeEvent.contentOffset.y,\n });\n\n if (newValues.duration !== latestDuration.current) {\n // check limits\n if (newValues.duration > adjustedLimited.max) {\n newValues.duration = adjustedLimited.max;\n } else if (newValues.duration < adjustedLimited.min) {\n newValues.duration = adjustedLimited.min;\n }\n\n latestDuration.current = newValues.duration;\n }\n }\n\n if (Haptics || Audio) {\n const feedbackIndex = Math.round(\n (e.nativeEvent.contentOffset.y +\n styles.pickerItemContainer.height / 2) /\n styles.pickerItemContainer.height\n );\n\n if (feedbackIndex !== lastFeedbackIndex.current) {\n // this check stops the feedback firing when the component mounts\n if (lastFeedbackIndex.current) {\n // fire haptic feedback if available\n try {\n Haptics?.selectionAsync();\n } catch {\n // do nothing\n }\n\n // play click sound if available\n try {\n clickSound?.replayAsync();\n } catch {\n // do nothing\n }\n }\n\n lastFeedbackIndex.current = feedbackIndex;\n }\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n adjustedLimited.max,\n adjustedLimited.min,\n aggressivelyGetLatestDuration,\n clickSound,\n disableInfiniteScroll,\n numberOfItems,\n padWithNItems,\n styles.pickerItemContainer.height,\n ]\n );\n\n const onMomentumScrollEnd = useCallback(\n (e: NativeSyntheticEvent<NativeScrollEvent>) => {\n const newValues = getDurationAndIndexFromScrollOffset({\n disableInfiniteScroll,\n itemHeight: styles.pickerItemContainer.height,\n numberOfItems,\n padWithNItems,\n yContentOffset: e.nativeEvent.contentOffset.y,\n });\n\n // check limits\n if (newValues.duration > adjustedLimited.max) {\n const targetScrollIndex =\n newValues.index -\n (newValues.duration - adjustedLimited.max);\n flatListRef.current?.scrollToIndex({\n animated: true,\n index:\n // guard against scrolling beyond end of list\n targetScrollIndex >= 0\n ? targetScrollIndex\n : adjustedLimited.max - 1,\n }); // scroll down to max\n newValues.duration = adjustedLimited.max;\n } else if (newValues.duration < adjustedLimited.min) {\n const targetScrollIndex =\n newValues.index +\n (adjustedLimited.min - newValues.duration);\n flatListRef.current?.scrollToIndex({\n animated: true,\n index:\n // guard against scrolling beyond end of list\n targetScrollIndex <= numbersForFlatList.length - 1\n ? targetScrollIndex\n : adjustedLimited.min,\n }); // scroll up to min\n newValues.duration = adjustedLimited.min;\n }\n\n onDurationChange(newValues.duration);\n },\n [\n adjustedLimited.max,\n adjustedLimited.min,\n numbersForFlatList.length,\n disableInfiniteScroll,\n numberOfItems,\n onDurationChange,\n padWithNItems,\n styles.pickerItemContainer.height,\n ]\n );\n\n const onViewableItemsChanged = useCallback(\n ({ viewableItems }: { viewableItems: ViewToken[] }) => {\n if (\n viewableItems[0]?.index &&\n viewableItems[0].index < numberOfItems * 0.5\n ) {\n flatListRef.current?.scrollToIndex({\n animated: false,\n index: viewableItems[0].index + numberOfItems,\n });\n } else if (\n viewableItems[0]?.index &&\n viewableItems[0].index >=\n numberOfItems * (safeRepeatNumbersNTimes - 0.5)\n ) {\n flatListRef.current?.scrollToIndex({\n animated: false,\n index: viewableItems[0].index - numberOfItems,\n });\n }\n },\n [numberOfItems, safeRepeatNumbersNTimes]\n );\n\n const getItemLayout = useCallback(\n (_: ArrayLike<string> | null | undefined, index: number) => ({\n length: styles.pickerItemContainer.height,\n offset: styles.pickerItemContainer.height * index,\n index,\n }),\n [styles.pickerItemContainer.height]\n );\n\n const viewabilityConfigCallbackPairs =\n useRef<ViewabilityConfigCallbackPairs>([\n {\n viewabilityConfig: { viewAreaCoveragePercentThreshold: 0 },\n onViewableItemsChanged: onViewableItemsChanged,\n },\n ]);\n\n useImperativeHandle(ref, () => ({\n reset: (options) => {\n flatListRef.current?.scrollToIndex({\n animated: options?.animated ?? false,\n index: initialScrollIndex,\n });\n },\n setValue: (value, options) => {\n flatListRef.current?.scrollToIndex({\n animated: options?.animated ?? false,\n index: getInitialScrollIndex({\n disableInfiniteScroll,\n numberOfItems,\n padWithNItems,\n repeatNumbersNTimes: safeRepeatNumbersNTimes,\n value: value,\n }),\n });\n },\n latestDuration: latestDuration,\n }));\n\n return (\n <View\n pointerEvents={isDisabled ? \"none\" : undefined}\n style={[\n {\n height:\n styles.pickerItemContainer.height *\n numberOfItemsToShow,\n overflow: \"visible\",\n },\n isDisabled && styles.disabledPickerContainer,\n ]}\n testID={testID}>\n <FlatList\n ref={flatListRef}\n data={numbersForFlatList}\n decelerationRate={0.88}\n getItemLayout={getItemLayout}\n initialScrollIndex={initialScrollIndex}\n keyExtractor={(_, index) => index.toString()}\n nestedScrollEnabled\n onMomentumScrollEnd={onMomentumScrollEnd}\n onScroll={onScroll}\n renderItem={renderItem}\n scrollEnabled={!isDisabled}\n scrollEventThrottle={16}\n showsVerticalScrollIndicator={false}\n snapToAlignment=\"start\"\n // used in place of snapToOffset due to bug on Android\n snapToOffsets={[...Array(numbersForFlatList.length)].map(\n (_, i) => i * styles.pickerItemContainer.height\n )}\n testID=\"duration-scroll-flatlist\"\n viewabilityConfigCallbackPairs={\n !disableInfiniteScroll\n ? viewabilityConfigCallbackPairs?.current\n : undefined\n }\n windowSize={numberOfItemsToShow}\n />\n <View pointerEvents=\"none\" style={styles.pickerLabelContainer}>\n {typeof label === \"string\" ? (\n <Text\n allowFontScaling={allowFontScaling}\n style={styles.pickerLabel}>\n {label}\n </Text>\n ) : (\n label ?? null\n )}\n </View>\n {LinearGradient ? (\n <>\n <LinearGradient\n colors={[\n styles.pickerContainer.backgroundColor ??\n \"white\",\n colorToRgba({\n color:\n styles.pickerContainer\n .backgroundColor ?? \"white\",\n opacity: 0,\n }),\n ]}\n end={{ x: 1, y: 1 }}\n pointerEvents=\"none\"\n start={{ x: 1, y: 0.3 }}\n {...pickerGradientOverlayProps}\n {...topPickerGradientOverlayProps}\n style={[styles.pickerGradientOverlay, { top: 0 }]}\n />\n <LinearGradient\n colors={[\n colorToRgba({\n color:\n styles.pickerContainer\n .backgroundColor ?? \"white\",\n opacity: 0,\n }),\n styles.pickerContainer.backgroundColor ??\n \"white\",\n ]}\n end={{ x: 1, y: 0.7 }}\n pointerEvents=\"none\"\n start={{ x: 1, y: 0 }}\n {...pickerGradientOverlayProps}\n {...bottomPickerGradientOverlayProps}\n style={[\n styles.pickerGradientOverlay,\n { bottom: -1 },\n ]}\n />\n </>\n ) : null}\n </View>\n );\n }\n);\n\nexport default React.memo(DurationScroll);\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { MutableRefObject } from \"react\";\n\nimport type {\n View,\n FlatList as RNFlatList,\n FlatListProps as RNFlatListProps,\n} from \"react-native\";\n\nimport type { generateStyles } from \"../TimerPicker/styles\";\n\nexport type CustomFlatList = <ItemT = any>(\n props: React.PropsWithChildren<\n RNFlatListProps<ItemT> & React.RefAttributes<RNFlatList<ItemT>>\n >,\n ref: React.ForwardedRef<RNFlatList<ItemT>>\n) => React.ReactElement | null;\n\nexport interface DurationScrollProps {\n Audio?: any;\n FlatList?: CustomFlatList;\n Haptics?: any;\n LinearGradient?: any;\n aggressivelyGetLatestDuration: boolean;\n allowFontScaling?: boolean;\n amLabel?: string;\n bottomPickerGradientOverlayProps?: Partial<LinearGradientProps>;\n clickSoundAsset?: SoundAssetType;\n disableInfiniteScroll?: boolean;\n initialValue?: number;\n is12HourPicker?: boolean;\n isDisabled?: boolean;\n label?: string | React.ReactElement;\n limit?: LimitType;\n numberOfItems: number;\n onDurationChange: (duration: number) => void;\n padNumbersWithZero?: boolean;\n padWithNItems: number;\n pickerGradientOverlayProps?: Partial<LinearGradientProps>;\n pmLabel?: string;\n styles: ReturnType<typeof generateStyles>;\n testID?: string;\n topPickerGradientOverlayProps?: Partial<LinearGradientProps>;\n}\n\nexport interface DurationScrollRef {\n latestDuration: MutableRefObject<number>;\n reset: (options?: { animated?: boolean }) => void;\n setValue: (value: number, options?: { animated?: boolean }) => void;\n}\n\ntype LinearGradientPoint = {\n x: number;\n y: number;\n};\n\nexport type LinearGradientProps = React.ComponentProps<typeof View> & {\n colors: string[];\n end?: LinearGradientPoint | null;\n locations?: number[] | null;\n start?: LinearGradientPoint | null;\n};\n\nexport type LimitType = {\n max?: number;\n min?: number;\n};\n\nexport type SoundAssetType =\n | number\n | {\n headers?: Record<string, string>;\n overrideFileExtensionAndroid?: string;\n uri: string;\n };\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { MutableRefObject } from \"react\";\n\nimport type {\n View,\n FlatList as RNFlatList,\n FlatListProps as RNFlatListProps,\n} from \"react-native\";\n\nimport type { generateStyles } from \"../TimerPicker/styles\";\n\nexport type CustomFlatList = <ItemT = any>(\n props: React.PropsWithChildren<\n RNFlatListProps<ItemT> & React.RefAttributes<RNFlatList<ItemT>>\n >,\n ref: React.ForwardedRef<RNFlatList<ItemT>>\n) => React.ReactElement | null;\n\nexport interface DurationScrollProps {\n Audio?: any;\n FlatList?: CustomFlatList;\n Haptics?: any;\n LinearGradient?: any;\n aggressivelyGetLatestDuration: boolean;\n allowFontScaling?: boolean;\n amLabel?: string;\n bottomPickerGradientOverlayProps?: Partial<LinearGradientProps>;\n clickSoundAsset?: SoundAssetType;\n disableInfiniteScroll?: boolean;\n initialValue?: number;\n is12HourPicker?: boolean;\n isDisabled?: boolean;\n label?: string | React.ReactElement;\n limit?: LimitType;\n numberOfItems: number;\n onDurationChange: (duration: number) => void;\n padNumbersWithZero?: boolean;\n padWithNItems: number;\n pickerGradientOverlayProps?: Partial<LinearGradientProps>;\n pmLabel?: string;\n repeatNumbersNTimes?: number;\n styles: ReturnType<typeof generateStyles>;\n testID?: string;\n topPickerGradientOverlayProps?: Partial<LinearGradientProps>;\n}\n\nexport interface DurationScrollRef {\n latestDuration: MutableRefObject<number>;\n reset: (options?: { animated?: boolean }) => void;\n setValue: (value: number, options?: { animated?: boolean }) => void;\n}\n\ntype LinearGradientPoint = {\n x: number;\n y: number;\n};\n\nexport type LinearGradientProps = React.ComponentProps<typeof View> & {\n colors: string[];\n end?: LinearGradientPoint | null;\n locations?: number[] | null;\n start?: LinearGradientPoint | null;\n};\n\nexport type LimitType = {\n max?: number;\n min?: number;\n};\n\nexport type SoundAssetType =\n | number\n | {\n headers?: Record<string, string>;\n overrideFileExtensionAndroid?: string;\n uri: string;\n };\n"],"mappings":"","ignoreList":[]}
@@ -35,6 +35,9 @@ const TimerPicker = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
35
35
  padWithNItems = 1,
36
36
  pickerContainerProps,
37
37
  pmLabel = "pm",
38
+ repeatHourNumbersNTimes = 7,
39
+ repeatMinuteNumbersNTimes = 3,
40
+ repeatSecondNumbersNTimes = 3,
38
41
  secondLabel,
39
42
  secondLimit,
40
43
  secondsPickerIsDisabled = false,
@@ -42,15 +45,24 @@ const TimerPicker = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
42
45
  use12HourPicker = false,
43
46
  ...otherProps
44
47
  } = props;
45
- const checkedPadWithNItems = padWithNItems >= 0 ? Math.round(padWithNItems) : 0;
48
+ const safePadWithNItems = (0, _react.useMemo)(() => {
49
+ if (padWithNItems < 0) {
50
+ return 0;
51
+ }
52
+ const maxPadWithNItems = hideHours ? 15 : 6;
53
+ if (padWithNItems > maxPadWithNItems) {
54
+ return maxPadWithNItems;
55
+ }
56
+ return Math.round(padWithNItems);
57
+ }, [hideHours, padWithNItems]);
46
58
  const styles = (0, _react.useMemo)(() => (0, _styles.generateStyles)(customStyles, {
47
- padWithNItems: checkedPadWithNItems
48
- }), [checkedPadWithNItems, customStyles]);
49
- const safeInitialValue = {
59
+ padWithNItems: safePadWithNItems
60
+ }), [safePadWithNItems, customStyles]);
61
+ const safeInitialValue = (0, _react.useMemo)(() => ({
50
62
  hours: (initialValue === null || initialValue === void 0 ? void 0 : initialValue.hours) ?? 0,
51
63
  minutes: (initialValue === null || initialValue === void 0 ? void 0 : initialValue.minutes) ?? 0,
52
64
  seconds: (initialValue === null || initialValue === void 0 ? void 0 : initialValue.seconds) ?? 0
53
- };
65
+ }), [initialValue === null || initialValue === void 0 ? void 0 : initialValue.hours, initialValue === null || initialValue === void 0 ? void 0 : initialValue.minutes, initialValue === null || initialValue === void 0 ? void 0 : initialValue.seconds]);
54
66
  const [selectedHours, setSelectedHours] = (0, _react.useState)(safeInitialValue.hours);
55
67
  const [selectedMinutes, setSelectedMinutes] = (0, _react.useState)(safeInitialValue.minutes);
56
68
  const [selectedSeconds, setSelectedSeconds] = (0, _react.useState)(safeInitialValue.seconds);
@@ -107,11 +119,12 @@ const TimerPicker = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
107
119
  isDisabled: hoursPickerIsDisabled,
108
120
  label: hourLabel ?? (!use12HourPicker ? "h" : undefined),
109
121
  limit: hourLimit,
110
- numberOfItems: 23,
122
+ numberOfItems: 24,
111
123
  onDurationChange: setSelectedHours,
112
124
  padNumbersWithZero: padHoursWithZero,
113
- padWithNItems: checkedPadWithNItems,
125
+ padWithNItems: safePadWithNItems,
114
126
  pmLabel: pmLabel,
127
+ repeatNumbersNTimes: repeatHourNumbersNTimes,
115
128
  styles: styles,
116
129
  testID: "duration-scroll-hour"
117
130
  }, otherProps)) : null, !hideMinutes ? /*#__PURE__*/_react.default.createElement(_DurationScroll.default, _extends({
@@ -123,10 +136,11 @@ const TimerPicker = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
123
136
  isDisabled: minutesPickerIsDisabled,
124
137
  label: minuteLabel ?? "m",
125
138
  limit: minuteLimit,
126
- numberOfItems: 59,
139
+ numberOfItems: 60,
127
140
  onDurationChange: setSelectedMinutes,
128
141
  padNumbersWithZero: padMinutesWithZero,
129
- padWithNItems: checkedPadWithNItems,
142
+ padWithNItems: safePadWithNItems,
143
+ repeatNumbersNTimes: repeatMinuteNumbersNTimes,
130
144
  styles: styles,
131
145
  testID: "duration-scroll-minute"
132
146
  }, otherProps)) : null, !hideSeconds ? /*#__PURE__*/_react.default.createElement(_DurationScroll.default, _extends({
@@ -138,10 +152,11 @@ const TimerPicker = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
138
152
  isDisabled: secondsPickerIsDisabled,
139
153
  label: secondLabel ?? "s",
140
154
  limit: secondLimit,
141
- numberOfItems: 59,
155
+ numberOfItems: 60,
142
156
  onDurationChange: setSelectedSeconds,
143
157
  padNumbersWithZero: padSecondsWithZero,
144
- padWithNItems: checkedPadWithNItems,
158
+ padWithNItems: safePadWithNItems,
159
+ repeatNumbersNTimes: repeatSecondNumbersNTimes,
145
160
  styles: styles,
146
161
  testID: "duration-scroll-second"
147
162
  }, otherProps)) : null);