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