react-native-timer-picker 2.6.0 → 2.6.1

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 (181) hide show
  1. package/dist/commonjs/components/DurationScroll/DurationScroll.js +426 -0
  2. package/dist/commonjs/components/DurationScroll/DurationScroll.js.map +1 -0
  3. package/dist/commonjs/components/DurationScroll/index.js +27 -0
  4. package/dist/commonjs/components/DurationScroll/index.js.map +1 -0
  5. package/dist/commonjs/components/DurationScroll/types.js +6 -0
  6. package/dist/commonjs/components/DurationScroll/types.js.map +1 -0
  7. package/dist/commonjs/components/Modal/Modal.js +107 -0
  8. package/dist/commonjs/components/Modal/Modal.js.map +1 -0
  9. package/dist/commonjs/components/Modal/index.js +27 -0
  10. package/dist/commonjs/components/Modal/index.js.map +1 -0
  11. package/dist/commonjs/components/Modal/styles.js +25 -0
  12. package/dist/commonjs/components/Modal/styles.js.map +1 -0
  13. package/dist/commonjs/components/Modal/types.js +6 -0
  14. package/dist/commonjs/components/Modal/types.js.map +1 -0
  15. package/dist/commonjs/components/PickerItem/PickerItem.js +48 -0
  16. package/dist/commonjs/components/PickerItem/PickerItem.js.map +1 -0
  17. package/dist/commonjs/components/PickerItem/index.js +14 -0
  18. package/dist/commonjs/components/PickerItem/index.js.map +1 -0
  19. package/dist/commonjs/components/TimerPicker/TimerPicker.js +266 -0
  20. package/dist/commonjs/components/TimerPicker/TimerPicker.js.map +1 -0
  21. package/dist/commonjs/components/TimerPicker/index.js +39 -0
  22. package/dist/commonjs/components/TimerPicker/index.js.map +1 -0
  23. package/dist/commonjs/components/TimerPicker/styles.js +140 -0
  24. package/dist/commonjs/components/TimerPicker/styles.js.map +1 -0
  25. package/dist/commonjs/components/TimerPicker/types.js +6 -0
  26. package/dist/commonjs/components/TimerPicker/types.js.map +1 -0
  27. package/dist/commonjs/components/TimerPickerModal/TimerPickerModal.js +173 -0
  28. package/dist/commonjs/components/TimerPickerModal/TimerPickerModal.js.map +1 -0
  29. package/dist/commonjs/components/TimerPickerModal/index.js +39 -0
  30. package/dist/commonjs/components/TimerPickerModal/index.js.map +1 -0
  31. package/dist/commonjs/components/TimerPickerModal/styles.js +95 -0
  32. package/dist/commonjs/components/TimerPickerModal/styles.js.map +1 -0
  33. package/dist/commonjs/components/TimerPickerModal/types.js +6 -0
  34. package/dist/commonjs/components/TimerPickerModal/types.js.map +1 -0
  35. package/dist/commonjs/index.js +21 -0
  36. package/dist/commonjs/index.js.map +1 -0
  37. package/dist/commonjs/tests/DurationScroll.test.js +163 -0
  38. package/dist/commonjs/tests/DurationScroll.test.js.map +1 -0
  39. package/dist/commonjs/tests/Modal.test.js +99 -0
  40. package/dist/commonjs/tests/Modal.test.js.map +1 -0
  41. package/dist/commonjs/tests/TimerPicker.test.js +161 -0
  42. package/dist/commonjs/tests/TimerPicker.test.js.map +1 -0
  43. package/dist/commonjs/tests/TimerPickerModal.test.js +276 -0
  44. package/dist/commonjs/tests/TimerPickerModal.test.js.map +1 -0
  45. package/dist/commonjs/tests/colorToRgba.test.js +176 -0
  46. package/dist/commonjs/tests/colorToRgba.test.js.map +1 -0
  47. package/dist/commonjs/tests/generateNumbers.test.js +350 -0
  48. package/dist/commonjs/tests/generateNumbers.test.js.map +1 -0
  49. package/dist/commonjs/tests/getAdjustedLimit.test.js +324 -0
  50. package/dist/commonjs/tests/getAdjustedLimit.test.js.map +1 -0
  51. package/dist/commonjs/tests/getDurationAndIndexFromScrollOffset.test.js +424 -0
  52. package/dist/commonjs/tests/getDurationAndIndexFromScrollOffset.test.js.map +1 -0
  53. package/dist/commonjs/tests/getInitialScrollIndex.test.js +396 -0
  54. package/dist/commonjs/tests/getInitialScrollIndex.test.js.map +1 -0
  55. package/dist/commonjs/tests/getSafeInitialValue.test.js +499 -0
  56. package/dist/commonjs/tests/getSafeInitialValue.test.js.map +1 -0
  57. package/dist/commonjs/tests/padNumber.test.js +301 -0
  58. package/dist/commonjs/tests/padNumber.test.js.map +1 -0
  59. package/dist/commonjs/utils/colorToRgba.js +87 -0
  60. package/dist/commonjs/utils/colorToRgba.js.map +1 -0
  61. package/dist/commonjs/utils/generateNumbers.js +124 -0
  62. package/dist/commonjs/utils/generateNumbers.js.map +1 -0
  63. package/dist/commonjs/utils/getAdjustedLimit.js +58 -0
  64. package/dist/commonjs/utils/getAdjustedLimit.js.map +1 -0
  65. package/dist/commonjs/utils/getDurationAndIndexFromScrollOffset.js +62 -0
  66. package/dist/commonjs/utils/getDurationAndIndexFromScrollOffset.js.map +1 -0
  67. package/dist/commonjs/utils/getInitialScrollIndex.js +57 -0
  68. package/dist/commonjs/utils/getInitialScrollIndex.js.map +1 -0
  69. package/dist/commonjs/utils/getSafeInitialValue.js +41 -0
  70. package/dist/commonjs/utils/getSafeInitialValue.js.map +1 -0
  71. package/dist/commonjs/utils/padNumber.js +40 -0
  72. package/dist/commonjs/utils/padNumber.js.map +1 -0
  73. package/dist/module/components/DurationScroll/DurationScroll.js +418 -0
  74. package/dist/module/components/DurationScroll/DurationScroll.js.map +1 -0
  75. package/dist/module/components/DurationScroll/index.js +3 -0
  76. package/dist/module/components/DurationScroll/index.js.map +1 -0
  77. package/dist/module/components/DurationScroll/types.js +2 -0
  78. package/dist/module/components/DurationScroll/types.js.map +1 -0
  79. package/dist/module/components/Modal/Modal.js +99 -0
  80. package/dist/module/components/Modal/Modal.js.map +1 -0
  81. package/dist/module/components/Modal/index.js +3 -0
  82. package/dist/module/components/Modal/index.js.map +1 -0
  83. package/dist/module/components/Modal/styles.js +19 -0
  84. package/dist/module/components/Modal/styles.js.map +1 -0
  85. package/dist/module/components/Modal/types.js +2 -0
  86. package/dist/module/components/Modal/types.js.map +1 -0
  87. package/dist/module/components/PickerItem/PickerItem.js +41 -0
  88. package/dist/module/components/PickerItem/PickerItem.js.map +1 -0
  89. package/dist/module/components/PickerItem/index.js +2 -0
  90. package/dist/module/components/PickerItem/index.js.map +1 -0
  91. package/dist/module/components/TimerPicker/TimerPicker.js +258 -0
  92. package/dist/module/components/TimerPicker/TimerPicker.js.map +1 -0
  93. package/dist/module/components/TimerPicker/index.js +4 -0
  94. package/dist/module/components/TimerPicker/index.js.map +1 -0
  95. package/dist/module/components/TimerPicker/styles.js +133 -0
  96. package/dist/module/components/TimerPicker/styles.js.map +1 -0
  97. package/dist/module/components/TimerPicker/types.js +2 -0
  98. package/dist/module/components/TimerPicker/types.js.map +1 -0
  99. package/dist/module/components/TimerPickerModal/TimerPickerModal.js +165 -0
  100. package/dist/module/components/TimerPickerModal/TimerPickerModal.js.map +1 -0
  101. package/dist/module/components/TimerPickerModal/index.js +4 -0
  102. package/dist/module/components/TimerPickerModal/index.js.map +1 -0
  103. package/dist/module/components/TimerPickerModal/styles.js +88 -0
  104. package/dist/module/components/TimerPickerModal/styles.js.map +1 -0
  105. package/dist/module/components/TimerPickerModal/types.js +2 -0
  106. package/dist/module/components/TimerPickerModal/types.js.map +1 -0
  107. package/dist/module/index.js +3 -0
  108. package/dist/module/index.js.map +1 -0
  109. package/dist/module/tests/DurationScroll.test.js +160 -0
  110. package/dist/module/tests/DurationScroll.test.js.map +1 -0
  111. package/dist/module/tests/Modal.test.js +96 -0
  112. package/dist/module/tests/Modal.test.js.map +1 -0
  113. package/dist/module/tests/TimerPicker.test.js +159 -0
  114. package/dist/module/tests/TimerPicker.test.js.map +1 -0
  115. package/dist/module/tests/TimerPickerModal.test.js +273 -0
  116. package/dist/module/tests/TimerPickerModal.test.js.map +1 -0
  117. package/dist/module/tests/colorToRgba.test.js +174 -0
  118. package/dist/module/tests/colorToRgba.test.js.map +1 -0
  119. package/dist/module/tests/generateNumbers.test.js +348 -0
  120. package/dist/module/tests/generateNumbers.test.js.map +1 -0
  121. package/dist/module/tests/getAdjustedLimit.test.js +322 -0
  122. package/dist/module/tests/getAdjustedLimit.test.js.map +1 -0
  123. package/dist/module/tests/getDurationAndIndexFromScrollOffset.test.js +422 -0
  124. package/dist/module/tests/getDurationAndIndexFromScrollOffset.test.js.map +1 -0
  125. package/dist/module/tests/getInitialScrollIndex.test.js +394 -0
  126. package/dist/module/tests/getInitialScrollIndex.test.js.map +1 -0
  127. package/dist/module/tests/getSafeInitialValue.test.js +496 -0
  128. package/dist/module/tests/getSafeInitialValue.test.js.map +1 -0
  129. package/dist/module/tests/padNumber.test.js +299 -0
  130. package/dist/module/tests/padNumber.test.js.map +1 -0
  131. package/dist/module/utils/colorToRgba.js +80 -0
  132. package/dist/module/utils/colorToRgba.js.map +1 -0
  133. package/dist/module/utils/generateNumbers.js +117 -0
  134. package/dist/module/utils/generateNumbers.js.map +1 -0
  135. package/dist/module/utils/getAdjustedLimit.js +51 -0
  136. package/dist/module/utils/getAdjustedLimit.js.map +1 -0
  137. package/dist/module/utils/getDurationAndIndexFromScrollOffset.js +55 -0
  138. package/dist/module/utils/getDurationAndIndexFromScrollOffset.js.map +1 -0
  139. package/dist/module/utils/getInitialScrollIndex.js +50 -0
  140. package/dist/module/utils/getInitialScrollIndex.js.map +1 -0
  141. package/dist/module/utils/getSafeInitialValue.js +34 -0
  142. package/dist/module/utils/getSafeInitialValue.js.map +1 -0
  143. package/dist/module/utils/padNumber.js +33 -0
  144. package/dist/module/utils/padNumber.js.map +1 -0
  145. package/dist/typescript/components/DurationScroll/DurationScroll.d.ts +4 -0
  146. package/dist/typescript/components/DurationScroll/index.d.ts +2 -0
  147. package/dist/typescript/components/DurationScroll/types.d.ts +70 -0
  148. package/dist/typescript/components/Modal/Modal.d.ts +5 -0
  149. package/dist/typescript/components/Modal/index.d.ts +2 -0
  150. package/dist/typescript/components/Modal/styles.d.ts +17 -0
  151. package/dist/typescript/components/Modal/types.d.ts +16 -0
  152. package/dist/typescript/components/PickerItem/PickerItem.d.ts +19 -0
  153. package/dist/typescript/components/PickerItem/index.d.ts +1 -0
  154. package/dist/typescript/components/TimerPicker/TimerPicker.d.ts +4 -0
  155. package/dist/typescript/components/TimerPicker/index.d.ts +3 -0
  156. package/dist/typescript/components/TimerPicker/styles.d.ts +1583 -0
  157. package/dist/typescript/components/TimerPicker/types.d.ts +91 -0
  158. package/dist/typescript/components/TimerPickerModal/TimerPickerModal.d.ts +4 -0
  159. package/dist/typescript/components/TimerPickerModal/index.d.ts +3 -0
  160. package/dist/typescript/components/TimerPickerModal/styles.d.ts +952 -0
  161. package/dist/typescript/components/TimerPickerModal/types.d.ts +56 -0
  162. package/dist/typescript/index.d.ts +4 -0
  163. package/dist/typescript/tests/DurationScroll.test.d.ts +1 -0
  164. package/dist/typescript/tests/Modal.test.d.ts +1 -0
  165. package/dist/typescript/tests/TimerPicker.test.d.ts +1 -0
  166. package/dist/typescript/tests/TimerPickerModal.test.d.ts +1 -0
  167. package/dist/typescript/tests/colorToRgba.test.d.ts +1 -0
  168. package/dist/typescript/tests/generateNumbers.test.d.ts +1 -0
  169. package/dist/typescript/tests/getAdjustedLimit.test.d.ts +1 -0
  170. package/dist/typescript/tests/getDurationAndIndexFromScrollOffset.test.d.ts +1 -0
  171. package/dist/typescript/tests/getInitialScrollIndex.test.d.ts +1 -0
  172. package/dist/typescript/tests/getSafeInitialValue.test.d.ts +1 -0
  173. package/dist/typescript/tests/padNumber.test.d.ts +1 -0
  174. package/dist/typescript/utils/colorToRgba.d.ts +38 -0
  175. package/dist/typescript/utils/generateNumbers.d.ts +80 -0
  176. package/dist/typescript/utils/getAdjustedLimit.d.ts +30 -0
  177. package/dist/typescript/utils/getDurationAndIndexFromScrollOffset.d.ts +49 -0
  178. package/dist/typescript/utils/getInitialScrollIndex.d.ts +46 -0
  179. package/dist/typescript/utils/getSafeInitialValue.d.ts +38 -0
  180. package/dist/typescript/utils/padNumber.d.ts +28 -0
  181. package/package.json +3 -2
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getDurationAndIndexFromScrollOffset = void 0;
7
+ /**
8
+ * Calculates the duration value and index from a scroll offset in a number picker.
9
+ * Handles both infinite and non-infinite scroll modes, taking into account padding and item height.
10
+ *
11
+ * @param {Object} variables - Configuration object for scroll offset calculation
12
+ * @param {boolean} variables.disableInfiniteScroll - Whether infinite scroll is disabled
13
+ * @param {number} variables.interval - The interval between consecutive numbers
14
+ * @param {number} variables.itemHeight - Height of each item in the picker
15
+ * @param {number} variables.numberOfItems - Total number of items in the picker
16
+ * @param {number} variables.padWithNItems - Number of empty items to pad with
17
+ * @param {number} variables.yContentOffset - The vertical scroll offset
18
+ *
19
+ * @returns {{ duration: number; index: number }} Object containing the calculated duration and index
20
+ *
21
+ * @example
22
+ * // With infinite scroll enabled
23
+ * getDurationAndIndexFromScrollOffset({
24
+ * disableInfiniteScroll: false,
25
+ * interval: 1,
26
+ * itemHeight: 50,
27
+ * numberOfItems: 24,
28
+ * padWithNItems: 2,
29
+ * yContentOffset: 100
30
+ * })
31
+ * // Returns: { duration: 2, index: 2 }
32
+ *
33
+ * @example
34
+ * // With infinite scroll disabled
35
+ * getDurationAndIndexFromScrollOffset({
36
+ * disableInfiniteScroll: true,
37
+ * interval: 1,
38
+ * itemHeight: 50,
39
+ * numberOfItems: 24,
40
+ * padWithNItems: 2,
41
+ * yContentOffset: 100
42
+ * })
43
+ * // Returns: { duration: 2, index: 2 }
44
+ */
45
+ const getDurationAndIndexFromScrollOffset = variables => {
46
+ const {
47
+ disableInfiniteScroll,
48
+ interval,
49
+ itemHeight,
50
+ numberOfItems,
51
+ padWithNItems,
52
+ yContentOffset
53
+ } = variables;
54
+ const index = Math.round(yContentOffset / itemHeight);
55
+ const duration = (disableInfiniteScroll ? index : index + padWithNItems) % numberOfItems * interval;
56
+ return {
57
+ duration,
58
+ index
59
+ };
60
+ };
61
+ exports.getDurationAndIndexFromScrollOffset = getDurationAndIndexFromScrollOffset;
62
+ //# sourceMappingURL=getDurationAndIndexFromScrollOffset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["getDurationAndIndexFromScrollOffset","variables","disableInfiniteScroll","interval","itemHeight","numberOfItems","padWithNItems","yContentOffset","index","Math","round","duration","exports"],"sources":["getDurationAndIndexFromScrollOffset.ts"],"sourcesContent":["/**\n * Calculates the duration value and index from a scroll offset in a number picker.\n * Handles both infinite and non-infinite scroll modes, taking into account padding and item height.\n *\n * @param {Object} variables - Configuration object for scroll offset calculation\n * @param {boolean} variables.disableInfiniteScroll - Whether infinite scroll is disabled\n * @param {number} variables.interval - The interval between consecutive numbers\n * @param {number} variables.itemHeight - Height of each item in the picker\n * @param {number} variables.numberOfItems - Total number of items in the picker\n * @param {number} variables.padWithNItems - Number of empty items to pad with\n * @param {number} variables.yContentOffset - The vertical scroll offset\n *\n * @returns {{ duration: number; index: number }} Object containing the calculated duration and index\n *\n * @example\n * // With infinite scroll enabled\n * getDurationAndIndexFromScrollOffset({\n * disableInfiniteScroll: false,\n * interval: 1,\n * itemHeight: 50,\n * numberOfItems: 24,\n * padWithNItems: 2,\n * yContentOffset: 100\n * })\n * // Returns: { duration: 2, index: 2 }\n *\n * @example\n * // With infinite scroll disabled\n * getDurationAndIndexFromScrollOffset({\n * disableInfiniteScroll: true,\n * interval: 1,\n * itemHeight: 50,\n * numberOfItems: 24,\n * padWithNItems: 2,\n * yContentOffset: 100\n * })\n * // Returns: { duration: 2, index: 2 }\n */\nexport const getDurationAndIndexFromScrollOffset = (variables: {\n disableInfiniteScroll: boolean;\n interval: number;\n itemHeight: number;\n numberOfItems: number;\n padWithNItems: number;\n yContentOffset: number;\n}) => {\n const {\n disableInfiniteScroll,\n interval,\n itemHeight,\n numberOfItems,\n padWithNItems,\n yContentOffset,\n } = variables;\n\n const index = Math.round(yContentOffset / itemHeight);\n\n const duration =\n ((disableInfiniteScroll ? index : index + padWithNItems) % numberOfItems) * interval;\n\n return {\n duration,\n index,\n };\n};\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,mCAAmC,GAAIC,SAOnD,IAAK;EACJ,MAAM;IACJC,qBAAqB;IACrBC,QAAQ;IACRC,UAAU;IACVC,aAAa;IACbC,aAAa;IACbC;EACF,CAAC,GAAGN,SAAS;EAEb,MAAMO,KAAK,GAAGC,IAAI,CAACC,KAAK,CAACH,cAAc,GAAGH,UAAU,CAAC;EAErD,MAAMO,QAAQ,GACX,CAACT,qBAAqB,GAAGM,KAAK,GAAGA,KAAK,GAAGF,aAAa,IAAID,aAAa,GAAIF,QAAQ;EAEtF,OAAO;IACLQ,QAAQ;IACRH;EACF,CAAC;AACH,CAAC;AAACI,OAAA,CAAAZ,mCAAA,GAAAA,mCAAA","ignoreList":[]}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getInitialScrollIndex = void 0;
7
+ /**
8
+ * Calculates the initial scroll index for a number picker based on the desired value and configuration.
9
+ * Handles both infinite and non-infinite scroll modes, taking into account padding and repetition.
10
+ *
11
+ * @param {Object} variables - Configuration object for scroll index calculation
12
+ * @param {boolean} variables.disableInfiniteScroll - Whether infinite scroll is disabled
13
+ * @param {number} variables.interval - The interval between consecutive numbers
14
+ * @param {number} variables.numberOfItems - Total number of items in the picker
15
+ * @param {number} variables.padWithNItems - Number of empty items to pad with
16
+ * @param {number} variables.repeatNumbersNTimes - How many times to repeat the number sequence
17
+ * @param {number} variables.value - The desired initial value
18
+ *
19
+ * @returns {number} The calculated initial scroll index
20
+ *
21
+ * @example
22
+ * // With infinite scroll enabled
23
+ * getInitialScrollIndex({
24
+ * disableInfiniteScroll: false,
25
+ * interval: 1,
26
+ * numberOfItems: 24,
27
+ * padWithNItems: 2,
28
+ * repeatNumbersNTimes: 3,
29
+ * value: 12
30
+ * })
31
+ * // Returns: 38
32
+ *
33
+ * @example
34
+ * // With infinite scroll disabled
35
+ * getInitialScrollIndex({
36
+ * disableInfiniteScroll: true,
37
+ * interval: 1,
38
+ * numberOfItems: 24,
39
+ * padWithNItems: 2,
40
+ * repeatNumbersNTimes: 1,
41
+ * value: 12
42
+ * })
43
+ * // Returns: 12
44
+ */
45
+ const getInitialScrollIndex = variables => {
46
+ const {
47
+ disableInfiniteScroll,
48
+ interval,
49
+ numberOfItems,
50
+ padWithNItems,
51
+ repeatNumbersNTimes,
52
+ value
53
+ } = variables;
54
+ return Math.max(numberOfItems * Math.floor(repeatNumbersNTimes / 2) + (value / interval + numberOfItems) % numberOfItems - (!disableInfiniteScroll ? padWithNItems : 0), 0);
55
+ };
56
+ exports.getInitialScrollIndex = getInitialScrollIndex;
57
+ //# sourceMappingURL=getInitialScrollIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["getInitialScrollIndex","variables","disableInfiniteScroll","interval","numberOfItems","padWithNItems","repeatNumbersNTimes","value","Math","max","floor","exports"],"sources":["getInitialScrollIndex.ts"],"sourcesContent":["/**\n * Calculates the initial scroll index for a number picker based on the desired value and configuration.\n * Handles both infinite and non-infinite scroll modes, taking into account padding and repetition.\n *\n * @param {Object} variables - Configuration object for scroll index calculation\n * @param {boolean} variables.disableInfiniteScroll - Whether infinite scroll is disabled\n * @param {number} variables.interval - The interval between consecutive numbers\n * @param {number} variables.numberOfItems - Total number of items in the picker\n * @param {number} variables.padWithNItems - Number of empty items to pad with\n * @param {number} variables.repeatNumbersNTimes - How many times to repeat the number sequence\n * @param {number} variables.value - The desired initial value\n *\n * @returns {number} The calculated initial scroll index\n *\n * @example\n * // With infinite scroll enabled\n * getInitialScrollIndex({\n * disableInfiniteScroll: false,\n * interval: 1,\n * numberOfItems: 24,\n * padWithNItems: 2,\n * repeatNumbersNTimes: 3,\n * value: 12\n * })\n * // Returns: 38\n *\n * @example\n * // With infinite scroll disabled\n * getInitialScrollIndex({\n * disableInfiniteScroll: true,\n * interval: 1,\n * numberOfItems: 24,\n * padWithNItems: 2,\n * repeatNumbersNTimes: 1,\n * value: 12\n * })\n * // Returns: 12\n */\nexport const getInitialScrollIndex = (variables: {\n disableInfiniteScroll: boolean;\n interval: number;\n numberOfItems: number;\n padWithNItems: number;\n repeatNumbersNTimes: number;\n value: number;\n}) => {\n const {\n disableInfiniteScroll,\n interval,\n numberOfItems,\n padWithNItems,\n repeatNumbersNTimes,\n value,\n } = variables;\n\n return Math.max(\n numberOfItems * Math.floor(repeatNumbersNTimes / 2) +\n ((value / interval + numberOfItems) % numberOfItems) -\n (!disableInfiniteScroll ? padWithNItems : 0),\n 0\n );\n};\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,qBAAqB,GAAIC,SAOrC,IAAK;EACJ,MAAM;IACJC,qBAAqB;IACrBC,QAAQ;IACRC,aAAa;IACbC,aAAa;IACbC,mBAAmB;IACnBC;EACF,CAAC,GAAGN,SAAS;EAEb,OAAOO,IAAI,CAACC,GAAG,CACbL,aAAa,GAAGI,IAAI,CAACE,KAAK,CAACJ,mBAAmB,GAAG,CAAC,CAAC,GAChD,CAACC,KAAK,GAAGJ,QAAQ,GAAGC,aAAa,IAAIA,aAAc,IACnD,CAACF,qBAAqB,GAAGG,aAAa,GAAG,CAAC,CAAC,EAC9C,CACF,CAAC;AACH,CAAC;AAACM,OAAA,CAAAX,qBAAA,GAAAA,qBAAA","ignoreList":[]}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getSafeInitialValue = void 0;
7
+ /**
8
+ * Safely extracts and validates initial duration values, ensuring all values are valid numbers.
9
+ * Returns a duration object with safe default values (0) for any invalid or missing inputs.
10
+ *
11
+ * @param {Object} [initialValue] - Optional initial duration values
12
+ * @param {number} [initialValue.days] - Initial days value
13
+ * @param {number} [initialValue.hours] - Initial hours value
14
+ * @param {number} [initialValue.minutes] - Initial minutes value
15
+ * @param {number} [initialValue.seconds] - Initial seconds value
16
+ *
17
+ * @returns {{ days: number; hours: number; minutes: number; seconds: number }} An object containing safe duration values
18
+ *
19
+ * @example
20
+ * // With valid values
21
+ * getSafeInitialValue({ days: 1, hours: 2, minutes: 30, seconds: 45 })
22
+ * // Returns: { days: 1, hours: 2, minutes: 30, seconds: 45 }
23
+ *
24
+ * @example
25
+ * // With invalid values
26
+ * getSafeInitialValue({ days: NaN, hours: 'invalid', minutes: undefined })
27
+ * // Returns: { days: 0, hours: 0, minutes: 0, seconds: 0 }
28
+ *
29
+ * @example
30
+ * // With undefined input
31
+ * getSafeInitialValue(undefined)
32
+ * // Returns: { days: 0, hours: 0, minutes: 0, seconds: 0 }
33
+ */
34
+ const getSafeInitialValue = initialValue => ({
35
+ days: typeof (initialValue === null || initialValue === void 0 ? void 0 : initialValue.days) === "number" && !isNaN(initialValue === null || initialValue === void 0 ? void 0 : initialValue.days) ? initialValue.days : 0,
36
+ hours: typeof (initialValue === null || initialValue === void 0 ? void 0 : initialValue.hours) === "number" && !isNaN(initialValue === null || initialValue === void 0 ? void 0 : initialValue.hours) ? initialValue.hours : 0,
37
+ minutes: typeof (initialValue === null || initialValue === void 0 ? void 0 : initialValue.minutes) === "number" && !isNaN(initialValue === null || initialValue === void 0 ? void 0 : initialValue.minutes) ? initialValue.minutes : 0,
38
+ seconds: typeof (initialValue === null || initialValue === void 0 ? void 0 : initialValue.seconds) === "number" && !isNaN(initialValue === null || initialValue === void 0 ? void 0 : initialValue.seconds) ? initialValue.seconds : 0
39
+ });
40
+ exports.getSafeInitialValue = getSafeInitialValue;
41
+ //# sourceMappingURL=getSafeInitialValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["getSafeInitialValue","initialValue","days","isNaN","hours","minutes","seconds","exports"],"sources":["getSafeInitialValue.ts"],"sourcesContent":["/**\n * Safely extracts and validates initial duration values, ensuring all values are valid numbers.\n * Returns a duration object with safe default values (0) for any invalid or missing inputs.\n *\n * @param {Object} [initialValue] - Optional initial duration values\n * @param {number} [initialValue.days] - Initial days value\n * @param {number} [initialValue.hours] - Initial hours value\n * @param {number} [initialValue.minutes] - Initial minutes value\n * @param {number} [initialValue.seconds] - Initial seconds value\n *\n * @returns {{ days: number; hours: number; minutes: number; seconds: number }} An object containing safe duration values\n *\n * @example\n * // With valid values\n * getSafeInitialValue({ days: 1, hours: 2, minutes: 30, seconds: 45 })\n * // Returns: { days: 1, hours: 2, minutes: 30, seconds: 45 }\n *\n * @example\n * // With invalid values\n * getSafeInitialValue({ days: NaN, hours: 'invalid', minutes: undefined })\n * // Returns: { days: 0, hours: 0, minutes: 0, seconds: 0 }\n *\n * @example\n * // With undefined input\n * getSafeInitialValue(undefined)\n * // Returns: { days: 0, hours: 0, minutes: 0, seconds: 0 }\n */\nexport const getSafeInitialValue = (\n initialValue:\n | {\n days?: number;\n hours?: number;\n minutes?: number;\n seconds?: number;\n }\n | undefined\n) => ({\n days:\n typeof initialValue?.days === \"number\" && !isNaN(initialValue?.days) ? initialValue.days : 0,\n hours:\n typeof initialValue?.hours === \"number\" && !isNaN(initialValue?.hours) ? initialValue.hours : 0,\n minutes:\n typeof initialValue?.minutes === \"number\" && !isNaN(initialValue?.minutes)\n ? initialValue.minutes\n : 0,\n seconds:\n typeof initialValue?.seconds === \"number\" && !isNaN(initialValue?.seconds)\n ? initialValue.seconds\n : 0,\n});\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,mBAAmB,GAC9BC,YAOa,KACT;EACJC,IAAI,EACF,QAAOD,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEC,IAAI,MAAK,QAAQ,IAAI,CAACC,KAAK,CAACF,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEC,IAAI,CAAC,GAAGD,YAAY,CAACC,IAAI,GAAG,CAAC;EAC9FE,KAAK,EACH,QAAOH,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEG,KAAK,MAAK,QAAQ,IAAI,CAACD,KAAK,CAACF,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEG,KAAK,CAAC,GAAGH,YAAY,CAACG,KAAK,GAAG,CAAC;EACjGC,OAAO,EACL,QAAOJ,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEI,OAAO,MAAK,QAAQ,IAAI,CAACF,KAAK,CAACF,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEI,OAAO,CAAC,GACtEJ,YAAY,CAACI,OAAO,GACpB,CAAC;EACPC,OAAO,EACL,QAAOL,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEK,OAAO,MAAK,QAAQ,IAAI,CAACH,KAAK,CAACF,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEK,OAAO,CAAC,GACtEL,YAAY,CAACK,OAAO,GACpB;AACR,CAAC,CAAC;AAACC,OAAA,CAAAP,mBAAA,GAAAA,mBAAA","ignoreList":[]}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.padNumber = void 0;
7
+ /**
8
+ * Formats a number by optionally padding it with a leading zero or space.
9
+ * Numbers less than 10 are padded based on the options provided.
10
+ *
11
+ * @param {number} value - The number to format
12
+ * @param {Object} [options] - Optional formatting options
13
+ * @param {boolean} [options.padWithZero] - Whether to pad with zero (true) or space (false)
14
+ *
15
+ * @returns {string} The formatted number string
16
+ *
17
+ * @example
18
+ * // Pad with zero
19
+ * padNumber(5, { padWithZero: true })
20
+ * // Returns: '05'
21
+ *
22
+ * @example
23
+ * // Pad with figure space (same width as zero)
24
+ * padNumber(5, { padWithZero: false })
25
+ * // Returns: ' 5'
26
+ *
27
+ * @example
28
+ * // No padding needed
29
+ * padNumber(15)
30
+ * // Returns: '15'
31
+ */
32
+ const padNumber = (value, options) => {
33
+ if (value < 10) {
34
+ return (options !== null && options !== void 0 && options.padWithZero ? "0" : "\u2007") + value;
35
+ } else {
36
+ return String(value);
37
+ }
38
+ };
39
+ exports.padNumber = padNumber;
40
+ //# sourceMappingURL=padNumber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["padNumber","value","options","padWithZero","String","exports"],"sources":["padNumber.ts"],"sourcesContent":["/**\n * Formats a number by optionally padding it with a leading zero or space.\n * Numbers less than 10 are padded based on the options provided.\n *\n * @param {number} value - The number to format\n * @param {Object} [options] - Optional formatting options\n * @param {boolean} [options.padWithZero] - Whether to pad with zero (true) or space (false)\n *\n * @returns {string} The formatted number string\n *\n * @example\n * // Pad with zero\n * padNumber(5, { padWithZero: true })\n * // Returns: '05'\n *\n * @example\n * // Pad with figure space (same width as zero)\n * padNumber(5, { padWithZero: false })\n * // Returns: ' 5'\n *\n * @example\n * // No padding needed\n * padNumber(15)\n * // Returns: '15'\n */\nexport const padNumber = (value: number, options?: { padWithZero?: boolean }): string => {\n if (value < 10) {\n return (options?.padWithZero ? \"0\" : \"\\u2007\") + value;\n } else {\n return String(value);\n }\n};\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,SAAS,GAAGA,CAACC,KAAa,EAAEC,OAAmC,KAAa;EACvF,IAAID,KAAK,GAAG,EAAE,EAAE;IACd,OAAO,CAACC,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAEC,WAAW,GAAG,GAAG,GAAG,QAAQ,IAAIF,KAAK;EACxD,CAAC,MAAM;IACL,OAAOG,MAAM,CAACH,KAAK,CAAC;EACtB;AACF,CAAC;AAACI,OAAA,CAAAL,SAAA,GAAAA,SAAA","ignoreList":[]}
@@ -0,0 +1,418 @@
1
+ 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); }
2
+ import React, { useRef, useCallback, forwardRef, useImperativeHandle, useState, useEffect, useMemo } from "react";
3
+ import { View, Text, FlatList as RNFlatList } from "react-native";
4
+ import { colorToRgba } from "../../utils/colorToRgba";
5
+ import { generate12HourNumbers, generateNumbers } from "../../utils/generateNumbers";
6
+ import { getAdjustedLimit } from "../../utils/getAdjustedLimit";
7
+ import { getDurationAndIndexFromScrollOffset } from "../../utils/getDurationAndIndexFromScrollOffset";
8
+ import { getInitialScrollIndex } from "../../utils/getInitialScrollIndex";
9
+ import PickerItem from "../PickerItem";
10
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
+ const keyExtractor = (item, index) => index.toString();
12
+ const DurationScroll = /*#__PURE__*/forwardRef((props, ref) => {
13
+ const {
14
+ aggressivelyGetLatestDuration,
15
+ allowFontScaling = false,
16
+ amLabel,
17
+ Audio,
18
+ clickSoundAsset,
19
+ decelerationRate = 0.88,
20
+ disableInfiniteScroll = false,
21
+ FlatList = RNFlatList,
22
+ Haptics,
23
+ initialValue = 0,
24
+ interval,
25
+ is12HourPicker,
26
+ isDisabled,
27
+ label,
28
+ limit,
29
+ LinearGradient,
30
+ MaskedView,
31
+ maximumValue,
32
+ onDurationChange,
33
+ padNumbersWithZero = false,
34
+ padWithNItems,
35
+ pickerColumnWidth,
36
+ pickerFeedback,
37
+ pickerGradientOverlayProps,
38
+ pickerLabelGap,
39
+ pmLabel,
40
+ repeatNumbersNTimes = 3,
41
+ repeatNumbersNTimesNotExplicitlySet,
42
+ selectedValue,
43
+ styles,
44
+ testID
45
+ } = props;
46
+ const labelPositionStyle = useMemo(() => {
47
+ // When the style already has an explicit `left` (from legacy percentage system or
48
+ // user override), don't apply pixel-based positioning.
49
+ if (styles.pickerLabelContainer.left != null) {
50
+ return undefined;
51
+ }
52
+ const gap = pickerLabelGap ?? 6;
53
+ const fontSize = styles.pickerItem.fontSize ?? 25;
54
+ const maxDigitCount = Math.max(2, String(maximumValue).length);
55
+ const halfNumberWidth = maxDigitCount * fontSize * 0.55 / 2;
56
+ return {
57
+ left: "50%",
58
+ marginLeft: halfNumberWidth + gap
59
+ };
60
+ }, [maximumValue, pickerLabelGap, styles.pickerItem.fontSize, styles.pickerLabelContainer.left]);
61
+ const numberOfItems = useMemo(() => {
62
+ // guard against negative maximum values
63
+ if (maximumValue < 0) {
64
+ return 1;
65
+ }
66
+ return Math.floor(maximumValue / interval) + 1;
67
+ }, [interval, maximumValue]);
68
+ const safeRepeatNumbersNTimes = useMemo(() => {
69
+ // do not repeat numbers if there is only one option
70
+ if (numberOfItems === 1) {
71
+ return 1;
72
+ }
73
+ if (!disableInfiniteScroll && repeatNumbersNTimes < 2) {
74
+ return 2;
75
+ } else if (repeatNumbersNTimes < 1 || isNaN(repeatNumbersNTimes)) {
76
+ return 1;
77
+ }
78
+
79
+ // if this variable is not explicitly set, we calculate a reasonable value based on
80
+ // the number of items in the picker, avoiding regular jumps up/down the list
81
+ // whilst avoiding rendering too many items in the picker
82
+ if (repeatNumbersNTimesNotExplicitlySet) {
83
+ return Math.max(Math.round(180 / numberOfItems), 1);
84
+ }
85
+ return Math.round(repeatNumbersNTimes);
86
+ }, [disableInfiniteScroll, numberOfItems, repeatNumbersNTimes, repeatNumbersNTimesNotExplicitlySet]);
87
+ const numbersForFlatList = useMemo(() => {
88
+ if (is12HourPicker) {
89
+ return generate12HourNumbers({
90
+ disableInfiniteScroll,
91
+ interval,
92
+ padNumbersWithZero,
93
+ padWithNItems,
94
+ repeatNTimes: safeRepeatNumbersNTimes
95
+ });
96
+ }
97
+ return generateNumbers(numberOfItems, {
98
+ disableInfiniteScroll,
99
+ interval,
100
+ padNumbersWithZero,
101
+ padWithNItems,
102
+ repeatNTimes: safeRepeatNumbersNTimes
103
+ });
104
+ }, [disableInfiniteScroll, is12HourPicker, interval, numberOfItems, padNumbersWithZero, padWithNItems, safeRepeatNumbersNTimes]);
105
+ const initialScrollIndex = useMemo(() => getInitialScrollIndex({
106
+ disableInfiniteScroll,
107
+ interval,
108
+ numberOfItems,
109
+ padWithNItems,
110
+ repeatNumbersNTimes: safeRepeatNumbersNTimes,
111
+ value: initialValue
112
+ }), [disableInfiniteScroll, initialValue, interval, numberOfItems, padWithNItems, safeRepeatNumbersNTimes]);
113
+ const adjustedLimited = useMemo(() => getAdjustedLimit(limit, numberOfItems, interval), [interval, limit, numberOfItems]);
114
+ const numberOfItemsToShow = 1 + padWithNItems * 2;
115
+
116
+ // keep track of the latest duration as it scrolls
117
+ const latestDuration = useRef(0);
118
+ // keep track of the last index scrolled past for haptic/audio feedback
119
+ const lastFeedbackIndex = useRef(0);
120
+ const flatListRef = useRef(null);
121
+ const [clickSound, setClickSound] = useState(null);
122
+ useEffect(() => {
123
+ // Audio prop deprecated in v2.2.0 (use pickerFeedback instead) - will be removed in a future version
124
+
125
+ // preload the sound when the component mounts
126
+ let soundInstance = null;
127
+ const loadSound = async () => {
128
+ if (!Audio) {
129
+ return;
130
+ }
131
+ try {
132
+ const {
133
+ sound: newSound
134
+ } = await Audio.Sound.createAsync(clickSoundAsset ?? {
135
+ // use a hosted sound as a fallback (do not use local asset due to loader issues
136
+ // in some environments when including mp3 in library)
137
+ uri: "https://drive.google.com/uc?export=download&id=10e1YkbNsRh-vGx1jmS1Nntz8xzkBp4_I"
138
+ }, {
139
+ shouldPlay: false
140
+ });
141
+ soundInstance = newSound;
142
+ setClickSound(newSound);
143
+ } catch (error) {
144
+ console.warn("Failed to load click sound:", error);
145
+ }
146
+ };
147
+ loadSound();
148
+ return () => {
149
+ var _soundInstance;
150
+ // unload sound when component unmounts
151
+ (_soundInstance = soundInstance) === null || _soundInstance === void 0 || _soundInstance.unloadAsync();
152
+ };
153
+ // eslint-disable-next-line react-hooks/exhaustive-deps
154
+ }, [Audio]);
155
+ const playClickSound = useCallback(async () => {
156
+ if (!clickSound) return;
157
+ try {
158
+ await clickSound.replayAsync();
159
+ } catch (error) {
160
+ console.warn("Failed to play click sound:", error);
161
+ }
162
+ }, [clickSound]);
163
+ const renderItem = useCallback(({
164
+ item
165
+ }) => /*#__PURE__*/React.createElement(PickerItem, {
166
+ adjustedLimitedMax: adjustedLimited.max,
167
+ adjustedLimitedMin: adjustedLimited.min,
168
+ allowFontScaling: allowFontScaling,
169
+ amLabel: amLabel,
170
+ is12HourPicker: is12HourPicker,
171
+ item: item,
172
+ pickerAmPmPositionStyle: labelPositionStyle,
173
+ pmLabel: pmLabel,
174
+ selectedValue: selectedValue,
175
+ styles: styles
176
+ }), [adjustedLimited.max, adjustedLimited.min, allowFontScaling, amLabel, is12HourPicker, labelPositionStyle, pmLabel, selectedValue, styles]);
177
+ const onScroll = useCallback(e => {
178
+ // this function is only used when the picker is in a modal and/or has Haptic/Audio feedback
179
+ // it is used to ensure that the modal gets the latest duration on clicking
180
+ // the confirm button, even if the scrollview is still scrolling
181
+ if (!aggressivelyGetLatestDuration && !Haptics && !Audio && !pickerFeedback) {
182
+ return;
183
+ }
184
+ if (aggressivelyGetLatestDuration) {
185
+ const newValues = getDurationAndIndexFromScrollOffset({
186
+ disableInfiniteScroll,
187
+ interval,
188
+ itemHeight: styles.pickerItemContainer.height,
189
+ numberOfItems,
190
+ padWithNItems,
191
+ yContentOffset: e.nativeEvent.contentOffset.y
192
+ });
193
+ if (newValues.duration !== latestDuration.current) {
194
+ // check limits
195
+ if (newValues.duration > adjustedLimited.max) {
196
+ newValues.duration = adjustedLimited.max;
197
+ } else if (newValues.duration < adjustedLimited.min) {
198
+ newValues.duration = adjustedLimited.min;
199
+ }
200
+ latestDuration.current = newValues.duration;
201
+ }
202
+ }
203
+ if (pickerFeedback || Haptics || Audio) {
204
+ const feedbackIndex = Math.round((e.nativeEvent.contentOffset.y + styles.pickerItemContainer.height / 2) / styles.pickerItemContainer.height);
205
+ if (feedbackIndex !== lastFeedbackIndex.current) {
206
+ // this check stops the feedback firing when the component mounts
207
+ if (lastFeedbackIndex.current) {
208
+ // fire haptic feedback if available
209
+ try {
210
+ Haptics === null || Haptics === void 0 || Haptics.selectionAsync();
211
+ } catch {
212
+ // do nothing
213
+ }
214
+
215
+ // play click sound if available
216
+ try {
217
+ playClickSound();
218
+ } catch {
219
+ // do nothing
220
+ }
221
+
222
+ // fire custom feedback if available
223
+ try {
224
+ pickerFeedback === null || pickerFeedback === void 0 || pickerFeedback();
225
+ } catch {
226
+ // do nothing
227
+ }
228
+ }
229
+ lastFeedbackIndex.current = feedbackIndex;
230
+ }
231
+ }
232
+ },
233
+ // eslint-disable-next-line react-hooks/exhaustive-deps
234
+ [adjustedLimited.max, adjustedLimited.min, aggressivelyGetLatestDuration, playClickSound, disableInfiniteScroll, interval, numberOfItems, padWithNItems, styles.pickerItemContainer.height]);
235
+ const onMomentumScrollEnd = useCallback(e => {
236
+ const newValues = getDurationAndIndexFromScrollOffset({
237
+ disableInfiniteScroll,
238
+ interval,
239
+ itemHeight: styles.pickerItemContainer.height,
240
+ numberOfItems,
241
+ padWithNItems,
242
+ yContentOffset: e.nativeEvent.contentOffset.y
243
+ });
244
+
245
+ // check limits
246
+ if (newValues.duration > adjustedLimited.max) {
247
+ var _flatListRef$current;
248
+ const targetScrollIndex = newValues.index - (newValues.duration - adjustedLimited.max);
249
+ (_flatListRef$current = flatListRef.current) === null || _flatListRef$current === void 0 || _flatListRef$current.scrollToIndex({
250
+ animated: true,
251
+ index:
252
+ // guard against scrolling beyond end of list
253
+ targetScrollIndex >= 0 ? targetScrollIndex : adjustedLimited.max - 1
254
+ }); // scroll down to max
255
+ newValues.duration = adjustedLimited.max;
256
+ } else if (newValues.duration < adjustedLimited.min) {
257
+ var _flatListRef$current2;
258
+ const targetScrollIndex = newValues.index + (adjustedLimited.min - newValues.duration);
259
+ (_flatListRef$current2 = flatListRef.current) === null || _flatListRef$current2 === void 0 || _flatListRef$current2.scrollToIndex({
260
+ animated: true,
261
+ index:
262
+ // guard against scrolling beyond end of list
263
+ targetScrollIndex <= numbersForFlatList.length - 1 ? targetScrollIndex : adjustedLimited.min
264
+ }); // scroll up to min
265
+ newValues.duration = adjustedLimited.min;
266
+ }
267
+ onDurationChange(newValues.duration);
268
+ }, [disableInfiniteScroll, interval, styles.pickerItemContainer.height, numberOfItems, padWithNItems, adjustedLimited.max, adjustedLimited.min, onDurationChange, numbersForFlatList.length]);
269
+ const onViewableItemsChanged = useCallback(({
270
+ viewableItems
271
+ }) => {
272
+ var _viewableItems$, _viewableItems$2;
273
+ if (numberOfItems === 1) {
274
+ return;
275
+ }
276
+ if ((_viewableItems$ = viewableItems[0]) !== null && _viewableItems$ !== void 0 && _viewableItems$.index && viewableItems[0].index < numberOfItems * 0.5) {
277
+ var _flatListRef$current3;
278
+ (_flatListRef$current3 = flatListRef.current) === null || _flatListRef$current3 === void 0 || _flatListRef$current3.scrollToIndex({
279
+ animated: false,
280
+ index: viewableItems[0].index + numberOfItems
281
+ });
282
+ } else if ((_viewableItems$2 = viewableItems[0]) !== null && _viewableItems$2 !== void 0 && _viewableItems$2.index && viewableItems[0].index >= numberOfItems * (safeRepeatNumbersNTimes - 0.5)) {
283
+ var _flatListRef$current4;
284
+ (_flatListRef$current4 = flatListRef.current) === null || _flatListRef$current4 === void 0 || _flatListRef$current4.scrollToIndex({
285
+ animated: false,
286
+ index: viewableItems[0].index - numberOfItems
287
+ });
288
+ }
289
+ }, [numberOfItems, safeRepeatNumbersNTimes]);
290
+ const [viewabilityConfigCallbackPairs, setViewabilityConfigCallbackPairs] = useState(!disableInfiniteScroll ? [{
291
+ onViewableItemsChanged: onViewableItemsChanged,
292
+ viewabilityConfig: {
293
+ viewAreaCoveragePercentThreshold: 0
294
+ }
295
+ }] : undefined);
296
+ const [flatListRenderKey, setFlatListRenderKey] = useState(0);
297
+ const initialRender = useRef(true);
298
+ useEffect(() => {
299
+ // don't run on first render
300
+ if (initialRender.current) {
301
+ initialRender.current = false;
302
+ return;
303
+ }
304
+
305
+ // if the onViewableItemsChanged callback changes, we need to update viewabilityConfigCallbackPairs
306
+ // which requires the FlatList to be remounted, hence the increase of the FlatList key
307
+ setFlatListRenderKey(prev => prev + 1);
308
+ setViewabilityConfigCallbackPairs(!disableInfiniteScroll ? [{
309
+ onViewableItemsChanged: onViewableItemsChanged,
310
+ viewabilityConfig: {
311
+ viewAreaCoveragePercentThreshold: 0
312
+ }
313
+ }] : undefined);
314
+ }, [disableInfiniteScroll, onViewableItemsChanged]);
315
+ const getItemLayout = useCallback((_, index) => ({
316
+ index,
317
+ length: styles.pickerItemContainer.height,
318
+ offset: styles.pickerItemContainer.height * index
319
+ }), [styles.pickerItemContainer.height]);
320
+ useImperativeHandle(ref, () => ({
321
+ latestDuration: latestDuration,
322
+ reset: options => {
323
+ var _flatListRef$current5;
324
+ (_flatListRef$current5 = flatListRef.current) === null || _flatListRef$current5 === void 0 || _flatListRef$current5.scrollToIndex({
325
+ animated: (options === null || options === void 0 ? void 0 : options.animated) ?? false,
326
+ index: initialScrollIndex
327
+ });
328
+ },
329
+ setValue: (value, options) => {
330
+ var _flatListRef$current6;
331
+ (_flatListRef$current6 = flatListRef.current) === null || _flatListRef$current6 === void 0 || _flatListRef$current6.scrollToIndex({
332
+ animated: (options === null || options === void 0 ? void 0 : options.animated) ?? false,
333
+ index: getInitialScrollIndex({
334
+ disableInfiniteScroll,
335
+ interval,
336
+ numberOfItems,
337
+ padWithNItems,
338
+ repeatNumbersNTimes: safeRepeatNumbersNTimes,
339
+ value: value
340
+ })
341
+ });
342
+ }
343
+ }));
344
+ const renderContent = useMemo(() => {
345
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(FlatList, {
346
+ key: flatListRenderKey,
347
+ ref: flatListRef,
348
+ contentContainerStyle: styles.durationScrollFlatListContentContainer,
349
+ data: numbersForFlatList,
350
+ decelerationRate: decelerationRate,
351
+ getItemLayout: getItemLayout,
352
+ initialScrollIndex: initialScrollIndex,
353
+ keyExtractor: keyExtractor,
354
+ nestedScrollEnabled: true,
355
+ onMomentumScrollEnd: onMomentumScrollEnd,
356
+ onScroll: onScroll,
357
+ renderItem: renderItem,
358
+ scrollEnabled: !isDisabled,
359
+ scrollEventThrottle: 16,
360
+ showsVerticalScrollIndicator: false,
361
+ snapToAlignment: "start"
362
+ // used in place of snapToInterval due to bug on Android
363
+ ,
364
+ snapToOffsets: [...Array(numbersForFlatList.length)].map((_, i) => i * styles.pickerItemContainer.height),
365
+ style: styles.durationScrollFlatList,
366
+ testID: "duration-scroll-flatlist",
367
+ viewabilityConfigCallbackPairs: viewabilityConfigCallbackPairs,
368
+ windowSize: numberOfItemsToShow
369
+ }), /*#__PURE__*/React.createElement(View, {
370
+ pointerEvents: "none",
371
+ style: [styles.pickerLabelContainer, labelPositionStyle]
372
+ }, typeof label === "string" ? /*#__PURE__*/React.createElement(Text, {
373
+ allowFontScaling: allowFontScaling,
374
+ style: styles.pickerLabel
375
+ }, label) : label ?? null));
376
+ }, [FlatList, allowFontScaling, decelerationRate, flatListRenderKey, getItemLayout, initialScrollIndex, isDisabled, label, labelPositionStyle, numberOfItemsToShow, numbersForFlatList, onMomentumScrollEnd, onScroll, renderItem, styles.durationScrollFlatList, styles.durationScrollFlatListContentContainer, styles.pickerItemContainer.height, styles.pickerLabel, styles.pickerLabelContainer, viewabilityConfigCallbackPairs]);
377
+ const renderLinearGradient = useMemo(() => {
378
+ if (!LinearGradient) {
379
+ return null;
380
+ }
381
+ let colors;
382
+ if (MaskedView) {
383
+ // if using masked view, we only care about the opacity
384
+ colors = ["rgba(0,0,0,0)", "rgba(0,0,0,1)", "rgba(0,0,0,1)", "rgba(0,0,0,0)"];
385
+ } else {
386
+ const backgroundColor = styles.pickerContainer.backgroundColor ?? "white";
387
+ const transparentBackgroundColor = colorToRgba({
388
+ color: backgroundColor,
389
+ opacity: 0
390
+ });
391
+ colors = [backgroundColor, transparentBackgroundColor, transparentBackgroundColor, backgroundColor];
392
+ }
393
+
394
+ // calculate the gradient height to cover the top item and bottom item
395
+ const gradientHeight = padWithNItems > 0 ? 1 / (padWithNItems * 2 + 1) : 0.3;
396
+ return /*#__PURE__*/React.createElement(LinearGradient, _extends({
397
+ colors: colors,
398
+ locations: [0, gradientHeight, 1 - gradientHeight, 1],
399
+ pointerEvents: "none",
400
+ style: styles.pickerGradientOverlay
401
+ }, pickerGradientOverlayProps));
402
+ }, [LinearGradient, MaskedView, padWithNItems, pickerGradientOverlayProps, styles.pickerContainer.backgroundColor, styles.pickerGradientOverlay]);
403
+ return /*#__PURE__*/React.createElement(View, {
404
+ pointerEvents: isDisabled ? "none" : undefined,
405
+ style: [styles.durationScrollFlatListContainer, pickerColumnWidth != null && {
406
+ flex: 0,
407
+ width: pickerColumnWidth
408
+ }, {
409
+ height: styles.pickerItemContainer.height * numberOfItemsToShow
410
+ }, isDisabled && styles.disabledPickerContainer],
411
+ testID: testID
412
+ }, MaskedView ? /*#__PURE__*/React.createElement(MaskedView, {
413
+ maskElement: renderLinearGradient,
414
+ style: [styles.maskedView]
415
+ }, renderContent) : /*#__PURE__*/React.createElement(React.Fragment, null, renderContent, renderLinearGradient));
416
+ });
417
+ export default /*#__PURE__*/React.memo(DurationScroll);
418
+ //# sourceMappingURL=DurationScroll.js.map