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