react-native-timer-picker 2.1.0 → 2.2.0

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 (101) hide show
  1. package/README.md +227 -152
  2. package/dist/commonjs/components/DurationScroll/DurationScroll.js +417 -0
  3. package/dist/commonjs/components/DurationScroll/DurationScroll.js.map +1 -0
  4. package/dist/commonjs/components/DurationScroll/index.js +20 -392
  5. package/dist/commonjs/components/DurationScroll/index.js.map +1 -1
  6. package/dist/commonjs/components/DurationScroll/types.js.map +1 -1
  7. package/dist/commonjs/components/Modal/Modal.js +107 -0
  8. package/dist/commonjs/components/Modal/Modal.js.map +1 -0
  9. package/dist/commonjs/components/Modal/index.js +20 -101
  10. package/dist/commonjs/components/Modal/index.js.map +1 -1
  11. package/dist/commonjs/components/TimerPicker/TimerPicker.js +225 -0
  12. package/dist/commonjs/components/TimerPicker/TimerPicker.js.map +1 -0
  13. package/dist/commonjs/components/TimerPicker/index.js +29 -166
  14. package/dist/commonjs/components/TimerPicker/index.js.map +1 -1
  15. package/dist/commonjs/components/TimerPicker/styles.js +1 -1
  16. package/dist/commonjs/components/TimerPicker/styles.js.map +1 -1
  17. package/dist/commonjs/components/TimerPicker/types.js.map +1 -1
  18. package/dist/commonjs/components/TimerPickerModal/TimerPickerModal.js +143 -0
  19. package/dist/commonjs/components/TimerPickerModal/TimerPickerModal.js.map +1 -0
  20. package/dist/commonjs/components/TimerPickerModal/index.js +30 -131
  21. package/dist/commonjs/components/TimerPickerModal/index.js.map +1 -1
  22. package/dist/commonjs/components/TimerPickerModal/types.js.map +1 -1
  23. package/dist/commonjs/index.js +9 -13
  24. package/dist/commonjs/index.js.map +1 -1
  25. package/dist/commonjs/tests/TimerPicker.test.js +4 -1
  26. package/dist/commonjs/tests/TimerPicker.test.js.map +1 -1
  27. package/dist/commonjs/utils/colorToRgba.js +35 -4
  28. package/dist/commonjs/utils/colorToRgba.js.map +1 -1
  29. package/dist/commonjs/utils/generateNumbers.js +67 -0
  30. package/dist/commonjs/utils/generateNumbers.js.map +1 -1
  31. package/dist/commonjs/utils/getAdjustedLimit.js +25 -0
  32. package/dist/commonjs/utils/getAdjustedLimit.js.map +1 -1
  33. package/dist/commonjs/utils/getDurationAndIndexFromScrollOffset.js +38 -0
  34. package/dist/commonjs/utils/getDurationAndIndexFromScrollOffset.js.map +1 -1
  35. package/dist/commonjs/utils/getInitialScrollIndex.js +38 -0
  36. package/dist/commonjs/utils/getInitialScrollIndex.js.map +1 -1
  37. package/dist/commonjs/utils/getSafeInitialValue.js +28 -0
  38. package/dist/commonjs/utils/getSafeInitialValue.js.map +1 -1
  39. package/dist/commonjs/utils/padNumber.js +25 -0
  40. package/dist/commonjs/utils/padNumber.js.map +1 -1
  41. package/dist/module/components/DurationScroll/DurationScroll.js +410 -0
  42. package/dist/module/components/DurationScroll/DurationScroll.js.map +1 -0
  43. package/dist/module/components/DurationScroll/index.js +2 -390
  44. package/dist/module/components/DurationScroll/index.js.map +1 -1
  45. package/dist/module/components/DurationScroll/types.js.map +1 -1
  46. package/dist/module/components/Modal/Modal.js +99 -0
  47. package/dist/module/components/Modal/Modal.js.map +1 -0
  48. package/dist/module/components/Modal/index.js +2 -98
  49. package/dist/module/components/Modal/index.js.map +1 -1
  50. package/dist/module/components/TimerPicker/TimerPicker.js +217 -0
  51. package/dist/module/components/TimerPicker/TimerPicker.js.map +1 -0
  52. package/dist/module/components/TimerPicker/index.js +3 -166
  53. package/dist/module/components/TimerPicker/index.js.map +1 -1
  54. package/dist/module/components/TimerPicker/styles.js +1 -1
  55. package/dist/module/components/TimerPicker/styles.js.map +1 -1
  56. package/dist/module/components/TimerPicker/types.js.map +1 -1
  57. package/dist/module/components/TimerPickerModal/TimerPickerModal.js +135 -0
  58. package/dist/module/components/TimerPickerModal/TimerPickerModal.js.map +1 -0
  59. package/dist/module/components/TimerPickerModal/index.js +3 -130
  60. package/dist/module/components/TimerPickerModal/index.js.map +1 -1
  61. package/dist/module/components/TimerPickerModal/types.js.map +1 -1
  62. package/dist/module/index.js +2 -6
  63. package/dist/module/index.js.map +1 -1
  64. package/dist/module/tests/TimerPicker.test.js +4 -1
  65. package/dist/module/tests/TimerPicker.test.js.map +1 -1
  66. package/dist/module/utils/colorToRgba.js +35 -4
  67. package/dist/module/utils/colorToRgba.js.map +1 -1
  68. package/dist/module/utils/generateNumbers.js +68 -0
  69. package/dist/module/utils/generateNumbers.js.map +1 -1
  70. package/dist/module/utils/getAdjustedLimit.js +25 -0
  71. package/dist/module/utils/getAdjustedLimit.js.map +1 -1
  72. package/dist/module/utils/getDurationAndIndexFromScrollOffset.js +38 -0
  73. package/dist/module/utils/getDurationAndIndexFromScrollOffset.js.map +1 -1
  74. package/dist/module/utils/getInitialScrollIndex.js +38 -0
  75. package/dist/module/utils/getInitialScrollIndex.js.map +1 -1
  76. package/dist/module/utils/getSafeInitialValue.js +28 -0
  77. package/dist/module/utils/getSafeInitialValue.js.map +1 -1
  78. package/dist/module/utils/padNumber.js +25 -0
  79. package/dist/module/utils/padNumber.js.map +1 -1
  80. package/dist/typescript/components/DurationScroll/DurationScroll.d.ts +4 -0
  81. package/dist/typescript/components/DurationScroll/index.d.ts +2 -4
  82. package/dist/typescript/components/DurationScroll/types.d.ts +13 -9
  83. package/dist/typescript/components/Modal/Modal.d.ts +5 -0
  84. package/dist/typescript/components/Modal/index.d.ts +2 -5
  85. package/dist/typescript/components/TimerPicker/TimerPicker.d.ts +4 -0
  86. package/dist/typescript/components/TimerPicker/index.d.ts +3 -4
  87. package/dist/typescript/components/TimerPicker/styles.d.ts +1169 -771
  88. package/dist/typescript/components/TimerPicker/types.d.ts +26 -10
  89. package/dist/typescript/components/TimerPickerModal/TimerPickerModal.d.ts +4 -0
  90. package/dist/typescript/components/TimerPickerModal/index.d.ts +3 -4
  91. package/dist/typescript/components/TimerPickerModal/styles.d.ts +722 -474
  92. package/dist/typescript/components/TimerPickerModal/types.d.ts +8 -5
  93. package/dist/typescript/index.d.ts +2 -6
  94. package/dist/typescript/utils/colorToRgba.d.ts +34 -0
  95. package/dist/typescript/utils/generateNumbers.d.ts +66 -0
  96. package/dist/typescript/utils/getAdjustedLimit.d.ts +27 -2
  97. package/dist/typescript/utils/getDurationAndIndexFromScrollOffset.d.ts +38 -0
  98. package/dist/typescript/utils/getInitialScrollIndex.d.ts +38 -0
  99. package/dist/typescript/utils/getSafeInitialValue.d.ts +29 -0
  100. package/dist/typescript/utils/padNumber.d.ts +25 -0
  101. package/package.json +10 -27
@@ -3,397 +3,25 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = void 0;
7
- var _react = _interopRequireWildcard(require("react"));
8
- var _reactNative = require("react-native");
9
- var _colorToRgba = require("../../utils/colorToRgba");
10
- var _generateNumbers = require("../../utils/generateNumbers");
11
- var _getAdjustedLimit = require("../../utils/getAdjustedLimit");
12
- var _getDurationAndIndexFromScrollOffset = require("../../utils/getDurationAndIndexFromScrollOffset");
13
- var _getInitialScrollIndex = require("../../utils/getInitialScrollIndex");
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); }
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; }
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); }
17
- const DurationScroll = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
18
- const {
19
- aggressivelyGetLatestDuration,
20
- allowFontScaling = false,
21
- amLabel,
22
- Audio,
23
- clickSoundAsset,
24
- disableInfiniteScroll = false,
25
- FlatList = _reactNative.FlatList,
26
- Haptics,
27
- initialValue = 0,
28
- interval,
29
- is12HourPicker,
30
- isDisabled,
31
- label,
32
- limit,
33
- LinearGradient,
34
- MaskedView,
35
- maximumValue,
36
- onDurationChange,
37
- padNumbersWithZero = false,
38
- padWithNItems,
39
- pickerFeedback,
40
- pickerGradientOverlayProps,
41
- pmLabel,
42
- repeatNumbersNTimes = 3,
43
- repeatNumbersNTimesNotExplicitlySet,
44
- styles,
45
- testID
46
- } = props;
47
- const numberOfItems = (0, _react.useMemo)(() => {
48
- // guard against negative maximum values
49
- if (maximumValue < 0) {
50
- return 1;
51
- }
52
- return Math.floor(maximumValue / interval) + 1;
53
- }, [interval, maximumValue]);
54
- const safeRepeatNumbersNTimes = (0, _react.useMemo)(() => {
55
- // do not repeat numbers if there is only one option
56
- if (numberOfItems === 1) {
57
- return 1;
58
- }
59
- if (!disableInfiniteScroll && repeatNumbersNTimes < 2) {
60
- return 2;
61
- } else if (repeatNumbersNTimes < 1 || isNaN(repeatNumbersNTimes)) {
62
- return 1;
63
- }
64
-
65
- // if this variable is not explicitly set, we calculate a reasonable value based on
66
- // the number of items in the picker, avoiding regular jumps up/down the list
67
- // whilst avoiding rendering too many items in the picker
68
- if (repeatNumbersNTimesNotExplicitlySet) {
69
- return Math.max(Math.round(180 / numberOfItems), 1);
70
- }
71
- return Math.round(repeatNumbersNTimes);
72
- }, [disableInfiniteScroll, numberOfItems, repeatNumbersNTimes, repeatNumbersNTimesNotExplicitlySet]);
73
- const numbersForFlatList = (0, _react.useMemo)(() => {
74
- if (is12HourPicker) {
75
- return (0, _generateNumbers.generate12HourNumbers)({
76
- padNumbersWithZero,
77
- repeatNTimes: safeRepeatNumbersNTimes,
78
- disableInfiniteScroll,
79
- padWithNItems,
80
- interval
81
- });
82
- }
83
- return (0, _generateNumbers.generateNumbers)(numberOfItems, {
84
- padNumbersWithZero,
85
- repeatNTimes: safeRepeatNumbersNTimes,
86
- disableInfiniteScroll,
87
- padWithNItems,
88
- interval
89
- });
90
- }, [disableInfiniteScroll, is12HourPicker, interval, numberOfItems, padNumbersWithZero, padWithNItems, safeRepeatNumbersNTimes]);
91
- const initialScrollIndex = (0, _react.useMemo)(() => (0, _getInitialScrollIndex.getInitialScrollIndex)({
92
- disableInfiniteScroll,
93
- interval,
94
- numberOfItems,
95
- padWithNItems,
96
- repeatNumbersNTimes: safeRepeatNumbersNTimes,
97
- value: initialValue
98
- }), [disableInfiniteScroll, initialValue, interval, numberOfItems, padWithNItems, safeRepeatNumbersNTimes]);
99
- const adjustedLimited = (0, _react.useMemo)(() => (0, _getAdjustedLimit.getAdjustedLimit)(limit, numberOfItems, interval), [interval, limit, numberOfItems]);
100
- const numberOfItemsToShow = 1 + padWithNItems * 2;
101
-
102
- // keep track of the latest duration as it scrolls
103
- const latestDuration = (0, _react.useRef)(0);
104
- // keep track of the last index scrolled past for haptic/audio feedback
105
- const lastFeedbackIndex = (0, _react.useRef)(0);
106
- const flatListRef = (0, _react.useRef)(null);
107
- const [clickSound, setClickSound] = (0, _react.useState)();
108
-
109
- // Preload the sound when the component mounts
110
- (0, _react.useEffect)(() => {
111
- const loadSound = async () => {
112
- if (Audio) {
113
- const {
114
- sound
115
- } = await Audio.Sound.createAsync(clickSoundAsset ?? {
116
- // use a hosted sound as a fallback (do not use local asset due to loader issues
117
- // in some environments when including mp3 in library)
118
- uri: "https://drive.google.com/uc?export=download&id=10e1YkbNsRh-vGx1jmS1Nntz8xzkBp4_I"
119
- }, {
120
- shouldPlay: false
121
- });
122
- setClickSound(sound);
123
- }
124
- };
125
- loadSound();
126
-
127
- // Unload sound when component unmounts
128
- return () => {
129
- clickSound === null || clickSound === void 0 || clickSound.unloadAsync();
130
- };
131
- // eslint-disable-next-line react-hooks/exhaustive-deps
132
- }, [Audio]);
133
- const renderItem = (0, _react.useCallback)(({
134
- item
135
- }) => {
136
- let stringItem = item;
137
- let intItem;
138
- let isAm;
139
- if (!is12HourPicker) {
140
- intItem = parseInt(item);
141
- } else {
142
- isAm = item.includes("AM");
143
- stringItem = item.replace(/\s[AP]M/g, "");
144
- intItem = parseInt(stringItem);
145
- }
146
- return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
147
- key: item,
148
- style: styles.pickerItemContainer,
149
- testID: "picker-item"
150
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
151
- allowFontScaling: allowFontScaling,
152
- style: [styles.pickerItem, intItem > adjustedLimited.max || intItem < adjustedLimited.min ? styles.disabledPickerItem : {}]
153
- }, stringItem), is12HourPicker ? /*#__PURE__*/_react.default.createElement(_reactNative.View, {
154
- pointerEvents: "none",
155
- style: styles.pickerAmPmContainer
156
- }, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
157
- allowFontScaling: allowFontScaling,
158
- style: [styles.pickerAmPmLabel]
159
- }, isAm ? amLabel : pmLabel)) : null);
160
- }, [adjustedLimited.max, adjustedLimited.min, allowFontScaling, amLabel, is12HourPicker, pmLabel, styles.disabledPickerItem, styles.pickerAmPmContainer, styles.pickerAmPmLabel, styles.pickerItem, styles.pickerItemContainer]);
161
- const onScroll = (0, _react.useCallback)(e => {
162
- // this function is only used when the picker is in a modal and/or has Haptic/Audio feedback
163
- // it is used to ensure that the modal gets the latest duration on clicking
164
- // the confirm button, even if the scrollview is still scrolling
165
- if (!aggressivelyGetLatestDuration && !Haptics && !Audio && !pickerFeedback) {
166
- return;
167
- }
168
- if (aggressivelyGetLatestDuration) {
169
- const newValues = (0, _getDurationAndIndexFromScrollOffset.getDurationAndIndexFromScrollOffset)({
170
- disableInfiniteScroll,
171
- interval,
172
- itemHeight: styles.pickerItemContainer.height,
173
- numberOfItems,
174
- padWithNItems,
175
- yContentOffset: e.nativeEvent.contentOffset.y
176
- });
177
- if (newValues.duration !== latestDuration.current) {
178
- // check limits
179
- if (newValues.duration > adjustedLimited.max) {
180
- newValues.duration = adjustedLimited.max;
181
- } else if (newValues.duration < adjustedLimited.min) {
182
- newValues.duration = adjustedLimited.min;
183
- }
184
- latestDuration.current = newValues.duration;
185
- }
186
- }
187
- if (Haptics || Audio || pickerFeedback) {
188
- const feedbackIndex = Math.round((e.nativeEvent.contentOffset.y + styles.pickerItemContainer.height / 2) / styles.pickerItemContainer.height);
189
- if (feedbackIndex !== lastFeedbackIndex.current) {
190
- // this check stops the feedback firing when the component mounts
191
- if (lastFeedbackIndex.current) {
192
- // fire haptic feedback if available
193
- try {
194
- Haptics === null || Haptics === void 0 || Haptics.selectionAsync();
195
- } catch {
196
- // do nothing
197
- }
198
-
199
- // play click sound if available
200
- try {
201
- clickSound === null || clickSound === void 0 || clickSound.replayAsync();
202
- } catch {
203
- // do nothing
204
- }
205
-
206
- // fire custom feedback if available
207
- try {
208
- pickerFeedback === null || pickerFeedback === void 0 || pickerFeedback();
209
- } catch {
210
- // do nothing
211
- }
212
- }
213
- lastFeedbackIndex.current = feedbackIndex;
214
- }
215
- }
216
- },
217
- // eslint-disable-next-line react-hooks/exhaustive-deps
218
- [adjustedLimited.max, adjustedLimited.min, aggressivelyGetLatestDuration, clickSound, disableInfiniteScroll, interval, numberOfItems, padWithNItems, styles.pickerItemContainer.height]);
219
- const onMomentumScrollEnd = (0, _react.useCallback)(e => {
220
- const newValues = (0, _getDurationAndIndexFromScrollOffset.getDurationAndIndexFromScrollOffset)({
221
- disableInfiniteScroll,
222
- interval,
223
- itemHeight: styles.pickerItemContainer.height,
224
- numberOfItems,
225
- padWithNItems,
226
- yContentOffset: e.nativeEvent.contentOffset.y
227
- });
228
-
229
- // check limits
230
- if (newValues.duration > adjustedLimited.max) {
231
- var _flatListRef$current;
232
- const targetScrollIndex = newValues.index - (newValues.duration - adjustedLimited.max);
233
- (_flatListRef$current = flatListRef.current) === null || _flatListRef$current === void 0 || _flatListRef$current.scrollToIndex({
234
- animated: true,
235
- index:
236
- // guard against scrolling beyond end of list
237
- targetScrollIndex >= 0 ? targetScrollIndex : adjustedLimited.max - 1
238
- }); // scroll down to max
239
- newValues.duration = adjustedLimited.max;
240
- } else if (newValues.duration < adjustedLimited.min) {
241
- var _flatListRef$current2;
242
- const targetScrollIndex = newValues.index + (adjustedLimited.min - newValues.duration);
243
- (_flatListRef$current2 = flatListRef.current) === null || _flatListRef$current2 === void 0 || _flatListRef$current2.scrollToIndex({
244
- animated: true,
245
- index:
246
- // guard against scrolling beyond end of list
247
- targetScrollIndex <= numbersForFlatList.length - 1 ? targetScrollIndex : adjustedLimited.min
248
- }); // scroll up to min
249
- newValues.duration = adjustedLimited.min;
250
- }
251
- onDurationChange(newValues.duration);
252
- }, [disableInfiniteScroll, interval, styles.pickerItemContainer.height, numberOfItems, padWithNItems, adjustedLimited.max, adjustedLimited.min, onDurationChange, numbersForFlatList.length]);
253
- const onViewableItemsChanged = (0, _react.useCallback)(({
254
- viewableItems
255
- }) => {
256
- var _viewableItems$, _viewableItems$2;
257
- if (numberOfItems === 1) {
258
- return;
259
- }
260
- if ((_viewableItems$ = viewableItems[0]) !== null && _viewableItems$ !== void 0 && _viewableItems$.index && viewableItems[0].index < numberOfItems * 0.5) {
261
- var _flatListRef$current3;
262
- (_flatListRef$current3 = flatListRef.current) === null || _flatListRef$current3 === void 0 || _flatListRef$current3.scrollToIndex({
263
- animated: false,
264
- index: viewableItems[0].index + numberOfItems
265
- });
266
- } else if ((_viewableItems$2 = viewableItems[0]) !== null && _viewableItems$2 !== void 0 && _viewableItems$2.index && viewableItems[0].index >= numberOfItems * (safeRepeatNumbersNTimes - 0.5)) {
267
- var _flatListRef$current4;
268
- (_flatListRef$current4 = flatListRef.current) === null || _flatListRef$current4 === void 0 || _flatListRef$current4.scrollToIndex({
269
- animated: false,
270
- index: viewableItems[0].index - numberOfItems
271
- });
272
- }
273
- }, [numberOfItems, safeRepeatNumbersNTimes]);
274
- const [viewabilityConfigCallbackPairs, setViewabilityConfigCallbackPairs] = (0, _react.useState)(!disableInfiniteScroll ? [{
275
- viewabilityConfig: {
276
- viewAreaCoveragePercentThreshold: 0
277
- },
278
- onViewableItemsChanged: onViewableItemsChanged
279
- }] : undefined);
280
- const [flatListRenderKey, setFlatListRenderKey] = (0, _react.useState)(0);
281
- const initialRender = (0, _react.useRef)(true);
282
- (0, _react.useEffect)(() => {
283
- // don't run on first render
284
- if (initialRender.current) {
285
- initialRender.current = false;
286
- return;
287
- }
288
-
289
- // if the onViewableItemsChanged callback changes, we need to update viewabilityConfigCallbackPairs
290
- // which requires the FlatList to be remounted, hence the increase of the FlatList key
291
- setFlatListRenderKey(prev => prev + 1);
292
- setViewabilityConfigCallbackPairs(!disableInfiniteScroll ? [{
293
- viewabilityConfig: {
294
- viewAreaCoveragePercentThreshold: 0
295
- },
296
- onViewableItemsChanged: onViewableItemsChanged
297
- }] : undefined);
298
- }, [disableInfiniteScroll, onViewableItemsChanged]);
299
- const getItemLayout = (0, _react.useCallback)((_, index) => ({
300
- length: styles.pickerItemContainer.height,
301
- offset: styles.pickerItemContainer.height * index,
302
- index
303
- }), [styles.pickerItemContainer.height]);
304
- (0, _react.useImperativeHandle)(ref, () => ({
305
- reset: options => {
306
- var _flatListRef$current5;
307
- (_flatListRef$current5 = flatListRef.current) === null || _flatListRef$current5 === void 0 || _flatListRef$current5.scrollToIndex({
308
- animated: (options === null || options === void 0 ? void 0 : options.animated) ?? false,
309
- index: initialScrollIndex
310
- });
311
- },
312
- setValue: (value, options) => {
313
- var _flatListRef$current6;
314
- (_flatListRef$current6 = flatListRef.current) === null || _flatListRef$current6 === void 0 || _flatListRef$current6.scrollToIndex({
315
- animated: (options === null || options === void 0 ? void 0 : options.animated) ?? false,
316
- index: (0, _getInitialScrollIndex.getInitialScrollIndex)({
317
- disableInfiniteScroll,
318
- interval,
319
- numberOfItems,
320
- padWithNItems,
321
- repeatNumbersNTimes: safeRepeatNumbersNTimes,
322
- value: value
323
- })
324
- });
325
- },
326
- latestDuration: latestDuration
327
- }));
328
- const renderContent = (0, _react.useMemo)(() => {
329
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(FlatList, {
330
- key: flatListRenderKey,
331
- ref: flatListRef,
332
- contentContainerStyle: styles.durationScrollFlatListContentContainer,
333
- data: numbersForFlatList,
334
- decelerationRate: 0.88,
335
- getItemLayout: getItemLayout,
336
- initialScrollIndex: initialScrollIndex,
337
- keyExtractor: (_, index) => index.toString(),
338
- nestedScrollEnabled: true,
339
- onMomentumScrollEnd: onMomentumScrollEnd,
340
- onScroll: onScroll,
341
- renderItem: renderItem,
342
- scrollEnabled: !isDisabled,
343
- scrollEventThrottle: 16,
344
- showsVerticalScrollIndicator: false,
345
- snapToAlignment: "start"
346
- // used in place of snapToInterval due to bug on Android
347
- ,
348
- snapToOffsets: [...Array(numbersForFlatList.length)].map((_, i) => i * styles.pickerItemContainer.height),
349
- style: styles.durationScrollFlatList,
350
- testID: "duration-scroll-flatlist",
351
- viewabilityConfigCallbackPairs: viewabilityConfigCallbackPairs,
352
- windowSize: numberOfItemsToShow
353
- }), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
354
- pointerEvents: "none",
355
- style: styles.pickerLabelContainer
356
- }, typeof label === "string" ? /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
357
- allowFontScaling: allowFontScaling,
358
- style: styles.pickerLabel
359
- }, label) : label ?? null));
360
- }, [FlatList, allowFontScaling, flatListRenderKey, getItemLayout, initialScrollIndex, isDisabled, label, numberOfItemsToShow, numbersForFlatList, onMomentumScrollEnd, onScroll, renderItem, styles.durationScrollFlatList, styles.durationScrollFlatListContentContainer, styles.pickerItemContainer.height, styles.pickerLabel, styles.pickerLabelContainer, viewabilityConfigCallbackPairs]);
361
- const renderLinearGradient = (0, _react.useMemo)(() => {
362
- if (!LinearGradient) {
363
- return null;
364
- }
365
- let colors;
366
- if (MaskedView) {
367
- // if using masked view, we only care about the opacity
368
- colors = ["rgba(0,0,0,0)", "rgba(0,0,0,1)", "rgba(0,0,0,1)", "rgba(0,0,0,0)"];
369
- } else {
370
- const backgroundColor = styles.pickerContainer.backgroundColor ?? "white";
371
- const transparentBackgroundColor = (0, _colorToRgba.colorToRgba)({
372
- color: backgroundColor,
373
- opacity: 0
374
- });
375
- colors = [backgroundColor, transparentBackgroundColor, transparentBackgroundColor, backgroundColor];
376
- }
377
-
378
- // calculate the gradient height to cover the top item and bottom item
379
- const gradientHeight = padWithNItems > 0 ? 1 / (padWithNItems * 2 + 1) : 0.3;
380
- return /*#__PURE__*/_react.default.createElement(LinearGradient, _extends({
381
- colors: colors,
382
- locations: [0, gradientHeight, 1 - gradientHeight, 1],
383
- pointerEvents: "none",
384
- style: styles.pickerGradientOverlay
385
- }, pickerGradientOverlayProps));
386
- }, [LinearGradient, MaskedView, padWithNItems, pickerGradientOverlayProps, styles.pickerContainer.backgroundColor, styles.pickerGradientOverlay]);
387
- return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
388
- pointerEvents: isDisabled ? "none" : undefined,
389
- style: [styles.durationScrollFlatListContainer, {
390
- height: styles.pickerItemContainer.height * numberOfItemsToShow
391
- }, isDisabled && styles.disabledPickerContainer],
392
- testID: testID
393
- }, MaskedView ? /*#__PURE__*/_react.default.createElement(MaskedView, {
394
- maskElement: renderLinearGradient,
395
- style: [styles.maskedView]
396
- }, renderContent) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, renderContent, renderLinearGradient));
6
+ var _exportNames = {};
7
+ Object.defineProperty(exports, "default", {
8
+ enumerable: true,
9
+ get: function () {
10
+ return _DurationScroll.default;
11
+ }
12
+ });
13
+ var _DurationScroll = _interopRequireDefault(require("./DurationScroll"));
14
+ var _types = require("./types");
15
+ Object.keys(_types).forEach(function (key) {
16
+ if (key === "default" || key === "__esModule") return;
17
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
18
+ if (key in exports && exports[key] === _types[key]) return;
19
+ Object.defineProperty(exports, key, {
20
+ enumerable: true,
21
+ get: function () {
22
+ return _types[key];
23
+ }
24
+ });
397
25
  });
398
- var _default = exports.default = /*#__PURE__*/_react.default.memo(DurationScroll);
26
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
399
27
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
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","clickSoundAsset","disableInfiniteScroll","FlatList","RNFlatList","Haptics","initialValue","interval","is12HourPicker","isDisabled","label","limit","LinearGradient","MaskedView","maximumValue","onDurationChange","padNumbersWithZero","padWithNItems","pickerFeedback","pickerGradientOverlayProps","pmLabel","repeatNumbersNTimes","repeatNumbersNTimesNotExplicitlySet","styles","testID","numberOfItems","useMemo","Math","floor","safeRepeatNumbersNTimes","isNaN","max","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","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","viewabilityConfigCallbackPairs","setViewabilityConfigCallbackPairs","viewabilityConfig","viewAreaCoveragePercentThreshold","undefined","flatListRenderKey","setFlatListRenderKey","initialRender","prev","getItemLayout","_","offset","useImperativeHandle","reset","options","_flatListRef$current5","setValue","_flatListRef$current6","renderContent","Fragment","contentContainerStyle","durationScrollFlatListContentContainer","data","decelerationRate","keyExtractor","toString","nestedScrollEnabled","scrollEnabled","scrollEventThrottle","showsVerticalScrollIndicator","snapToAlignment","snapToOffsets","Array","map","durationScrollFlatList","windowSize","pickerLabelContainer","pickerLabel","renderLinearGradient","colors","backgroundColor","pickerContainer","transparentBackgroundColor","colorToRgba","color","opacity","gradientHeight","locations","pickerGradientOverlay","durationScrollFlatListContainer","disabledPickerContainer","maskElement","maskedView","_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 clickSoundAsset,\n disableInfiniteScroll = false,\n FlatList = RNFlatList,\n Haptics,\n initialValue = 0,\n interval,\n is12HourPicker,\n isDisabled,\n label,\n limit,\n LinearGradient,\n MaskedView,\n maximumValue,\n onDurationChange,\n padNumbersWithZero = false,\n padWithNItems,\n pickerFeedback,\n pickerGradientOverlayProps,\n pmLabel,\n repeatNumbersNTimes = 3,\n repeatNumbersNTimesNotExplicitlySet,\n styles,\n testID,\n } = props;\n\n const numberOfItems = useMemo(() => {\n // guard against negative maximum values\n if (maximumValue < 0) {\n return 1;\n }\n\n return Math.floor(maximumValue / interval) + 1;\n }, [interval, maximumValue]);\n\n const safeRepeatNumbersNTimes = useMemo(() => {\n // do not repeat numbers if there is only one option\n if (numberOfItems === 1) {\n return 1;\n }\n\n if (!disableInfiniteScroll && repeatNumbersNTimes < 2) {\n return 2;\n } else if (repeatNumbersNTimes < 1 || isNaN(repeatNumbersNTimes)) {\n return 1;\n }\n\n // if this variable is not explicitly set, we calculate a reasonable value based on\n // the number of items in the picker, avoiding regular jumps up/down the list\n // whilst avoiding rendering too many items in the picker\n if (repeatNumbersNTimesNotExplicitlySet) {\n return Math.max(Math.round(180 / numberOfItems), 1);\n }\n\n return Math.round(repeatNumbersNTimes);\n }, [\n disableInfiniteScroll,\n numberOfItems,\n repeatNumbersNTimes,\n repeatNumbersNTimesNotExplicitlySet,\n ]);\n\n const numbersForFlatList = useMemo(() => {\n if (is12HourPicker) {\n return generate12HourNumbers({\n padNumbersWithZero,\n repeatNTimes: safeRepeatNumbersNTimes,\n disableInfiniteScroll,\n padWithNItems,\n interval,\n });\n }\n\n return generateNumbers(numberOfItems, {\n padNumbersWithZero,\n repeatNTimes: safeRepeatNumbersNTimes,\n disableInfiniteScroll,\n padWithNItems,\n interval,\n });\n }, [\n disableInfiniteScroll,\n is12HourPicker,\n interval,\n numberOfItems,\n padNumbersWithZero,\n padWithNItems,\n safeRepeatNumbersNTimes,\n ]);\n\n const initialScrollIndex = useMemo(\n () =>\n getInitialScrollIndex({\n disableInfiniteScroll,\n interval,\n numberOfItems,\n padWithNItems,\n repeatNumbersNTimes: safeRepeatNumbersNTimes,\n value: initialValue,\n }),\n [\n disableInfiniteScroll,\n initialValue,\n interval,\n numberOfItems,\n padWithNItems,\n safeRepeatNumbersNTimes,\n ]\n );\n\n const adjustedLimited = useMemo(\n () => getAdjustedLimit(limit, numberOfItems, interval),\n [interval, 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 (\n !aggressivelyGetLatestDuration &&\n !Haptics &&\n !Audio &&\n !pickerFeedback\n ) {\n return;\n }\n\n if (aggressivelyGetLatestDuration) {\n const newValues = getDurationAndIndexFromScrollOffset({\n disableInfiniteScroll,\n interval,\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 || pickerFeedback) {\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 // fire custom feedback if available\n try {\n pickerFeedback?.();\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 interval,\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 interval,\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 disableInfiniteScroll,\n interval,\n styles.pickerItemContainer.height,\n numberOfItems,\n padWithNItems,\n adjustedLimited.max,\n adjustedLimited.min,\n onDurationChange,\n numbersForFlatList.length,\n ]\n );\n\n const onViewableItemsChanged = useCallback(\n ({ viewableItems }: { viewableItems: ViewToken[] }) => {\n if (numberOfItems === 1) {\n return;\n }\n\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 [\n viewabilityConfigCallbackPairs,\n setViewabilityConfigCallbackPairs,\n ] = useState<ViewabilityConfigCallbackPairs | undefined>(\n !disableInfiniteScroll\n ? [\n {\n viewabilityConfig: {\n viewAreaCoveragePercentThreshold: 0,\n },\n onViewableItemsChanged: onViewableItemsChanged,\n },\n ]\n : undefined\n );\n\n const [flatListRenderKey, setFlatListRenderKey] = useState(0);\n\n const initialRender = useRef(true);\n\n useEffect(() => {\n // don't run on first render\n if (initialRender.current) {\n initialRender.current = false;\n return;\n }\n\n // if the onViewableItemsChanged callback changes, we need to update viewabilityConfigCallbackPairs\n // which requires the FlatList to be remounted, hence the increase of the FlatList key\n setFlatListRenderKey((prev) => prev + 1);\n setViewabilityConfigCallbackPairs(\n !disableInfiniteScroll\n ? [\n {\n viewabilityConfig: {\n viewAreaCoveragePercentThreshold: 0,\n },\n onViewableItemsChanged: onViewableItemsChanged,\n },\n ]\n : undefined\n );\n }, [disableInfiniteScroll, onViewableItemsChanged]);\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 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 interval,\n numberOfItems,\n padWithNItems,\n repeatNumbersNTimes: safeRepeatNumbersNTimes,\n value: value,\n }),\n });\n },\n latestDuration: latestDuration,\n }));\n\n const renderContent = useMemo(() => {\n return (\n <>\n <FlatList\n key={flatListRenderKey}\n ref={flatListRef}\n contentContainerStyle={\n styles.durationScrollFlatListContentContainer\n }\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 snapToInterval due to bug on Android\n snapToOffsets={[\n ...Array(numbersForFlatList.length),\n ].map((_, i) => i * styles.pickerItemContainer.height)}\n style={styles.durationScrollFlatList}\n testID=\"duration-scroll-flatlist\"\n viewabilityConfigCallbackPairs={\n viewabilityConfigCallbackPairs\n }\n windowSize={numberOfItemsToShow}\n />\n <View\n pointerEvents=\"none\"\n 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 </>\n );\n }, [\n FlatList,\n allowFontScaling,\n flatListRenderKey,\n getItemLayout,\n initialScrollIndex,\n isDisabled,\n label,\n numberOfItemsToShow,\n numbersForFlatList,\n onMomentumScrollEnd,\n onScroll,\n renderItem,\n styles.durationScrollFlatList,\n styles.durationScrollFlatListContentContainer,\n styles.pickerItemContainer.height,\n styles.pickerLabel,\n styles.pickerLabelContainer,\n viewabilityConfigCallbackPairs,\n ]);\n\n const renderLinearGradient = useMemo(() => {\n if (!LinearGradient) {\n return null;\n }\n\n let colors: string[];\n\n if (MaskedView) {\n // if using masked view, we only care about the opacity\n colors = [\n \"rgba(0,0,0,0)\",\n \"rgba(0,0,0,1)\",\n \"rgba(0,0,0,1)\",\n \"rgba(0,0,0,0)\",\n ];\n } else {\n const backgroundColor =\n styles.pickerContainer.backgroundColor ?? \"white\";\n const transparentBackgroundColor = colorToRgba({\n color: backgroundColor,\n opacity: 0,\n });\n colors = [\n backgroundColor,\n transparentBackgroundColor,\n transparentBackgroundColor,\n backgroundColor,\n ];\n }\n\n // calculate the gradient height to cover the top item and bottom item\n const gradientHeight =\n padWithNItems > 0 ? 1 / (padWithNItems * 2 + 1) : 0.3;\n\n return (\n <LinearGradient\n colors={colors}\n locations={[0, gradientHeight, 1 - gradientHeight, 1]}\n pointerEvents=\"none\"\n style={styles.pickerGradientOverlay}\n {...pickerGradientOverlayProps}\n />\n );\n }, [\n LinearGradient,\n MaskedView,\n padWithNItems,\n pickerGradientOverlayProps,\n styles.pickerContainer.backgroundColor,\n styles.pickerGradientOverlay,\n ]);\n\n return (\n <View\n pointerEvents={isDisabled ? \"none\" : undefined}\n style={[\n styles.durationScrollFlatListContainer,\n {\n height:\n styles.pickerItemContainer.height *\n numberOfItemsToShow,\n },\n isDisabled && styles.disabledPickerContainer,\n ]}\n testID={testID}>\n {MaskedView ? (\n <MaskedView\n maskElement={renderLinearGradient}\n style={[styles.maskedView]}>\n {renderContent}\n </MaskedView>\n ) : (\n <>\n {renderContent}\n {renderLinearGradient}\n </>\n )}\n </View>\n );\n }\n);\n\nexport default React.memo(DurationScroll);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_DurationScroll","_interopRequireDefault","require","_types","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","e","__esModule","default"],"sources":["index.ts"],"sourcesContent":["export { default } from \"./DurationScroll\";\n\nexport * from \"./types\";\n"],"mappings":";;;;;;;;;;;;AAAA,IAAAA,eAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,MAAA,GAAAD,OAAA;AAAAE,MAAA,CAAAC,IAAA,CAAAF,MAAA,EAAAG,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAJ,MAAA,CAAAI,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAZ,MAAA,CAAAI,GAAA;IAAA;EAAA;AAAA;AAAwB,SAAAN,uBAAAe,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA","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 MaskedView?: any;\n aggressivelyGetLatestDuration: boolean;\n allowFontScaling?: boolean;\n amLabel?: string;\n clickSoundAsset?: SoundAssetType;\n disableInfiniteScroll?: boolean;\n initialValue?: number;\n interval: number;\n is12HourPicker?: boolean;\n isDisabled?: boolean;\n label?: string | React.ReactElement;\n limit?: LimitType;\n maximumValue: number;\n onDurationChange: (duration: number) => void;\n padNumbersWithZero?: boolean;\n padWithNItems: number;\n pickerFeedback?: () => void | Promise<void>;\n pickerGradientOverlayProps?: Partial<LinearGradientProps>;\n pmLabel?: string;\n repeatNumbersNTimes?: number;\n repeatNumbersNTimesNotExplicitlySet: boolean;\n styles: ReturnType<typeof generateStyles>;\n testID?: string;\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 { RefObject } from \"react\";\n\nimport type { View } from \"react-native\";\n\nimport type { generateStyles } from \"../TimerPicker/styles\";\n\nexport interface DurationScrollProps {\n Audio?: any;\n FlatList?: any;\n Haptics?: any;\n LinearGradient?: any;\n MaskedView?: any;\n aggressivelyGetLatestDuration: boolean;\n allowFontScaling?: boolean;\n amLabel?: string;\n clickSoundAsset?: SoundAsset;\n decelerationRate?: number | \"normal\" | \"fast\";\n disableInfiniteScroll?: boolean;\n initialValue?: number;\n interval: number;\n is12HourPicker?: boolean;\n isDisabled?: boolean;\n label?: string | React.ReactElement;\n limit?: Limit;\n maximumValue: number;\n onDurationChange: (duration: number) => void;\n padNumbersWithZero?: boolean;\n padWithNItems: number;\n pickerFeedback?: () => void | Promise<void>;\n pickerGradientOverlayProps?: Partial<LinearGradientProps>;\n pmLabel?: string;\n repeatNumbersNTimes?: number;\n repeatNumbersNTimesNotExplicitlySet: boolean;\n styles: ReturnType<typeof generateStyles>;\n testID?: string;\n}\n\nexport interface DurationScrollRef {\n latestDuration: RefObject<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 Limit = {\n max?: number;\n min?: number;\n};\n\nexport type SoundAsset =\n | number\n | {\n headers?: Record<string, string>;\n overrideFileExtensionAndroid?: string;\n uri: string;\n };\n\nexport type ExpoAvAudioInstance = {\n replayAsync: () => Promise<void>;\n unloadAsync: () => Promise<void>;\n};\n"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.Modal = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _reactNative = require("react-native");
9
+ var _styles = require("./styles");
10
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
11
+ 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); }
12
+ const Modal = props => {
13
+ const {
14
+ animationDuration = 300,
15
+ children,
16
+ contentStyle,
17
+ isVisible = false,
18
+ modalProps,
19
+ onHide,
20
+ onOverlayPress,
21
+ overlayOpacity = 0.4,
22
+ overlayStyle,
23
+ testID = "modal"
24
+ } = props;
25
+ const {
26
+ height: screenHeight,
27
+ width: screenWidth
28
+ } = (0, _reactNative.useWindowDimensions)();
29
+ const isMounted = (0, _react.useRef)(false);
30
+ const animatedOpacity = (0, _react.useRef)(new _reactNative.Animated.Value(0));
31
+ (0, _react.useEffect)(() => {
32
+ isMounted.current = true;
33
+ if (isVisible) {
34
+ show();
35
+ }
36
+ return () => {
37
+ isMounted.current = false;
38
+ };
39
+ // eslint-disable-next-line react-hooks/exhaustive-deps
40
+ }, []);
41
+ const backdropAnimatedStyle = {
42
+ opacity: animatedOpacity.current.interpolate({
43
+ inputRange: [0, 1],
44
+ outputRange: [0, overlayOpacity]
45
+ })
46
+ };
47
+ const contentAnimatedStyle = {
48
+ transform: [{
49
+ translateY: animatedOpacity.current.interpolate({
50
+ inputRange: [0, 1],
51
+ outputRange: [screenHeight, 0],
52
+ extrapolate: "clamp"
53
+ })
54
+ }]
55
+ };
56
+ const show = (0, _react.useCallback)(() => {
57
+ _reactNative.Animated.timing(animatedOpacity.current, {
58
+ easing: _reactNative.Easing.inOut(_reactNative.Easing.quad),
59
+ // Using native driver in the modal makes the content flash
60
+ useNativeDriver: true,
61
+ duration: animationDuration,
62
+ toValue: 1
63
+ }).start();
64
+ }, [animationDuration]);
65
+ const hide = (0, _react.useCallback)(() => {
66
+ _reactNative.Animated.timing(animatedOpacity.current, {
67
+ easing: _reactNative.Easing.inOut(_reactNative.Easing.quad),
68
+ // Using native driver in the modal makes the content flash
69
+ useNativeDriver: true,
70
+ duration: animationDuration,
71
+ toValue: 0
72
+ }).start(() => {
73
+ if (isMounted.current) {
74
+ onHide === null || onHide === void 0 || onHide();
75
+ }
76
+ });
77
+ }, [animationDuration, onHide]);
78
+ (0, _react.useEffect)(() => {
79
+ if (isVisible) {
80
+ show();
81
+ } else {
82
+ hide();
83
+ }
84
+ // eslint-disable-next-line react-hooks/exhaustive-deps
85
+ }, [isVisible]);
86
+ return /*#__PURE__*/_react.default.createElement(_reactNative.Modal, _extends({
87
+ animationType: "fade",
88
+ transparent: true,
89
+ visible: isVisible
90
+ }, modalProps, {
91
+ testID: testID
92
+ }), /*#__PURE__*/_react.default.createElement(_reactNative.TouchableWithoutFeedback, {
93
+ onPress: onOverlayPress,
94
+ testID: "modal-backdrop"
95
+ }, /*#__PURE__*/_react.default.createElement(_reactNative.Animated.View, {
96
+ style: [_styles.styles.backdrop, backdropAnimatedStyle, {
97
+ width: screenWidth,
98
+ height: screenHeight
99
+ }, overlayStyle]
100
+ })), /*#__PURE__*/_react.default.createElement(_reactNative.Animated.View, {
101
+ pointerEvents: "box-none",
102
+ style: [_styles.styles.content, contentAnimatedStyle, contentStyle]
103
+ }, children));
104
+ };
105
+ exports.Modal = Modal;
106
+ var _default = exports.default = /*#__PURE__*/_react.default.memo(Modal);
107
+ //# sourceMappingURL=Modal.js.map