react-native-timer-picker 1.10.2 → 1.10.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/commonjs/components/DurationScroll/index.js +83 -62
- package/dist/commonjs/components/DurationScroll/index.js.map +1 -1
- package/dist/commonjs/components/TimerPicker/index.js +19 -10
- package/dist/commonjs/components/TimerPicker/index.js.map +1 -1
- package/dist/commonjs/utils/generateNumbers.js +3 -3
- package/dist/commonjs/utils/generateNumbers.js.map +1 -1
- package/dist/commonjs/utils/getAdjustedLimit.js +4 -3
- package/dist/commonjs/utils/getAdjustedLimit.js.map +1 -1
- package/dist/commonjs/utils/getDurationAndIndexFromScrollOffset.js +23 -0
- package/dist/commonjs/utils/getDurationAndIndexFromScrollOffset.js.map +1 -0
- package/dist/commonjs/utils/getInitialScrollIndex.js +18 -0
- package/dist/commonjs/utils/getInitialScrollIndex.js.map +1 -0
- package/dist/module/components/DurationScroll/index.js +83 -62
- package/dist/module/components/DurationScroll/index.js.map +1 -1
- package/dist/module/components/TimerPicker/index.js +19 -10
- package/dist/module/components/TimerPicker/index.js.map +1 -1
- package/dist/module/utils/generateNumbers.js +3 -3
- package/dist/module/utils/generateNumbers.js.map +1 -1
- package/dist/module/utils/getAdjustedLimit.js +4 -3
- package/dist/module/utils/getAdjustedLimit.js.map +1 -1
- package/dist/module/utils/getDurationAndIndexFromScrollOffset.js +16 -0
- package/dist/module/utils/getDurationAndIndexFromScrollOffset.js.map +1 -0
- package/dist/module/utils/getInitialScrollIndex.js +11 -0
- package/dist/module/utils/getInitialScrollIndex.js.map +1 -0
- package/dist/typescript/utils/generateNumbers.d.ts +1 -1
- package/dist/typescript/utils/getDurationAndIndexFromScrollOffset.d.ts +10 -0
- package/dist/typescript/utils/{getScrollIndex.d.ts → getInitialScrollIndex.d.ts} +2 -1
- package/package.json +1 -1
- package/dist/commonjs/utils/getScrollIndex.js +0 -17
- package/dist/commonjs/utils/getScrollIndex.js.map +0 -1
- package/dist/module/utils/getScrollIndex.js +0 -10
- package/dist/module/utils/getScrollIndex.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_padNumber","require","generateNumbers","numberOfItems","options","numbers","i","push","padNumber","padWithZero","padNumbersWithZero","repeatNTimes","Array","fill","flat","disableInfiniteScroll","padWithNItems","unshift","exports","generate12HourNumbers","hour"],"sources":["generateNumbers.ts"],"sourcesContent":["import { padNumber } from \"./padNumber\";\n\nexport const generateNumbers = (\n numberOfItems: number,\n options: {\n disableInfiniteScroll?: boolean;\n padNumbersWithZero?: boolean;\n padWithNItems: number;\n repeatNTimes
|
|
1
|
+
{"version":3,"names":["_padNumber","require","generateNumbers","numberOfItems","options","numbers","i","push","padNumber","padWithZero","padNumbersWithZero","repeatNTimes","Array","fill","flat","disableInfiniteScroll","padWithNItems","unshift","exports","generate12HourNumbers","hour"],"sources":["generateNumbers.ts"],"sourcesContent":["import { padNumber } from \"./padNumber\";\n\nexport const generateNumbers = (\n numberOfItems: number,\n options: {\n disableInfiniteScroll?: boolean;\n padNumbersWithZero?: boolean;\n padWithNItems: number;\n repeatNTimes: number;\n }\n) => {\n if (numberOfItems <= 0) {\n return [];\n }\n\n let numbers: string[] = [];\n for (let i = 0; i < numberOfItems; i++) {\n numbers.push(padNumber(i, { padWithZero: options.padNumbersWithZero }));\n }\n\n if (options.repeatNTimes > 1) {\n numbers = Array(options.repeatNTimes).fill(numbers).flat();\n }\n if (options.disableInfiniteScroll || options.repeatNTimes === 1) {\n numbers.push(...Array(options.padWithNItems).fill(\"\"));\n numbers.unshift(...Array(options.padWithNItems).fill(\"\"));\n }\n return numbers;\n};\n\nexport const generate12HourNumbers = (options: {\n disableInfiniteScroll?: boolean;\n padNumbersWithZero?: boolean;\n padWithNItems: number;\n repeatNTimes?: number;\n}) => {\n let numbers: string[] = [];\n\n // Generate numbers from 0 to 11 for AM\n for (let i = 0; i <= 11; i++) {\n numbers.push(\n `${padNumber(i, { padWithZero: options.padNumbersWithZero })} AM`\n );\n }\n\n // Generate numbers from 12 to 11 for PM\n for (let i = 12; i <= 23; i++) {\n const hour = i > 12 ? i - 12 : i;\n numbers.push(\n `${padNumber(hour, { padWithZero: options.padNumbersWithZero })} PM`\n );\n }\n\n if ((options.repeatNTimes ?? 1) > 1) {\n numbers = Array(options.repeatNTimes).fill(numbers).flat();\n }\n\n if (options.disableInfiniteScroll) {\n numbers.push(...Array(options.padWithNItems).fill(\"\"));\n numbers.unshift(...Array(options.padWithNItems).fill(\"\"));\n }\n\n return numbers;\n};\n"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AAEO,MAAMC,eAAe,GAAGA,CAC3BC,aAAqB,EACrBC,OAKC,KACA;EACD,IAAID,aAAa,IAAI,CAAC,EAAE;IACpB,OAAO,EAAE;EACb;EAEA,IAAIE,OAAiB,GAAG,EAAE;EAC1B,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,aAAa,EAAEG,CAAC,EAAE,EAAE;IACpCD,OAAO,CAACE,IAAI,CAAC,IAAAC,oBAAS,EAACF,CAAC,EAAE;MAAEG,WAAW,EAAEL,OAAO,CAACM;IAAmB,CAAC,CAAC,CAAC;EAC3E;EAEA,IAAIN,OAAO,CAACO,YAAY,GAAG,CAAC,EAAE;IAC1BN,OAAO,GAAGO,KAAK,CAACR,OAAO,CAACO,YAAY,CAAC,CAACE,IAAI,CAACR,OAAO,CAAC,CAACS,IAAI,CAAC,CAAC;EAC9D;EACA,IAAIV,OAAO,CAACW,qBAAqB,IAAIX,OAAO,CAACO,YAAY,KAAK,CAAC,EAAE;IAC7DN,OAAO,CAACE,IAAI,CAAC,GAAGK,KAAK,CAACR,OAAO,CAACY,aAAa,CAAC,CAACH,IAAI,CAAC,EAAE,CAAC,CAAC;IACtDR,OAAO,CAACY,OAAO,CAAC,GAAGL,KAAK,CAACR,OAAO,CAACY,aAAa,CAAC,CAACH,IAAI,CAAC,EAAE,CAAC,CAAC;EAC7D;EACA,OAAOR,OAAO;AAClB,CAAC;AAACa,OAAA,CAAAhB,eAAA,GAAAA,eAAA;AAEK,MAAMiB,qBAAqB,GAAIf,OAKrC,IAAK;EACF,IAAIC,OAAiB,GAAG,EAAE;;EAE1B;EACA,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,IAAI,EAAE,EAAEA,CAAC,EAAE,EAAE;IAC1BD,OAAO,CAACE,IAAI,CACR,GAAG,IAAAC,oBAAS,EAACF,CAAC,EAAE;MAAEG,WAAW,EAAEL,OAAO,CAACM;IAAmB,CAAC,CAAC,KAChE,CAAC;EACL;;EAEA;EACA,KAAK,IAAIJ,CAAC,GAAG,EAAE,EAAEA,CAAC,IAAI,EAAE,EAAEA,CAAC,EAAE,EAAE;IAC3B,MAAMc,IAAI,GAAGd,CAAC,GAAG,EAAE,GAAGA,CAAC,GAAG,EAAE,GAAGA,CAAC;IAChCD,OAAO,CAACE,IAAI,CACR,GAAG,IAAAC,oBAAS,EAACY,IAAI,EAAE;MAAEX,WAAW,EAAEL,OAAO,CAACM;IAAmB,CAAC,CAAC,KACnE,CAAC;EACL;EAEA,IAAI,CAACN,OAAO,CAACO,YAAY,IAAI,CAAC,IAAI,CAAC,EAAE;IACjCN,OAAO,GAAGO,KAAK,CAACR,OAAO,CAACO,YAAY,CAAC,CAACE,IAAI,CAACR,OAAO,CAAC,CAACS,IAAI,CAAC,CAAC;EAC9D;EAEA,IAAIV,OAAO,CAACW,qBAAqB,EAAE;IAC/BV,OAAO,CAACE,IAAI,CAAC,GAAGK,KAAK,CAACR,OAAO,CAACY,aAAa,CAAC,CAACH,IAAI,CAAC,EAAE,CAAC,CAAC;IACtDR,OAAO,CAACY,OAAO,CAAC,GAAGL,KAAK,CAACR,OAAO,CAACY,aAAa,CAAC,CAACH,IAAI,CAAC,EAAE,CAAC,CAAC;EAC7D;EAEA,OAAOR,OAAO;AAClB,CAAC;AAACa,OAAA,CAAAC,qBAAA,GAAAA,qBAAA","ignoreList":[]}
|
|
@@ -5,21 +5,22 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.getAdjustedLimit = void 0;
|
|
7
7
|
const getAdjustedLimit = (limit, numberOfItems) => {
|
|
8
|
+
const maxIndex = numberOfItems - 1;
|
|
8
9
|
if (!limit || !limit.max && !limit.min) {
|
|
9
10
|
return {
|
|
10
|
-
max:
|
|
11
|
+
max: maxIndex,
|
|
11
12
|
min: 0
|
|
12
13
|
};
|
|
13
14
|
}
|
|
14
15
|
|
|
15
16
|
// guard against limits that are out of bounds
|
|
16
|
-
const adjustedMaxLimit = limit.max ? Math.min(limit.max,
|
|
17
|
+
const adjustedMaxLimit = limit.max ? Math.min(limit.max, maxIndex) : maxIndex;
|
|
17
18
|
const adjustedMinLimit = limit.min ? Math.max(limit.min, 0) : 0;
|
|
18
19
|
|
|
19
20
|
// guard against invalid limits
|
|
20
21
|
if (adjustedMaxLimit < adjustedMinLimit) {
|
|
21
22
|
return {
|
|
22
|
-
max:
|
|
23
|
+
max: maxIndex,
|
|
23
24
|
min: 0
|
|
24
25
|
};
|
|
25
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getAdjustedLimit","limit","numberOfItems","max","min","adjustedMaxLimit","Math","adjustedMinLimit","exports"],"sources":["getAdjustedLimit.ts"],"sourcesContent":["import type { LimitType } from \"../components/DurationScroll/types\";\n\nexport const getAdjustedLimit = (\n limit: LimitType | undefined,\n numberOfItems: number\n): {\n max: number;\n min: number;\n} => {\n if (!limit || (!limit.max && !limit.min)) {\n return {\n max:
|
|
1
|
+
{"version":3,"names":["getAdjustedLimit","limit","numberOfItems","maxIndex","max","min","adjustedMaxLimit","Math","adjustedMinLimit","exports"],"sources":["getAdjustedLimit.ts"],"sourcesContent":["import type { LimitType } from \"../components/DurationScroll/types\";\n\nexport const getAdjustedLimit = (\n limit: LimitType | undefined,\n numberOfItems: number\n): {\n max: number;\n min: number;\n} => {\n const maxIndex = numberOfItems - 1;\n\n if (!limit || (!limit.max && !limit.min)) {\n return {\n max: maxIndex,\n min: 0,\n };\n }\n\n // guard against limits that are out of bounds\n const adjustedMaxLimit = limit.max\n ? Math.min(limit.max, maxIndex)\n : maxIndex;\n const adjustedMinLimit = limit.min ? Math.max(limit.min, 0) : 0;\n\n // guard against invalid limits\n if (adjustedMaxLimit < adjustedMinLimit) {\n return {\n max: maxIndex,\n min: 0,\n };\n }\n\n return {\n max: adjustedMaxLimit,\n min: adjustedMinLimit,\n };\n};\n"],"mappings":";;;;;;AAEO,MAAMA,gBAAgB,GAAGA,CAC5BC,KAA4B,EAC5BC,aAAqB,KAIpB;EACD,MAAMC,QAAQ,GAAGD,aAAa,GAAG,CAAC;EAElC,IAAI,CAACD,KAAK,IAAK,CAACA,KAAK,CAACG,GAAG,IAAI,CAACH,KAAK,CAACI,GAAI,EAAE;IACtC,OAAO;MACHD,GAAG,EAAED,QAAQ;MACbE,GAAG,EAAE;IACT,CAAC;EACL;;EAEA;EACA,MAAMC,gBAAgB,GAAGL,KAAK,CAACG,GAAG,GAC5BG,IAAI,CAACF,GAAG,CAACJ,KAAK,CAACG,GAAG,EAAED,QAAQ,CAAC,GAC7BA,QAAQ;EACd,MAAMK,gBAAgB,GAAGP,KAAK,CAACI,GAAG,GAAGE,IAAI,CAACH,GAAG,CAACH,KAAK,CAACI,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC;;EAE/D;EACA,IAAIC,gBAAgB,GAAGE,gBAAgB,EAAE;IACrC,OAAO;MACHJ,GAAG,EAAED,QAAQ;MACbE,GAAG,EAAE;IACT,CAAC;EACL;EAEA,OAAO;IACHD,GAAG,EAAEE,gBAAgB;IACrBD,GAAG,EAAEG;EACT,CAAC;AACL,CAAC;AAACC,OAAA,CAAAT,gBAAA,GAAAA,gBAAA","ignoreList":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getDurationAndIndexFromScrollOffset = void 0;
|
|
7
|
+
const getDurationAndIndexFromScrollOffset = variables => {
|
|
8
|
+
const {
|
|
9
|
+
disableInfiniteScroll,
|
|
10
|
+
itemHeight,
|
|
11
|
+
numberOfItems,
|
|
12
|
+
padWithNItems,
|
|
13
|
+
yContentOffset
|
|
14
|
+
} = variables;
|
|
15
|
+
const index = Math.round(yContentOffset / itemHeight);
|
|
16
|
+
const duration = (disableInfiniteScroll ? index : index + padWithNItems) % numberOfItems;
|
|
17
|
+
return {
|
|
18
|
+
duration,
|
|
19
|
+
index
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
exports.getDurationAndIndexFromScrollOffset = getDurationAndIndexFromScrollOffset;
|
|
23
|
+
//# sourceMappingURL=getDurationAndIndexFromScrollOffset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getDurationAndIndexFromScrollOffset","variables","disableInfiniteScroll","itemHeight","numberOfItems","padWithNItems","yContentOffset","index","Math","round","duration","exports"],"sources":["getDurationAndIndexFromScrollOffset.ts"],"sourcesContent":["export const getDurationAndIndexFromScrollOffset = (variables: {\n disableInfiniteScroll: boolean;\n itemHeight: number;\n numberOfItems: number;\n padWithNItems: number;\n yContentOffset: number;\n}) => {\n const {\n disableInfiniteScroll,\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;\n\n return {\n duration,\n index,\n };\n};\n"],"mappings":";;;;;;AAAO,MAAMA,mCAAmC,GAAIC,SAMnD,IAAK;EACF,MAAM;IACFC,qBAAqB;IACrBC,UAAU;IACVC,aAAa;IACbC,aAAa;IACbC;EACJ,CAAC,GAAGL,SAAS;EAEb,MAAMM,KAAK,GAAGC,IAAI,CAACC,KAAK,CAACH,cAAc,GAAGH,UAAU,CAAC;EAErD,MAAMO,QAAQ,GACV,CAACR,qBAAqB,GAAGK,KAAK,GAAGA,KAAK,GAAGF,aAAa,IAAID,aAAa;EAE3E,OAAO;IACHM,QAAQ;IACRH;EACJ,CAAC;AACL,CAAC;AAACI,OAAA,CAAAX,mCAAA,GAAAA,mCAAA","ignoreList":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getInitialScrollIndex = void 0;
|
|
7
|
+
const getInitialScrollIndex = variables => {
|
|
8
|
+
const {
|
|
9
|
+
disableInfiniteScroll,
|
|
10
|
+
numberOfItems,
|
|
11
|
+
padWithNItems,
|
|
12
|
+
repeatNumbersNTimes,
|
|
13
|
+
value
|
|
14
|
+
} = variables;
|
|
15
|
+
return Math.max(numberOfItems * Math.floor(repeatNumbersNTimes / 2) + (value + numberOfItems) % numberOfItems - (!disableInfiniteScroll ? padWithNItems : 0), 0);
|
|
16
|
+
};
|
|
17
|
+
exports.getInitialScrollIndex = getInitialScrollIndex;
|
|
18
|
+
//# sourceMappingURL=getInitialScrollIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getInitialScrollIndex","variables","disableInfiniteScroll","numberOfItems","padWithNItems","repeatNumbersNTimes","value","Math","max","floor","exports"],"sources":["getInitialScrollIndex.ts"],"sourcesContent":["export const getInitialScrollIndex = (variables: {\n disableInfiniteScroll: boolean;\n numberOfItems: number;\n padWithNItems: number;\n repeatNumbersNTimes: number;\n value: number;\n}) => {\n const {\n disableInfiniteScroll,\n numberOfItems,\n padWithNItems,\n repeatNumbersNTimes,\n value,\n } = variables;\n\n return Math.max(\n numberOfItems * Math.floor(repeatNumbersNTimes / 2) +\n ((value + numberOfItems) % numberOfItems) -\n (!disableInfiniteScroll ? padWithNItems : 0),\n 0\n );\n};\n"],"mappings":";;;;;;AAAO,MAAMA,qBAAqB,GAAIC,SAMrC,IAAK;EACF,MAAM;IACFC,qBAAqB;IACrBC,aAAa;IACbC,aAAa;IACbC,mBAAmB;IACnBC;EACJ,CAAC,GAAGL,SAAS;EAEb,OAAOM,IAAI,CAACC,GAAG,CACXL,aAAa,GAAGI,IAAI,CAACE,KAAK,CAACJ,mBAAmB,GAAG,CAAC,CAAC,GAC9C,CAACC,KAAK,GAAGH,aAAa,IAAIA,aAAc,IACxC,CAACD,qBAAqB,GAAGE,aAAa,GAAG,CAAC,CAAC,EAChD,CACJ,CAAC;AACL,CAAC;AAACM,OAAA,CAAAV,qBAAA,GAAAA,qBAAA","ignoreList":[]}
|
|
@@ -4,7 +4,8 @@ import { View, Text, FlatList as RNFlatList } from "react-native";
|
|
|
4
4
|
import { colorToRgba } from "../../utils/colorToRgba";
|
|
5
5
|
import { generate12HourNumbers, generateNumbers } from "../../utils/generateNumbers";
|
|
6
6
|
import { getAdjustedLimit } from "../../utils/getAdjustedLimit";
|
|
7
|
-
import {
|
|
7
|
+
import { getDurationAndIndexFromScrollOffset } from "../../utils/getDurationAndIndexFromScrollOffset";
|
|
8
|
+
import { getInitialScrollIndex } from "../../utils/getInitialScrollIndex";
|
|
8
9
|
const DurationScroll = /*#__PURE__*/forwardRef((props, ref) => {
|
|
9
10
|
const {
|
|
10
11
|
aggressivelyGetLatestDuration,
|
|
@@ -33,28 +34,37 @@ const DurationScroll = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
33
34
|
testID,
|
|
34
35
|
topPickerGradientOverlayProps
|
|
35
36
|
} = props;
|
|
36
|
-
const
|
|
37
|
+
const safeRepeatNumbersNTimes = useMemo(() => {
|
|
38
|
+
if (!disableInfiniteScroll && repeatNumbersNTimes < 2) {
|
|
39
|
+
return 2;
|
|
40
|
+
} else if (repeatNumbersNTimes < 1) {
|
|
41
|
+
return 1;
|
|
42
|
+
}
|
|
43
|
+
return Math.round(repeatNumbersNTimes);
|
|
44
|
+
}, [disableInfiniteScroll, repeatNumbersNTimes]);
|
|
45
|
+
const numbersForFlatList = useMemo(() => {
|
|
37
46
|
if (is12HourPicker) {
|
|
38
47
|
return generate12HourNumbers({
|
|
39
48
|
padNumbersWithZero,
|
|
40
|
-
repeatNTimes:
|
|
49
|
+
repeatNTimes: safeRepeatNumbersNTimes,
|
|
41
50
|
disableInfiniteScroll,
|
|
42
51
|
padWithNItems
|
|
43
52
|
});
|
|
44
53
|
}
|
|
45
54
|
return generateNumbers(numberOfItems, {
|
|
46
55
|
padNumbersWithZero,
|
|
47
|
-
repeatNTimes:
|
|
56
|
+
repeatNTimes: safeRepeatNumbersNTimes,
|
|
48
57
|
disableInfiniteScroll,
|
|
49
58
|
padWithNItems
|
|
50
59
|
});
|
|
51
|
-
}, [disableInfiniteScroll, is12HourPicker, numberOfItems, padNumbersWithZero, padWithNItems,
|
|
52
|
-
const initialScrollIndex = useMemo(() =>
|
|
60
|
+
}, [disableInfiniteScroll, is12HourPicker, numberOfItems, padNumbersWithZero, padWithNItems, safeRepeatNumbersNTimes]);
|
|
61
|
+
const initialScrollIndex = useMemo(() => getInitialScrollIndex({
|
|
62
|
+
disableInfiniteScroll,
|
|
53
63
|
numberOfItems,
|
|
54
64
|
padWithNItems,
|
|
55
|
-
repeatNumbersNTimes,
|
|
65
|
+
repeatNumbersNTimes: safeRepeatNumbersNTimes,
|
|
56
66
|
value: initialValue
|
|
57
|
-
}), [initialValue, numberOfItems, padWithNItems,
|
|
67
|
+
}), [disableInfiniteScroll, initialValue, numberOfItems, padWithNItems, safeRepeatNumbersNTimes]);
|
|
58
68
|
const adjustedLimited = useMemo(() => getAdjustedLimit(limit, numberOfItems), [limit, numberOfItems]);
|
|
59
69
|
const numberOfItemsToShow = 1 + padWithNItems * 2;
|
|
60
70
|
|
|
@@ -89,28 +99,6 @@ const DurationScroll = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
89
99
|
};
|
|
90
100
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
91
101
|
}, [Audio]);
|
|
92
|
-
useImperativeHandle(ref, () => ({
|
|
93
|
-
reset: options => {
|
|
94
|
-
var _flatListRef$current;
|
|
95
|
-
(_flatListRef$current = flatListRef.current) === null || _flatListRef$current === void 0 || _flatListRef$current.scrollToIndex({
|
|
96
|
-
animated: (options === null || options === void 0 ? void 0 : options.animated) ?? false,
|
|
97
|
-
index: initialScrollIndex
|
|
98
|
-
});
|
|
99
|
-
},
|
|
100
|
-
setValue: (value, options) => {
|
|
101
|
-
var _flatListRef$current2;
|
|
102
|
-
(_flatListRef$current2 = flatListRef.current) === null || _flatListRef$current2 === void 0 || _flatListRef$current2.scrollToIndex({
|
|
103
|
-
animated: (options === null || options === void 0 ? void 0 : options.animated) ?? false,
|
|
104
|
-
index: getScrollIndex({
|
|
105
|
-
numberOfItems,
|
|
106
|
-
padWithNItems,
|
|
107
|
-
repeatNumbersNTimes,
|
|
108
|
-
value: value
|
|
109
|
-
})
|
|
110
|
-
});
|
|
111
|
-
},
|
|
112
|
-
latestDuration: latestDuration
|
|
113
|
-
}));
|
|
114
102
|
const renderItem = useCallback(({
|
|
115
103
|
item
|
|
116
104
|
}) => {
|
|
@@ -147,16 +135,21 @@ const DurationScroll = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
147
135
|
return;
|
|
148
136
|
}
|
|
149
137
|
if (aggressivelyGetLatestDuration) {
|
|
150
|
-
const
|
|
151
|
-
|
|
152
|
-
|
|
138
|
+
const newValues = getDurationAndIndexFromScrollOffset({
|
|
139
|
+
disableInfiniteScroll,
|
|
140
|
+
itemHeight: styles.pickerItemContainer.height,
|
|
141
|
+
numberOfItems,
|
|
142
|
+
padWithNItems,
|
|
143
|
+
yContentOffset: e.nativeEvent.contentOffset.y
|
|
144
|
+
});
|
|
145
|
+
if (newValues.duration !== latestDuration.current) {
|
|
153
146
|
// check limits
|
|
154
|
-
if (
|
|
155
|
-
|
|
156
|
-
} else if (
|
|
157
|
-
|
|
147
|
+
if (newValues.duration > adjustedLimited.max) {
|
|
148
|
+
newValues.duration = adjustedLimited.max;
|
|
149
|
+
} else if (newValues.duration < adjustedLimited.min) {
|
|
150
|
+
newValues.duration = adjustedLimited.min;
|
|
158
151
|
}
|
|
159
|
-
latestDuration.current =
|
|
152
|
+
latestDuration.current = newValues.duration;
|
|
160
153
|
}
|
|
161
154
|
}
|
|
162
155
|
if (Haptics || Audio) {
|
|
@@ -185,51 +178,56 @@ const DurationScroll = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
185
178
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
186
179
|
[adjustedLimited.max, adjustedLimited.min, aggressivelyGetLatestDuration, clickSound, disableInfiniteScroll, numberOfItems, padWithNItems, styles.pickerItemContainer.height]);
|
|
187
180
|
const onMomentumScrollEnd = useCallback(e => {
|
|
188
|
-
const
|
|
189
|
-
|
|
181
|
+
const newValues = getDurationAndIndexFromScrollOffset({
|
|
182
|
+
disableInfiniteScroll,
|
|
183
|
+
itemHeight: styles.pickerItemContainer.height,
|
|
184
|
+
numberOfItems,
|
|
185
|
+
padWithNItems,
|
|
186
|
+
yContentOffset: e.nativeEvent.contentOffset.y
|
|
187
|
+
});
|
|
190
188
|
|
|
191
189
|
// check limits
|
|
192
|
-
if (
|
|
193
|
-
var _flatListRef$
|
|
194
|
-
const targetScrollIndex =
|
|
195
|
-
(_flatListRef$
|
|
190
|
+
if (newValues.duration > adjustedLimited.max) {
|
|
191
|
+
var _flatListRef$current;
|
|
192
|
+
const targetScrollIndex = newValues.index - (newValues.duration - adjustedLimited.max);
|
|
193
|
+
(_flatListRef$current = flatListRef.current) === null || _flatListRef$current === void 0 || _flatListRef$current.scrollToIndex({
|
|
196
194
|
animated: true,
|
|
197
195
|
index:
|
|
198
196
|
// guard against scrolling beyond end of list
|
|
199
197
|
targetScrollIndex >= 0 ? targetScrollIndex : adjustedLimited.max - 1
|
|
200
198
|
}); // scroll down to max
|
|
201
|
-
|
|
202
|
-
} else if (
|
|
203
|
-
var _flatListRef$
|
|
204
|
-
const targetScrollIndex =
|
|
205
|
-
(_flatListRef$
|
|
199
|
+
newValues.duration = adjustedLimited.max;
|
|
200
|
+
} else if (newValues.duration < adjustedLimited.min) {
|
|
201
|
+
var _flatListRef$current2;
|
|
202
|
+
const targetScrollIndex = newValues.index + (adjustedLimited.min - newValues.duration);
|
|
203
|
+
(_flatListRef$current2 = flatListRef.current) === null || _flatListRef$current2 === void 0 || _flatListRef$current2.scrollToIndex({
|
|
206
204
|
animated: true,
|
|
207
205
|
index:
|
|
208
206
|
// guard against scrolling beyond end of list
|
|
209
|
-
targetScrollIndex <=
|
|
207
|
+
targetScrollIndex <= numbersForFlatList.length - 1 ? targetScrollIndex : adjustedLimited.min
|
|
210
208
|
}); // scroll up to min
|
|
211
|
-
|
|
209
|
+
newValues.duration = adjustedLimited.min;
|
|
212
210
|
}
|
|
213
|
-
onDurationChange(
|
|
214
|
-
}, [adjustedLimited.max, adjustedLimited.min,
|
|
211
|
+
onDurationChange(newValues.duration);
|
|
212
|
+
}, [adjustedLimited.max, adjustedLimited.min, numbersForFlatList.length, disableInfiniteScroll, numberOfItems, onDurationChange, padWithNItems, styles.pickerItemContainer.height]);
|
|
215
213
|
const onViewableItemsChanged = useCallback(({
|
|
216
214
|
viewableItems
|
|
217
215
|
}) => {
|
|
218
216
|
var _viewableItems$, _viewableItems$2;
|
|
219
217
|
if ((_viewableItems$ = viewableItems[0]) !== null && _viewableItems$ !== void 0 && _viewableItems$.index && viewableItems[0].index < numberOfItems * 0.5) {
|
|
220
|
-
var _flatListRef$
|
|
221
|
-
(_flatListRef$
|
|
218
|
+
var _flatListRef$current3;
|
|
219
|
+
(_flatListRef$current3 = flatListRef.current) === null || _flatListRef$current3 === void 0 || _flatListRef$current3.scrollToIndex({
|
|
222
220
|
animated: false,
|
|
223
221
|
index: viewableItems[0].index + numberOfItems
|
|
224
222
|
});
|
|
225
|
-
} else if ((_viewableItems$2 = viewableItems[0]) !== null && _viewableItems$2 !== void 0 && _viewableItems$2.index && viewableItems[0].index >= numberOfItems * (
|
|
226
|
-
var _flatListRef$
|
|
227
|
-
(_flatListRef$
|
|
223
|
+
} else if ((_viewableItems$2 = viewableItems[0]) !== null && _viewableItems$2 !== void 0 && _viewableItems$2.index && viewableItems[0].index >= numberOfItems * (safeRepeatNumbersNTimes - 0.5)) {
|
|
224
|
+
var _flatListRef$current4;
|
|
225
|
+
(_flatListRef$current4 = flatListRef.current) === null || _flatListRef$current4 === void 0 || _flatListRef$current4.scrollToIndex({
|
|
228
226
|
animated: false,
|
|
229
|
-
index: viewableItems[0].index - numberOfItems
|
|
227
|
+
index: viewableItems[0].index - numberOfItems
|
|
230
228
|
});
|
|
231
229
|
}
|
|
232
|
-
}, [numberOfItems,
|
|
230
|
+
}, [numberOfItems, safeRepeatNumbersNTimes]);
|
|
233
231
|
const getItemLayout = useCallback((_, index) => ({
|
|
234
232
|
length: styles.pickerItemContainer.height,
|
|
235
233
|
offset: styles.pickerItemContainer.height * index,
|
|
@@ -241,6 +239,29 @@ const DurationScroll = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
241
239
|
},
|
|
242
240
|
onViewableItemsChanged: onViewableItemsChanged
|
|
243
241
|
}]);
|
|
242
|
+
useImperativeHandle(ref, () => ({
|
|
243
|
+
reset: options => {
|
|
244
|
+
var _flatListRef$current5;
|
|
245
|
+
(_flatListRef$current5 = flatListRef.current) === null || _flatListRef$current5 === void 0 || _flatListRef$current5.scrollToIndex({
|
|
246
|
+
animated: (options === null || options === void 0 ? void 0 : options.animated) ?? false,
|
|
247
|
+
index: initialScrollIndex
|
|
248
|
+
});
|
|
249
|
+
},
|
|
250
|
+
setValue: (value, options) => {
|
|
251
|
+
var _flatListRef$current6;
|
|
252
|
+
(_flatListRef$current6 = flatListRef.current) === null || _flatListRef$current6 === void 0 || _flatListRef$current6.scrollToIndex({
|
|
253
|
+
animated: (options === null || options === void 0 ? void 0 : options.animated) ?? false,
|
|
254
|
+
index: getInitialScrollIndex({
|
|
255
|
+
disableInfiniteScroll,
|
|
256
|
+
numberOfItems,
|
|
257
|
+
padWithNItems,
|
|
258
|
+
repeatNumbersNTimes: safeRepeatNumbersNTimes,
|
|
259
|
+
value: value
|
|
260
|
+
})
|
|
261
|
+
});
|
|
262
|
+
},
|
|
263
|
+
latestDuration: latestDuration
|
|
264
|
+
}));
|
|
244
265
|
return /*#__PURE__*/React.createElement(View, {
|
|
245
266
|
pointerEvents: isDisabled ? "none" : undefined,
|
|
246
267
|
style: [{
|
|
@@ -250,7 +271,7 @@ const DurationScroll = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
250
271
|
testID: testID
|
|
251
272
|
}, /*#__PURE__*/React.createElement(FlatList, {
|
|
252
273
|
ref: flatListRef,
|
|
253
|
-
data:
|
|
274
|
+
data: numbersForFlatList,
|
|
254
275
|
decelerationRate: 0.88,
|
|
255
276
|
getItemLayout: getItemLayout,
|
|
256
277
|
initialScrollIndex: initialScrollIndex,
|
|
@@ -265,7 +286,7 @@ const DurationScroll = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
265
286
|
snapToAlignment: "start"
|
|
266
287
|
// used in place of snapToOffset due to bug on Android
|
|
267
288
|
,
|
|
268
|
-
snapToOffsets: [...Array(
|
|
289
|
+
snapToOffsets: [...Array(numbersForFlatList.length)].map((_, i) => i * styles.pickerItemContainer.height),
|
|
269
290
|
testID: "duration-scroll-flatlist",
|
|
270
291
|
viewabilityConfigCallbackPairs: !disableInfiniteScroll ? viewabilityConfigCallbackPairs === null || viewabilityConfigCallbackPairs === void 0 ? void 0 : viewabilityConfigCallbackPairs.current : undefined,
|
|
271
292
|
windowSize: numberOfItemsToShow
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useRef","useCallback","forwardRef","useImperativeHandle","useState","useEffect","useMemo","View","Text","FlatList","RNFlatList","colorToRgba","generate12HourNumbers","generateNumbers","getAdjustedLimit","getScrollIndex","DurationScroll","props","ref","aggressivelyGetLatestDuration","allowFontScaling","amLabel","Audio","bottomPickerGradientOverlayProps","clickSoundAsset","disableInfiniteScroll","Haptics","initialValue","is12HourPicker","isDisabled","label","limit","LinearGradient","numberOfItems","onDurationChange","padNumbersWithZero","padWithNItems","pickerGradientOverlayProps","pmLabel","repeatNumbersNTimes","styles","testID","topPickerGradientOverlayProps","data","repeatNTimes","initialScrollIndex","value","adjustedLimited","numberOfItemsToShow","latestDuration","lastFeedbackIndex","flatListRef","clickSound","setClickSound","loadSound","sound","Sound","createAsync","uri","shouldPlay","unloadAsync","reset","options","_flatListRef$current","current","scrollToIndex","animated","index","setValue","_flatListRef$current2","renderItem","item","stringItem","intItem","isAm","parseInt","includes","replace","createElement","key","style","pickerItemContainer","pickerItem","max","min","disabledPickerItem","pointerEvents","pickerAmPmContainer","pickerAmPmLabel","onScroll","e","newIndex","Math","round","nativeEvent","contentOffset","y","height","newDuration","feedbackIndex","selectionAsync","replayAsync","onMomentumScrollEnd","_flatListRef$current3","targetScrollIndex","_flatListRef$current4","length","onViewableItemsChanged","viewableItems","_viewableItems$","_viewableItems$2","_flatListRef$current5","_flatListRef$current6","getItemLayout","_","offset","viewabilityConfigCallbackPairs","viewabilityConfig","viewAreaCoveragePercentThreshold","undefined","overflow","disabledPickerContainer","decelerationRate","keyExtractor","toString","nestedScrollEnabled","scrollEnabled","scrollEventThrottle","showsVerticalScrollIndicator","snapToAlignment","snapToOffsets","Array","map","i","windowSize","pickerLabelContainer","pickerLabel","Fragment","_extends","colors","pickerContainer","backgroundColor","color","opacity","end","x","start","pickerGradientOverlay","top","bottom","memo"],"sources":["index.tsx"],"sourcesContent":["import React, {\n useRef,\n useCallback,\n forwardRef,\n useImperativeHandle,\n useState,\n useEffect,\n useMemo,\n} from \"react\";\n\nimport { View, Text, FlatList as RNFlatList } from \"react-native\";\nimport type {\n ViewabilityConfigCallbackPairs,\n ViewToken,\n NativeSyntheticEvent,\n NativeScrollEvent,\n} from \"react-native\";\n\nimport { colorToRgba } from \"../../utils/colorToRgba\";\nimport {\n generate12HourNumbers,\n generateNumbers,\n} from \"../../utils/generateNumbers\";\nimport { getAdjustedLimit } from \"../../utils/getAdjustedLimit\";\nimport { getScrollIndex } from \"../../utils/getScrollIndex\";\n\nimport type { DurationScrollProps, DurationScrollRef } from \"./types\";\n\nconst DurationScroll = forwardRef<DurationScrollRef, DurationScrollProps>(\n (props, ref) => {\n const {\n aggressivelyGetLatestDuration,\n allowFontScaling = false,\n amLabel,\n Audio,\n bottomPickerGradientOverlayProps,\n clickSoundAsset,\n disableInfiniteScroll = false,\n FlatList = RNFlatList,\n Haptics,\n initialValue = 0,\n is12HourPicker,\n isDisabled,\n label,\n limit,\n LinearGradient,\n numberOfItems,\n onDurationChange,\n padNumbersWithZero = false,\n padWithNItems,\n pickerGradientOverlayProps,\n pmLabel,\n repeatNumbersNTimes = 3,\n styles,\n testID,\n topPickerGradientOverlayProps,\n } = props;\n\n const data = useMemo(() => {\n if (is12HourPicker) {\n return generate12HourNumbers({\n padNumbersWithZero,\n repeatNTimes: repeatNumbersNTimes,\n disableInfiniteScroll,\n padWithNItems,\n });\n }\n\n return generateNumbers(numberOfItems, {\n padNumbersWithZero,\n repeatNTimes: repeatNumbersNTimes,\n disableInfiniteScroll,\n padWithNItems,\n });\n }, [\n disableInfiniteScroll,\n is12HourPicker,\n numberOfItems,\n padNumbersWithZero,\n padWithNItems,\n repeatNumbersNTimes,\n ]);\n\n const initialScrollIndex = useMemo(\n () =>\n getScrollIndex({\n numberOfItems,\n padWithNItems,\n repeatNumbersNTimes,\n value: initialValue,\n }),\n [\n initialValue,\n numberOfItems,\n padWithNItems,\n repeatNumbersNTimes,\n ]\n );\n\n const adjustedLimited = useMemo(\n () => getAdjustedLimit(limit, numberOfItems),\n [limit, numberOfItems]\n );\n\n const numberOfItemsToShow = 1 + padWithNItems * 2;\n\n // keep track of the latest duration as it scrolls\n const latestDuration = useRef(0);\n // keep track of the last index scrolled past for haptic/audio feedback\n const lastFeedbackIndex = useRef(0);\n\n const flatListRef = useRef<RNFlatList | null>(null);\n\n const [clickSound, setClickSound] = useState<\n | {\n replayAsync: () => Promise<void>;\n unloadAsync: () => Promise<void>;\n }\n | undefined\n >();\n\n // Preload the sound when the component mounts\n useEffect(() => {\n const loadSound = async () => {\n if (Audio) {\n const { sound } = await Audio.Sound.createAsync(\n clickSoundAsset ?? {\n // use a hosted sound as a fallback (do not use local asset due to loader issues\n // in some environments when including mp3 in library)\n uri: \"https://drive.google.com/uc?export=download&id=10e1YkbNsRh-vGx1jmS1Nntz8xzkBp4_I\",\n },\n { shouldPlay: false }\n );\n setClickSound(sound);\n }\n };\n loadSound();\n\n // Unload sound when component unmounts\n return () => {\n clickSound?.unloadAsync();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [Audio]);\n\n useImperativeHandle(ref, () => ({\n reset: (options) => {\n flatListRef.current?.scrollToIndex({\n animated: options?.animated ?? false,\n index: initialScrollIndex,\n });\n },\n setValue: (value, options) => {\n flatListRef.current?.scrollToIndex({\n animated: options?.animated ?? false,\n index: getScrollIndex({\n numberOfItems,\n padWithNItems,\n repeatNumbersNTimes,\n value: value,\n }),\n });\n },\n latestDuration: latestDuration,\n }));\n\n const renderItem = useCallback(\n ({ item }: { item: string }) => {\n let stringItem = item;\n let intItem: number;\n let isAm: boolean | undefined;\n\n if (!is12HourPicker) {\n intItem = parseInt(item);\n } else {\n isAm = item.includes(\"AM\");\n stringItem = item.replace(/\\s[AP]M/g, \"\");\n intItem = parseInt(stringItem);\n }\n\n return (\n <View\n key={item}\n style={styles.pickerItemContainer}\n testID=\"picker-item\">\n <Text\n allowFontScaling={allowFontScaling}\n style={[\n styles.pickerItem,\n intItem > adjustedLimited.max ||\n intItem < adjustedLimited.min\n ? styles.disabledPickerItem\n : {},\n ]}>\n {stringItem}\n </Text>\n {is12HourPicker ? (\n <View\n pointerEvents=\"none\"\n style={styles.pickerAmPmContainer}>\n <Text\n allowFontScaling={allowFontScaling}\n style={[styles.pickerAmPmLabel]}>\n {isAm ? amLabel : pmLabel}\n </Text>\n </View>\n ) : null}\n </View>\n );\n },\n [\n adjustedLimited.max,\n adjustedLimited.min,\n allowFontScaling,\n amLabel,\n is12HourPicker,\n pmLabel,\n styles.disabledPickerItem,\n styles.pickerAmPmContainer,\n styles.pickerAmPmLabel,\n styles.pickerItem,\n styles.pickerItemContainer,\n ]\n );\n\n const onScroll = useCallback(\n (e: NativeSyntheticEvent<NativeScrollEvent>) => {\n // this function is only used when the picker is in a modal and/or has Haptic/Audio feedback\n // it is used to ensure that the modal gets the latest duration on clicking\n // the confirm button, even if the scrollview is still scrolling\n if (!aggressivelyGetLatestDuration && !Haptics && !Audio) {\n return;\n }\n\n if (aggressivelyGetLatestDuration) {\n const newIndex = Math.round(\n e.nativeEvent.contentOffset.y /\n styles.pickerItemContainer.height\n );\n let newDuration =\n (disableInfiniteScroll\n ? newIndex\n : newIndex + padWithNItems) %\n (numberOfItems + 1);\n\n if (newDuration !== latestDuration.current) {\n // check limits\n if (newDuration > adjustedLimited.max) {\n newDuration = adjustedLimited.max;\n } else if (newDuration < adjustedLimited.min) {\n newDuration = adjustedLimited.min;\n }\n\n latestDuration.current = newDuration;\n }\n }\n\n if (Haptics || Audio) {\n const feedbackIndex = Math.round(\n (e.nativeEvent.contentOffset.y +\n styles.pickerItemContainer.height / 2) /\n styles.pickerItemContainer.height\n );\n\n if (feedbackIndex !== lastFeedbackIndex.current) {\n // this check stops the feedback firing when the component mounts\n if (lastFeedbackIndex.current) {\n // fire haptic feedback if available\n try {\n Haptics?.selectionAsync();\n } catch {\n // do nothing\n }\n\n // play click sound if available\n try {\n clickSound?.replayAsync();\n } catch {\n // do nothing\n }\n }\n\n lastFeedbackIndex.current = feedbackIndex;\n }\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n adjustedLimited.max,\n adjustedLimited.min,\n aggressivelyGetLatestDuration,\n clickSound,\n disableInfiniteScroll,\n numberOfItems,\n padWithNItems,\n styles.pickerItemContainer.height,\n ]\n );\n\n const onMomentumScrollEnd = useCallback(\n (e: NativeSyntheticEvent<NativeScrollEvent>) => {\n const newIndex = Math.round(\n e.nativeEvent.contentOffset.y /\n styles.pickerItemContainer.height\n );\n let newDuration =\n (disableInfiniteScroll\n ? newIndex\n : newIndex + padWithNItems) %\n (numberOfItems + 1);\n\n // check limits\n if (newDuration > adjustedLimited.max) {\n const targetScrollIndex =\n newIndex - (newDuration - adjustedLimited.max);\n flatListRef.current?.scrollToIndex({\n animated: true,\n index:\n // guard against scrolling beyond end of list\n targetScrollIndex >= 0\n ? targetScrollIndex\n : adjustedLimited.max - 1,\n }); // scroll down to max\n newDuration = adjustedLimited.max;\n } else if (newDuration < adjustedLimited.min) {\n const targetScrollIndex =\n newIndex + (adjustedLimited.min - newDuration);\n flatListRef.current?.scrollToIndex({\n animated: true,\n index:\n // guard against scrolling beyond end of list\n targetScrollIndex <= data.length - 1\n ? targetScrollIndex\n : adjustedLimited.min,\n }); // scroll up to min\n newDuration = adjustedLimited.min;\n }\n\n onDurationChange(newDuration);\n },\n [\n adjustedLimited.max,\n adjustedLimited.min,\n data.length,\n disableInfiniteScroll,\n numberOfItems,\n onDurationChange,\n padWithNItems,\n styles.pickerItemContainer.height,\n ]\n );\n\n const onViewableItemsChanged = useCallback(\n ({ viewableItems }: { viewableItems: ViewToken[] }) => {\n if (\n viewableItems[0]?.index &&\n viewableItems[0].index < numberOfItems * 0.5\n ) {\n flatListRef.current?.scrollToIndex({\n animated: false,\n index: viewableItems[0].index + numberOfItems,\n });\n } else if (\n viewableItems[0]?.index &&\n viewableItems[0].index >=\n numberOfItems * (repeatNumbersNTimes - 0.5)\n ) {\n flatListRef.current?.scrollToIndex({\n animated: false,\n index: viewableItems[0].index - numberOfItems - 1,\n });\n }\n },\n [numberOfItems, repeatNumbersNTimes]\n );\n\n const getItemLayout = useCallback(\n (_: ArrayLike<string> | null | undefined, index: number) => ({\n length: styles.pickerItemContainer.height,\n offset: styles.pickerItemContainer.height * index,\n index,\n }),\n [styles.pickerItemContainer.height]\n );\n\n const viewabilityConfigCallbackPairs =\n useRef<ViewabilityConfigCallbackPairs>([\n {\n viewabilityConfig: { viewAreaCoveragePercentThreshold: 0 },\n onViewableItemsChanged: onViewableItemsChanged,\n },\n ]);\n\n return (\n <View\n pointerEvents={isDisabled ? \"none\" : undefined}\n style={[\n {\n height:\n styles.pickerItemContainer.height *\n numberOfItemsToShow,\n overflow: \"visible\",\n },\n isDisabled && styles.disabledPickerContainer,\n ]}\n testID={testID}>\n <FlatList\n ref={flatListRef}\n data={data}\n decelerationRate={0.88}\n getItemLayout={getItemLayout}\n initialScrollIndex={initialScrollIndex}\n keyExtractor={(_, index) => index.toString()}\n nestedScrollEnabled\n onMomentumScrollEnd={onMomentumScrollEnd}\n onScroll={onScroll}\n renderItem={renderItem}\n scrollEnabled={!isDisabled}\n scrollEventThrottle={16}\n showsVerticalScrollIndicator={false}\n snapToAlignment=\"start\"\n // used in place of snapToOffset due to bug on Android\n snapToOffsets={[...Array(data.length)].map(\n (_, i) => i * styles.pickerItemContainer.height\n )}\n testID=\"duration-scroll-flatlist\"\n viewabilityConfigCallbackPairs={\n !disableInfiniteScroll\n ? viewabilityConfigCallbackPairs?.current\n : undefined\n }\n windowSize={numberOfItemsToShow}\n />\n <View pointerEvents=\"none\" style={styles.pickerLabelContainer}>\n {typeof label === \"string\" ? (\n <Text\n allowFontScaling={allowFontScaling}\n style={styles.pickerLabel}>\n {label}\n </Text>\n ) : (\n label ?? null\n )}\n </View>\n {LinearGradient ? (\n <>\n <LinearGradient\n colors={[\n styles.pickerContainer.backgroundColor ??\n \"white\",\n colorToRgba({\n color:\n styles.pickerContainer\n .backgroundColor ?? \"white\",\n opacity: 0,\n }),\n ]}\n end={{ x: 1, y: 1 }}\n pointerEvents=\"none\"\n start={{ x: 1, y: 0.3 }}\n {...pickerGradientOverlayProps}\n {...topPickerGradientOverlayProps}\n style={[styles.pickerGradientOverlay, { top: 0 }]}\n />\n <LinearGradient\n colors={[\n colorToRgba({\n color:\n styles.pickerContainer\n .backgroundColor ?? \"white\",\n opacity: 0,\n }),\n styles.pickerContainer.backgroundColor ??\n \"white\",\n ]}\n end={{ x: 1, y: 0.7 }}\n pointerEvents=\"none\"\n start={{ x: 1, y: 0 }}\n {...pickerGradientOverlayProps}\n {...bottomPickerGradientOverlayProps}\n style={[\n styles.pickerGradientOverlay,\n { bottom: -1 },\n ]}\n />\n </>\n ) : null}\n </View>\n );\n }\n);\n\nexport default React.memo(DurationScroll);\n"],"mappings":";AAAA,OAAOA,KAAK,IACRC,MAAM,EACNC,WAAW,EACXC,UAAU,EACVC,mBAAmB,EACnBC,QAAQ,EACRC,SAAS,EACTC,OAAO,QACJ,OAAO;AAEd,SAASC,IAAI,EAAEC,IAAI,EAAEC,QAAQ,IAAIC,UAAU,QAAQ,cAAc;AAQjE,SAASC,WAAW,QAAQ,yBAAyB;AACrD,SACIC,qBAAqB,EACrBC,eAAe,QACZ,6BAA6B;AACpC,SAASC,gBAAgB,QAAQ,8BAA8B;AAC/D,SAASC,cAAc,QAAQ,4BAA4B;AAI3D,MAAMC,cAAc,gBAAGd,UAAU,CAC7B,CAACe,KAAK,EAAEC,GAAG,KAAK;EACZ,MAAM;IACFC,6BAA6B;IAC7BC,gBAAgB,GAAG,KAAK;IACxBC,OAAO;IACPC,KAAK;IACLC,gCAAgC;IAChCC,eAAe;IACfC,qBAAqB,GAAG,KAAK;IAC7BhB,QAAQ,GAAGC,UAAU;IACrBgB,OAAO;IACPC,YAAY,GAAG,CAAC;IAChBC,cAAc;IACdC,UAAU;IACVC,KAAK;IACLC,KAAK;IACLC,cAAc;IACdC,aAAa;IACbC,gBAAgB;IAChBC,kBAAkB,GAAG,KAAK;IAC1BC,aAAa;IACbC,0BAA0B;IAC1BC,OAAO;IACPC,mBAAmB,GAAG,CAAC;IACvBC,MAAM;IACNC,MAAM;IACNC;EACJ,CAAC,GAAGzB,KAAK;EAET,MAAM0B,IAAI,GAAGrC,OAAO,CAAC,MAAM;IACvB,IAAIsB,cAAc,EAAE;MAChB,OAAOhB,qBAAqB,CAAC;QACzBuB,kBAAkB;QAClBS,YAAY,EAAEL,mBAAmB;QACjCd,qBAAqB;QACrBW;MACJ,CAAC,CAAC;IACN;IAEA,OAAOvB,eAAe,CAACoB,aAAa,EAAE;MAClCE,kBAAkB;MAClBS,YAAY,EAAEL,mBAAmB;MACjCd,qBAAqB;MACrBW;IACJ,CAAC,CAAC;EACN,CAAC,EAAE,CACCX,qBAAqB,EACrBG,cAAc,EACdK,aAAa,EACbE,kBAAkB,EAClBC,aAAa,EACbG,mBAAmB,CACtB,CAAC;EAEF,MAAMM,kBAAkB,GAAGvC,OAAO,CAC9B,MACIS,cAAc,CAAC;IACXkB,aAAa;IACbG,aAAa;IACbG,mBAAmB;IACnBO,KAAK,EAAEnB;EACX,CAAC,CAAC,EACN,CACIA,YAAY,EACZM,aAAa,EACbG,aAAa,EACbG,mBAAmB,CAE3B,CAAC;EAED,MAAMQ,eAAe,GAAGzC,OAAO,CAC3B,MAAMQ,gBAAgB,CAACiB,KAAK,EAAEE,aAAa,CAAC,EAC5C,CAACF,KAAK,EAAEE,aAAa,CACzB,CAAC;EAED,MAAMe,mBAAmB,GAAG,CAAC,GAAGZ,aAAa,GAAG,CAAC;;EAEjD;EACA,MAAMa,cAAc,GAAGjD,MAAM,CAAC,CAAC,CAAC;EAChC;EACA,MAAMkD,iBAAiB,GAAGlD,MAAM,CAAC,CAAC,CAAC;EAEnC,MAAMmD,WAAW,GAAGnD,MAAM,CAAoB,IAAI,CAAC;EAEnD,MAAM,CAACoD,UAAU,EAAEC,aAAa,CAAC,GAAGjD,QAAQ,CAM1C,CAAC;;EAEH;EACAC,SAAS,CAAC,MAAM;IACZ,MAAMiD,SAAS,GAAG,MAAAA,CAAA,KAAY;MAC1B,IAAIhC,KAAK,EAAE;QACP,MAAM;UAAEiC;QAAM,CAAC,GAAG,MAAMjC,KAAK,CAACkC,KAAK,CAACC,WAAW,CAC3CjC,eAAe,IAAI;UACf;UACA;UACAkC,GAAG,EAAE;QACT,CAAC,EACD;UAAEC,UAAU,EAAE;QAAM,CACxB,CAAC;QACDN,aAAa,CAACE,KAAK,CAAC;MACxB;IACJ,CAAC;IACDD,SAAS,CAAC,CAAC;;IAEX;IACA,OAAO,MAAM;MACTF,UAAU,aAAVA,UAAU,eAAVA,UAAU,CAAEQ,WAAW,CAAC,CAAC;IAC7B,CAAC;IACD;EACJ,CAAC,EAAE,CAACtC,KAAK,CAAC,CAAC;EAEXnB,mBAAmB,CAACe,GAAG,EAAE,OAAO;IAC5B2C,KAAK,EAAGC,OAAO,IAAK;MAAA,IAAAC,oBAAA;MAChB,CAAAA,oBAAA,GAAAZ,WAAW,CAACa,OAAO,cAAAD,oBAAA,eAAnBA,oBAAA,CAAqBE,aAAa,CAAC;QAC/BC,QAAQ,EAAE,CAAAJ,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEI,QAAQ,KAAI,KAAK;QACpCC,KAAK,EAAEtB;MACX,CAAC,CAAC;IACN,CAAC;IACDuB,QAAQ,EAAEA,CAACtB,KAAK,EAAEgB,OAAO,KAAK;MAAA,IAAAO,qBAAA;MAC1B,CAAAA,qBAAA,GAAAlB,WAAW,CAACa,OAAO,cAAAK,qBAAA,eAAnBA,qBAAA,CAAqBJ,aAAa,CAAC;QAC/BC,QAAQ,EAAE,CAAAJ,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEI,QAAQ,KAAI,KAAK;QACpCC,KAAK,EAAEpD,cAAc,CAAC;UAClBkB,aAAa;UACbG,aAAa;UACbG,mBAAmB;UACnBO,KAAK,EAAEA;QACX,CAAC;MACL,CAAC,CAAC;IACN,CAAC;IACDG,cAAc,EAAEA;EACpB,CAAC,CAAC,CAAC;EAEH,MAAMqB,UAAU,GAAGrE,WAAW,CAC1B,CAAC;IAAEsE;EAAuB,CAAC,KAAK;IAC5B,IAAIC,UAAU,GAAGD,IAAI;IACrB,IAAIE,OAAe;IACnB,IAAIC,IAAyB;IAE7B,IAAI,CAAC9C,cAAc,EAAE;MACjB6C,OAAO,GAAGE,QAAQ,CAACJ,IAAI,CAAC;IAC5B,CAAC,MAAM;MACHG,IAAI,GAAGH,IAAI,CAACK,QAAQ,CAAC,IAAI,CAAC;MAC1BJ,UAAU,GAAGD,IAAI,CAACM,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;MACzCJ,OAAO,GAAGE,QAAQ,CAACH,UAAU,CAAC;IAClC;IAEA,oBACIzE,KAAA,CAAA+E,aAAA,CAACvE,IAAI;MACDwE,GAAG,EAAER,IAAK;MACVS,KAAK,EAAExC,MAAM,CAACyC,mBAAoB;MAClCxC,MAAM,EAAC;IAAa,gBACpB1C,KAAA,CAAA+E,aAAA,CAACtE,IAAI;MACDY,gBAAgB,EAAEA,gBAAiB;MACnC4D,KAAK,EAAE,CACHxC,MAAM,CAAC0C,UAAU,EACjBT,OAAO,GAAG1B,eAAe,CAACoC,GAAG,IAC7BV,OAAO,GAAG1B,eAAe,CAACqC,GAAG,GACvB5C,MAAM,CAAC6C,kBAAkB,GACzB,CAAC,CAAC;IACV,GACDb,UACC,CAAC,EACN5C,cAAc,gBACX7B,KAAA,CAAA+E,aAAA,CAACvE,IAAI;MACD+E,aAAa,EAAC,MAAM;MACpBN,KAAK,EAAExC,MAAM,CAAC+C;IAAoB,gBAClCxF,KAAA,CAAA+E,aAAA,CAACtE,IAAI;MACDY,gBAAgB,EAAEA,gBAAiB;MACnC4D,KAAK,EAAE,CAACxC,MAAM,CAACgD,eAAe;IAAE,GAC/Bd,IAAI,GAAGrD,OAAO,GAAGiB,OAChB,CACJ,CAAC,GACP,IACF,CAAC;EAEf,CAAC,EACD,CACIS,eAAe,CAACoC,GAAG,EACnBpC,eAAe,CAACqC,GAAG,EACnBhE,gBAAgB,EAChBC,OAAO,EACPO,cAAc,EACdU,OAAO,EACPE,MAAM,CAAC6C,kBAAkB,EACzB7C,MAAM,CAAC+C,mBAAmB,EAC1B/C,MAAM,CAACgD,eAAe,EACtBhD,MAAM,CAAC0C,UAAU,EACjB1C,MAAM,CAACyC,mBAAmB,CAElC,CAAC;EAED,MAAMQ,QAAQ,GAAGxF,WAAW,CACvByF,CAA0C,IAAK;IAC5C;IACA;IACA;IACA,IAAI,CAACvE,6BAA6B,IAAI,CAACO,OAAO,IAAI,CAACJ,KAAK,EAAE;MACtD;IACJ;IAEA,IAAIH,6BAA6B,EAAE;MAC/B,MAAMwE,QAAQ,GAAGC,IAAI,CAACC,KAAK,CACvBH,CAAC,CAACI,WAAW,CAACC,aAAa,CAACC,CAAC,GACzBxD,MAAM,CAACyC,mBAAmB,CAACgB,MACnC,CAAC;MACD,IAAIC,WAAW,GACX,CAACzE,qBAAqB,GAChBkE,QAAQ,GACRA,QAAQ,GAAGvD,aAAa,KAC7BH,aAAa,GAAG,CAAC,CAAC;MAEvB,IAAIiE,WAAW,KAAKjD,cAAc,CAACe,OAAO,EAAE;QACxC;QACA,IAAIkC,WAAW,GAAGnD,eAAe,CAACoC,GAAG,EAAE;UACnCe,WAAW,GAAGnD,eAAe,CAACoC,GAAG;QACrC,CAAC,MAAM,IAAIe,WAAW,GAAGnD,eAAe,CAACqC,GAAG,EAAE;UAC1Cc,WAAW,GAAGnD,eAAe,CAACqC,GAAG;QACrC;QAEAnC,cAAc,CAACe,OAAO,GAAGkC,WAAW;MACxC;IACJ;IAEA,IAAIxE,OAAO,IAAIJ,KAAK,EAAE;MAClB,MAAM6E,aAAa,GAAGP,IAAI,CAACC,KAAK,CAC5B,CAACH,CAAC,CAACI,WAAW,CAACC,aAAa,CAACC,CAAC,GAC1BxD,MAAM,CAACyC,mBAAmB,CAACgB,MAAM,GAAG,CAAC,IACrCzD,MAAM,CAACyC,mBAAmB,CAACgB,MACnC,CAAC;MAED,IAAIE,aAAa,KAAKjD,iBAAiB,CAACc,OAAO,EAAE;QAC7C;QACA,IAAId,iBAAiB,CAACc,OAAO,EAAE;UAC3B;UACA,IAAI;YACAtC,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAE0E,cAAc,CAAC,CAAC;UAC7B,CAAC,CAAC,MAAM;YACJ;UAAA;;UAGJ;UACA,IAAI;YACAhD,UAAU,aAAVA,UAAU,eAAVA,UAAU,CAAEiD,WAAW,CAAC,CAAC;UAC7B,CAAC,CAAC,MAAM;YACJ;UAAA;QAER;QAEAnD,iBAAiB,CAACc,OAAO,GAAGmC,aAAa;MAC7C;IACJ;EACJ,CAAC;EACD;EACA,CACIpD,eAAe,CAACoC,GAAG,EACnBpC,eAAe,CAACqC,GAAG,EACnBjE,6BAA6B,EAC7BiC,UAAU,EACV3B,qBAAqB,EACrBQ,aAAa,EACbG,aAAa,EACbI,MAAM,CAACyC,mBAAmB,CAACgB,MAAM,CAEzC,CAAC;EAED,MAAMK,mBAAmB,GAAGrG,WAAW,CAClCyF,CAA0C,IAAK;IAC5C,MAAMC,QAAQ,GAAGC,IAAI,CAACC,KAAK,CACvBH,CAAC,CAACI,WAAW,CAACC,aAAa,CAACC,CAAC,GACzBxD,MAAM,CAACyC,mBAAmB,CAACgB,MACnC,CAAC;IACD,IAAIC,WAAW,GACX,CAACzE,qBAAqB,GAChBkE,QAAQ,GACRA,QAAQ,GAAGvD,aAAa,KAC7BH,aAAa,GAAG,CAAC,CAAC;;IAEvB;IACA,IAAIiE,WAAW,GAAGnD,eAAe,CAACoC,GAAG,EAAE;MAAA,IAAAoB,qBAAA;MACnC,MAAMC,iBAAiB,GACnBb,QAAQ,IAAIO,WAAW,GAAGnD,eAAe,CAACoC,GAAG,CAAC;MAClD,CAAAoB,qBAAA,GAAApD,WAAW,CAACa,OAAO,cAAAuC,qBAAA,eAAnBA,qBAAA,CAAqBtC,aAAa,CAAC;QAC/BC,QAAQ,EAAE,IAAI;QACdC,KAAK;QACD;QACAqC,iBAAiB,IAAI,CAAC,GAChBA,iBAAiB,GACjBzD,eAAe,CAACoC,GAAG,GAAG;MACpC,CAAC,CAAC,CAAC,CAAC;MACJe,WAAW,GAAGnD,eAAe,CAACoC,GAAG;IACrC,CAAC,MAAM,IAAIe,WAAW,GAAGnD,eAAe,CAACqC,GAAG,EAAE;MAAA,IAAAqB,qBAAA;MAC1C,MAAMD,iBAAiB,GACnBb,QAAQ,IAAI5C,eAAe,CAACqC,GAAG,GAAGc,WAAW,CAAC;MAClD,CAAAO,qBAAA,GAAAtD,WAAW,CAACa,OAAO,cAAAyC,qBAAA,eAAnBA,qBAAA,CAAqBxC,aAAa,CAAC;QAC/BC,QAAQ,EAAE,IAAI;QACdC,KAAK;QACD;QACAqC,iBAAiB,IAAI7D,IAAI,CAAC+D,MAAM,GAAG,CAAC,GAC9BF,iBAAiB,GACjBzD,eAAe,CAACqC;MAC9B,CAAC,CAAC,CAAC,CAAC;MACJc,WAAW,GAAGnD,eAAe,CAACqC,GAAG;IACrC;IAEAlD,gBAAgB,CAACgE,WAAW,CAAC;EACjC,CAAC,EACD,CACInD,eAAe,CAACoC,GAAG,EACnBpC,eAAe,CAACqC,GAAG,EACnBzC,IAAI,CAAC+D,MAAM,EACXjF,qBAAqB,EACrBQ,aAAa,EACbC,gBAAgB,EAChBE,aAAa,EACbI,MAAM,CAACyC,mBAAmB,CAACgB,MAAM,CAEzC,CAAC;EAED,MAAMU,sBAAsB,GAAG1G,WAAW,CACtC,CAAC;IAAE2G;EAA8C,CAAC,KAAK;IAAA,IAAAC,eAAA,EAAAC,gBAAA;IACnD,IACI,CAAAD,eAAA,GAAAD,aAAa,CAAC,CAAC,CAAC,cAAAC,eAAA,eAAhBA,eAAA,CAAkB1C,KAAK,IACvByC,aAAa,CAAC,CAAC,CAAC,CAACzC,KAAK,GAAGlC,aAAa,GAAG,GAAG,EAC9C;MAAA,IAAA8E,qBAAA;MACE,CAAAA,qBAAA,GAAA5D,WAAW,CAACa,OAAO,cAAA+C,qBAAA,eAAnBA,qBAAA,CAAqB9C,aAAa,CAAC;QAC/BC,QAAQ,EAAE,KAAK;QACfC,KAAK,EAAEyC,aAAa,CAAC,CAAC,CAAC,CAACzC,KAAK,GAAGlC;MACpC,CAAC,CAAC;IACN,CAAC,MAAM,IACH,CAAA6E,gBAAA,GAAAF,aAAa,CAAC,CAAC,CAAC,cAAAE,gBAAA,eAAhBA,gBAAA,CAAkB3C,KAAK,IACvByC,aAAa,CAAC,CAAC,CAAC,CAACzC,KAAK,IAClBlC,aAAa,IAAIM,mBAAmB,GAAG,GAAG,CAAC,EACjD;MAAA,IAAAyE,qBAAA;MACE,CAAAA,qBAAA,GAAA7D,WAAW,CAACa,OAAO,cAAAgD,qBAAA,eAAnBA,qBAAA,CAAqB/C,aAAa,CAAC;QAC/BC,QAAQ,EAAE,KAAK;QACfC,KAAK,EAAEyC,aAAa,CAAC,CAAC,CAAC,CAACzC,KAAK,GAAGlC,aAAa,GAAG;MACpD,CAAC,CAAC;IACN;EACJ,CAAC,EACD,CAACA,aAAa,EAAEM,mBAAmB,CACvC,CAAC;EAED,MAAM0E,aAAa,GAAGhH,WAAW,CAC7B,CAACiH,CAAuC,EAAE/C,KAAa,MAAM;IACzDuC,MAAM,EAAElE,MAAM,CAACyC,mBAAmB,CAACgB,MAAM;IACzCkB,MAAM,EAAE3E,MAAM,CAACyC,mBAAmB,CAACgB,MAAM,GAAG9B,KAAK;IACjDA;EACJ,CAAC,CAAC,EACF,CAAC3B,MAAM,CAACyC,mBAAmB,CAACgB,MAAM,CACtC,CAAC;EAED,MAAMmB,8BAA8B,GAChCpH,MAAM,CAAiC,CACnC;IACIqH,iBAAiB,EAAE;MAAEC,gCAAgC,EAAE;IAAE,CAAC;IAC1DX,sBAAsB,EAAEA;EAC5B,CAAC,CACJ,CAAC;EAEN,oBACI5G,KAAA,CAAA+E,aAAA,CAACvE,IAAI;IACD+E,aAAa,EAAEzD,UAAU,GAAG,MAAM,GAAG0F,SAAU;IAC/CvC,KAAK,EAAE,CACH;MACIiB,MAAM,EACFzD,MAAM,CAACyC,mBAAmB,CAACgB,MAAM,GACjCjD,mBAAmB;MACvBwE,QAAQ,EAAE;IACd,CAAC,EACD3F,UAAU,IAAIW,MAAM,CAACiF,uBAAuB,CAC9C;IACFhF,MAAM,EAAEA;EAAO,gBACf1C,KAAA,CAAA+E,aAAA,CAACrE,QAAQ;IACLS,GAAG,EAAEiC,WAAY;IACjBR,IAAI,EAAEA,IAAK;IACX+E,gBAAgB,EAAE,IAAK;IACvBT,aAAa,EAAEA,aAAc;IAC7BpE,kBAAkB,EAAEA,kBAAmB;IACvC8E,YAAY,EAAEA,CAACT,CAAC,EAAE/C,KAAK,KAAKA,KAAK,CAACyD,QAAQ,CAAC,CAAE;IAC7CC,mBAAmB;IACnBvB,mBAAmB,EAAEA,mBAAoB;IACzCb,QAAQ,EAAEA,QAAS;IACnBnB,UAAU,EAAEA,UAAW;IACvBwD,aAAa,EAAE,CAACjG,UAAW;IAC3BkG,mBAAmB,EAAE,EAAG;IACxBC,4BAA4B,EAAE,KAAM;IACpCC,eAAe,EAAC;IAChB;IAAA;IACAC,aAAa,EAAE,CAAC,GAAGC,KAAK,CAACxF,IAAI,CAAC+D,MAAM,CAAC,CAAC,CAAC0B,GAAG,CACtC,CAAClB,CAAC,EAAEmB,CAAC,KAAKA,CAAC,GAAG7F,MAAM,CAACyC,mBAAmB,CAACgB,MAC7C,CAAE;IACFxD,MAAM,EAAC,0BAA0B;IACjC2E,8BAA8B,EAC1B,CAAC3F,qBAAqB,GAChB2F,8BAA8B,aAA9BA,8BAA8B,uBAA9BA,8BAA8B,CAAEpD,OAAO,GACvCuD,SACT;IACDe,UAAU,EAAEtF;EAAoB,CACnC,CAAC,eACFjD,KAAA,CAAA+E,aAAA,CAACvE,IAAI;IAAC+E,aAAa,EAAC,MAAM;IAACN,KAAK,EAAExC,MAAM,CAAC+F;EAAqB,GACzD,OAAOzG,KAAK,KAAK,QAAQ,gBACtB/B,KAAA,CAAA+E,aAAA,CAACtE,IAAI;IACDY,gBAAgB,EAAEA,gBAAiB;IACnC4D,KAAK,EAAExC,MAAM,CAACgG;EAAY,GACzB1G,KACC,CAAC,GAEPA,KAAK,IAAI,IAEX,CAAC,EACNE,cAAc,gBACXjC,KAAA,CAAA+E,aAAA,CAAA/E,KAAA,CAAA0I,QAAA,qBACI1I,KAAA,CAAA+E,aAAA,CAAC9C,cAAc,EAAA0G,QAAA;IACXC,MAAM,EAAE,CACJnG,MAAM,CAACoG,eAAe,CAACC,eAAe,IAClC,OAAO,EACXlI,WAAW,CAAC;MACRmI,KAAK,EACDtG,MAAM,CAACoG,eAAe,CACjBC,eAAe,IAAI,OAAO;MACnCE,OAAO,EAAE;IACb,CAAC,CAAC,CACJ;IACFC,GAAG,EAAE;MAAEC,CAAC,EAAE,CAAC;MAAEjD,CAAC,EAAE;IAAE,CAAE;IACpBV,aAAa,EAAC,MAAM;IACpB4D,KAAK,EAAE;MAAED,CAAC,EAAE,CAAC;MAAEjD,CAAC,EAAE;IAAI;EAAE,GACpB3D,0BAA0B,EAC1BK,6BAA6B;IACjCsC,KAAK,EAAE,CAACxC,MAAM,CAAC2G,qBAAqB,EAAE;MAAEC,GAAG,EAAE;IAAE,CAAC;EAAE,EACrD,CAAC,eACFrJ,KAAA,CAAA+E,aAAA,CAAC9C,cAAc,EAAA0G,QAAA;IACXC,MAAM,EAAE,CACJhI,WAAW,CAAC;MACRmI,KAAK,EACDtG,MAAM,CAACoG,eAAe,CACjBC,eAAe,IAAI,OAAO;MACnCE,OAAO,EAAE;IACb,CAAC,CAAC,EACFvG,MAAM,CAACoG,eAAe,CAACC,eAAe,IAClC,OAAO,CACb;IACFG,GAAG,EAAE;MAAEC,CAAC,EAAE,CAAC;MAAEjD,CAAC,EAAE;IAAI,CAAE;IACtBV,aAAa,EAAC,MAAM;IACpB4D,KAAK,EAAE;MAAED,CAAC,EAAE,CAAC;MAAEjD,CAAC,EAAE;IAAE;EAAE,GAClB3D,0BAA0B,EAC1Bd,gCAAgC;IACpCyD,KAAK,EAAE,CACHxC,MAAM,CAAC2G,qBAAqB,EAC5B;MAAEE,MAAM,EAAE,CAAC;IAAE,CAAC;EAChB,EACL,CACH,CAAC,GACH,IACF,CAAC;AAEf,CACJ,CAAC;AAED,4BAAetJ,KAAK,CAACuJ,IAAI,CAACtI,cAAc,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["React","useRef","useCallback","forwardRef","useImperativeHandle","useState","useEffect","useMemo","View","Text","FlatList","RNFlatList","colorToRgba","generate12HourNumbers","generateNumbers","getAdjustedLimit","getDurationAndIndexFromScrollOffset","getInitialScrollIndex","DurationScroll","props","ref","aggressivelyGetLatestDuration","allowFontScaling","amLabel","Audio","bottomPickerGradientOverlayProps","clickSoundAsset","disableInfiniteScroll","Haptics","initialValue","is12HourPicker","isDisabled","label","limit","LinearGradient","numberOfItems","onDurationChange","padNumbersWithZero","padWithNItems","pickerGradientOverlayProps","pmLabel","repeatNumbersNTimes","styles","testID","topPickerGradientOverlayProps","safeRepeatNumbersNTimes","Math","round","numbersForFlatList","repeatNTimes","initialScrollIndex","value","adjustedLimited","numberOfItemsToShow","latestDuration","lastFeedbackIndex","flatListRef","clickSound","setClickSound","loadSound","sound","Sound","createAsync","uri","shouldPlay","unloadAsync","renderItem","item","stringItem","intItem","isAm","parseInt","includes","replace","createElement","key","style","pickerItemContainer","pickerItem","max","min","disabledPickerItem","pointerEvents","pickerAmPmContainer","pickerAmPmLabel","onScroll","e","newValues","itemHeight","height","yContentOffset","nativeEvent","contentOffset","y","duration","current","feedbackIndex","selectionAsync","replayAsync","onMomentumScrollEnd","_flatListRef$current","targetScrollIndex","index","scrollToIndex","animated","_flatListRef$current2","length","onViewableItemsChanged","viewableItems","_viewableItems$","_viewableItems$2","_flatListRef$current3","_flatListRef$current4","getItemLayout","_","offset","viewabilityConfigCallbackPairs","viewabilityConfig","viewAreaCoveragePercentThreshold","reset","options","_flatListRef$current5","setValue","_flatListRef$current6","undefined","overflow","disabledPickerContainer","data","decelerationRate","keyExtractor","toString","nestedScrollEnabled","scrollEnabled","scrollEventThrottle","showsVerticalScrollIndicator","snapToAlignment","snapToOffsets","Array","map","i","windowSize","pickerLabelContainer","pickerLabel","Fragment","_extends","colors","pickerContainer","backgroundColor","color","opacity","end","x","start","pickerGradientOverlay","top","bottom","memo"],"sources":["index.tsx"],"sourcesContent":["import React, {\n useRef,\n useCallback,\n forwardRef,\n useImperativeHandle,\n useState,\n useEffect,\n useMemo,\n} from \"react\";\n\nimport { View, Text, FlatList as RNFlatList } from \"react-native\";\nimport type {\n ViewabilityConfigCallbackPairs,\n ViewToken,\n NativeSyntheticEvent,\n NativeScrollEvent,\n} from \"react-native\";\n\nimport { colorToRgba } from \"../../utils/colorToRgba\";\nimport {\n generate12HourNumbers,\n generateNumbers,\n} from \"../../utils/generateNumbers\";\nimport { getAdjustedLimit } from \"../../utils/getAdjustedLimit\";\nimport { getDurationAndIndexFromScrollOffset } from \"../../utils/getDurationAndIndexFromScrollOffset\";\nimport { getInitialScrollIndex } from \"../../utils/getInitialScrollIndex\";\n\nimport type { DurationScrollProps, DurationScrollRef } from \"./types\";\n\nconst DurationScroll = forwardRef<DurationScrollRef, DurationScrollProps>(\n (props, ref) => {\n const {\n aggressivelyGetLatestDuration,\n allowFontScaling = false,\n amLabel,\n Audio,\n bottomPickerGradientOverlayProps,\n clickSoundAsset,\n disableInfiniteScroll = false,\n FlatList = RNFlatList,\n Haptics,\n initialValue = 0,\n is12HourPicker,\n isDisabled,\n label,\n limit,\n LinearGradient,\n numberOfItems,\n onDurationChange,\n padNumbersWithZero = false,\n padWithNItems,\n pickerGradientOverlayProps,\n pmLabel,\n repeatNumbersNTimes = 3,\n styles,\n testID,\n topPickerGradientOverlayProps,\n } = props;\n\n const safeRepeatNumbersNTimes = useMemo(() => {\n if (!disableInfiniteScroll && repeatNumbersNTimes < 2) {\n return 2;\n } else if (repeatNumbersNTimes < 1) {\n return 1;\n }\n\n return Math.round(repeatNumbersNTimes);\n }, [disableInfiniteScroll, repeatNumbersNTimes]);\n\n const numbersForFlatList = useMemo(() => {\n if (is12HourPicker) {\n return generate12HourNumbers({\n padNumbersWithZero,\n repeatNTimes: safeRepeatNumbersNTimes,\n disableInfiniteScroll,\n padWithNItems,\n });\n }\n\n return generateNumbers(numberOfItems, {\n padNumbersWithZero,\n repeatNTimes: safeRepeatNumbersNTimes,\n disableInfiniteScroll,\n padWithNItems,\n });\n }, [\n disableInfiniteScroll,\n is12HourPicker,\n numberOfItems,\n padNumbersWithZero,\n padWithNItems,\n safeRepeatNumbersNTimes,\n ]);\n\n const initialScrollIndex = useMemo(\n () =>\n getInitialScrollIndex({\n disableInfiniteScroll,\n numberOfItems,\n padWithNItems,\n repeatNumbersNTimes: safeRepeatNumbersNTimes,\n value: initialValue,\n }),\n [\n disableInfiniteScroll,\n initialValue,\n numberOfItems,\n padWithNItems,\n safeRepeatNumbersNTimes,\n ]\n );\n\n const adjustedLimited = useMemo(\n () => getAdjustedLimit(limit, numberOfItems),\n [limit, numberOfItems]\n );\n\n const numberOfItemsToShow = 1 + padWithNItems * 2;\n\n // keep track of the latest duration as it scrolls\n const latestDuration = useRef(0);\n // keep track of the last index scrolled past for haptic/audio feedback\n const lastFeedbackIndex = useRef(0);\n\n const flatListRef = useRef<RNFlatList | null>(null);\n\n const [clickSound, setClickSound] = useState<\n | {\n replayAsync: () => Promise<void>;\n unloadAsync: () => Promise<void>;\n }\n | undefined\n >();\n\n // Preload the sound when the component mounts\n useEffect(() => {\n const loadSound = async () => {\n if (Audio) {\n const { sound } = await Audio.Sound.createAsync(\n clickSoundAsset ?? {\n // use a hosted sound as a fallback (do not use local asset due to loader issues\n // in some environments when including mp3 in library)\n uri: \"https://drive.google.com/uc?export=download&id=10e1YkbNsRh-vGx1jmS1Nntz8xzkBp4_I\",\n },\n { shouldPlay: false }\n );\n setClickSound(sound);\n }\n };\n\n loadSound();\n\n // Unload sound when component unmounts\n return () => {\n clickSound?.unloadAsync();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [Audio]);\n\n const renderItem = useCallback(\n ({ item }: { item: string }) => {\n let stringItem = item;\n let intItem: number;\n let isAm: boolean | undefined;\n\n if (!is12HourPicker) {\n intItem = parseInt(item);\n } else {\n isAm = item.includes(\"AM\");\n stringItem = item.replace(/\\s[AP]M/g, \"\");\n intItem = parseInt(stringItem);\n }\n\n return (\n <View\n key={item}\n style={styles.pickerItemContainer}\n testID=\"picker-item\">\n <Text\n allowFontScaling={allowFontScaling}\n style={[\n styles.pickerItem,\n intItem > adjustedLimited.max ||\n intItem < adjustedLimited.min\n ? styles.disabledPickerItem\n : {},\n ]}>\n {stringItem}\n </Text>\n {is12HourPicker ? (\n <View\n pointerEvents=\"none\"\n style={styles.pickerAmPmContainer}>\n <Text\n allowFontScaling={allowFontScaling}\n style={[styles.pickerAmPmLabel]}>\n {isAm ? amLabel : pmLabel}\n </Text>\n </View>\n ) : null}\n </View>\n );\n },\n [\n adjustedLimited.max,\n adjustedLimited.min,\n allowFontScaling,\n amLabel,\n is12HourPicker,\n pmLabel,\n styles.disabledPickerItem,\n styles.pickerAmPmContainer,\n styles.pickerAmPmLabel,\n styles.pickerItem,\n styles.pickerItemContainer,\n ]\n );\n\n const onScroll = useCallback(\n (e: NativeSyntheticEvent<NativeScrollEvent>) => {\n // this function is only used when the picker is in a modal and/or has Haptic/Audio feedback\n // it is used to ensure that the modal gets the latest duration on clicking\n // the confirm button, even if the scrollview is still scrolling\n if (!aggressivelyGetLatestDuration && !Haptics && !Audio) {\n return;\n }\n\n if (aggressivelyGetLatestDuration) {\n const newValues = getDurationAndIndexFromScrollOffset({\n disableInfiniteScroll,\n itemHeight: styles.pickerItemContainer.height,\n numberOfItems,\n padWithNItems,\n yContentOffset: e.nativeEvent.contentOffset.y,\n });\n\n if (newValues.duration !== latestDuration.current) {\n // check limits\n if (newValues.duration > adjustedLimited.max) {\n newValues.duration = adjustedLimited.max;\n } else if (newValues.duration < adjustedLimited.min) {\n newValues.duration = adjustedLimited.min;\n }\n\n latestDuration.current = newValues.duration;\n }\n }\n\n if (Haptics || Audio) {\n const feedbackIndex = Math.round(\n (e.nativeEvent.contentOffset.y +\n styles.pickerItemContainer.height / 2) /\n styles.pickerItemContainer.height\n );\n\n if (feedbackIndex !== lastFeedbackIndex.current) {\n // this check stops the feedback firing when the component mounts\n if (lastFeedbackIndex.current) {\n // fire haptic feedback if available\n try {\n Haptics?.selectionAsync();\n } catch {\n // do nothing\n }\n\n // play click sound if available\n try {\n clickSound?.replayAsync();\n } catch {\n // do nothing\n }\n }\n\n lastFeedbackIndex.current = feedbackIndex;\n }\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n adjustedLimited.max,\n adjustedLimited.min,\n aggressivelyGetLatestDuration,\n clickSound,\n disableInfiniteScroll,\n numberOfItems,\n padWithNItems,\n styles.pickerItemContainer.height,\n ]\n );\n\n const onMomentumScrollEnd = useCallback(\n (e: NativeSyntheticEvent<NativeScrollEvent>) => {\n const newValues = getDurationAndIndexFromScrollOffset({\n disableInfiniteScroll,\n itemHeight: styles.pickerItemContainer.height,\n numberOfItems,\n padWithNItems,\n yContentOffset: e.nativeEvent.contentOffset.y,\n });\n\n // check limits\n if (newValues.duration > adjustedLimited.max) {\n const targetScrollIndex =\n newValues.index -\n (newValues.duration - adjustedLimited.max);\n flatListRef.current?.scrollToIndex({\n animated: true,\n index:\n // guard against scrolling beyond end of list\n targetScrollIndex >= 0\n ? targetScrollIndex\n : adjustedLimited.max - 1,\n }); // scroll down to max\n newValues.duration = adjustedLimited.max;\n } else if (newValues.duration < adjustedLimited.min) {\n const targetScrollIndex =\n newValues.index +\n (adjustedLimited.min - newValues.duration);\n flatListRef.current?.scrollToIndex({\n animated: true,\n index:\n // guard against scrolling beyond end of list\n targetScrollIndex <= numbersForFlatList.length - 1\n ? targetScrollIndex\n : adjustedLimited.min,\n }); // scroll up to min\n newValues.duration = adjustedLimited.min;\n }\n\n onDurationChange(newValues.duration);\n },\n [\n adjustedLimited.max,\n adjustedLimited.min,\n numbersForFlatList.length,\n disableInfiniteScroll,\n numberOfItems,\n onDurationChange,\n padWithNItems,\n styles.pickerItemContainer.height,\n ]\n );\n\n const onViewableItemsChanged = useCallback(\n ({ viewableItems }: { viewableItems: ViewToken[] }) => {\n if (\n viewableItems[0]?.index &&\n viewableItems[0].index < numberOfItems * 0.5\n ) {\n flatListRef.current?.scrollToIndex({\n animated: false,\n index: viewableItems[0].index + numberOfItems,\n });\n } else if (\n viewableItems[0]?.index &&\n viewableItems[0].index >=\n numberOfItems * (safeRepeatNumbersNTimes - 0.5)\n ) {\n flatListRef.current?.scrollToIndex({\n animated: false,\n index: viewableItems[0].index - numberOfItems,\n });\n }\n },\n [numberOfItems, safeRepeatNumbersNTimes]\n );\n\n const getItemLayout = useCallback(\n (_: ArrayLike<string> | null | undefined, index: number) => ({\n length: styles.pickerItemContainer.height,\n offset: styles.pickerItemContainer.height * index,\n index,\n }),\n [styles.pickerItemContainer.height]\n );\n\n const viewabilityConfigCallbackPairs =\n useRef<ViewabilityConfigCallbackPairs>([\n {\n viewabilityConfig: { viewAreaCoveragePercentThreshold: 0 },\n onViewableItemsChanged: onViewableItemsChanged,\n },\n ]);\n\n useImperativeHandle(ref, () => ({\n reset: (options) => {\n flatListRef.current?.scrollToIndex({\n animated: options?.animated ?? false,\n index: initialScrollIndex,\n });\n },\n setValue: (value, options) => {\n flatListRef.current?.scrollToIndex({\n animated: options?.animated ?? false,\n index: getInitialScrollIndex({\n disableInfiniteScroll,\n numberOfItems,\n padWithNItems,\n repeatNumbersNTimes: safeRepeatNumbersNTimes,\n value: value,\n }),\n });\n },\n latestDuration: latestDuration,\n }));\n\n return (\n <View\n pointerEvents={isDisabled ? \"none\" : undefined}\n style={[\n {\n height:\n styles.pickerItemContainer.height *\n numberOfItemsToShow,\n overflow: \"visible\",\n },\n isDisabled && styles.disabledPickerContainer,\n ]}\n testID={testID}>\n <FlatList\n ref={flatListRef}\n data={numbersForFlatList}\n decelerationRate={0.88}\n getItemLayout={getItemLayout}\n initialScrollIndex={initialScrollIndex}\n keyExtractor={(_, index) => index.toString()}\n nestedScrollEnabled\n onMomentumScrollEnd={onMomentumScrollEnd}\n onScroll={onScroll}\n renderItem={renderItem}\n scrollEnabled={!isDisabled}\n scrollEventThrottle={16}\n showsVerticalScrollIndicator={false}\n snapToAlignment=\"start\"\n // used in place of snapToOffset due to bug on Android\n snapToOffsets={[...Array(numbersForFlatList.length)].map(\n (_, i) => i * styles.pickerItemContainer.height\n )}\n testID=\"duration-scroll-flatlist\"\n viewabilityConfigCallbackPairs={\n !disableInfiniteScroll\n ? viewabilityConfigCallbackPairs?.current\n : undefined\n }\n windowSize={numberOfItemsToShow}\n />\n <View pointerEvents=\"none\" style={styles.pickerLabelContainer}>\n {typeof label === \"string\" ? (\n <Text\n allowFontScaling={allowFontScaling}\n style={styles.pickerLabel}>\n {label}\n </Text>\n ) : (\n label ?? null\n )}\n </View>\n {LinearGradient ? (\n <>\n <LinearGradient\n colors={[\n styles.pickerContainer.backgroundColor ??\n \"white\",\n colorToRgba({\n color:\n styles.pickerContainer\n .backgroundColor ?? \"white\",\n opacity: 0,\n }),\n ]}\n end={{ x: 1, y: 1 }}\n pointerEvents=\"none\"\n start={{ x: 1, y: 0.3 }}\n {...pickerGradientOverlayProps}\n {...topPickerGradientOverlayProps}\n style={[styles.pickerGradientOverlay, { top: 0 }]}\n />\n <LinearGradient\n colors={[\n colorToRgba({\n color:\n styles.pickerContainer\n .backgroundColor ?? \"white\",\n opacity: 0,\n }),\n styles.pickerContainer.backgroundColor ??\n \"white\",\n ]}\n end={{ x: 1, y: 0.7 }}\n pointerEvents=\"none\"\n start={{ x: 1, y: 0 }}\n {...pickerGradientOverlayProps}\n {...bottomPickerGradientOverlayProps}\n style={[\n styles.pickerGradientOverlay,\n { bottom: -1 },\n ]}\n />\n </>\n ) : null}\n </View>\n );\n }\n);\n\nexport default React.memo(DurationScroll);\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -26,7 +26,7 @@ const TimerPicker = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
26
26
|
padWithNItems = 1,
|
|
27
27
|
pickerContainerProps,
|
|
28
28
|
pmLabel = "pm",
|
|
29
|
-
repeatHourNumbersNTimes =
|
|
29
|
+
repeatHourNumbersNTimes = 7,
|
|
30
30
|
repeatMinuteNumbersNTimes = 3,
|
|
31
31
|
repeatSecondNumbersNTimes = 3,
|
|
32
32
|
secondLabel,
|
|
@@ -36,10 +36,19 @@ const TimerPicker = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
36
36
|
use12HourPicker = false,
|
|
37
37
|
...otherProps
|
|
38
38
|
} = props;
|
|
39
|
-
const
|
|
39
|
+
const safePadWithNItems = useMemo(() => {
|
|
40
|
+
if (padWithNItems < 0) {
|
|
41
|
+
return 0;
|
|
42
|
+
}
|
|
43
|
+
const maxPadWithNItems = hideHours ? 15 : 6;
|
|
44
|
+
if (padWithNItems > maxPadWithNItems) {
|
|
45
|
+
return maxPadWithNItems;
|
|
46
|
+
}
|
|
47
|
+
return Math.round(padWithNItems);
|
|
48
|
+
}, [hideHours, padWithNItems]);
|
|
40
49
|
const styles = useMemo(() => generateStyles(customStyles, {
|
|
41
|
-
padWithNItems:
|
|
42
|
-
}), [
|
|
50
|
+
padWithNItems: safePadWithNItems
|
|
51
|
+
}), [safePadWithNItems, customStyles]);
|
|
43
52
|
const safeInitialValue = useMemo(() => ({
|
|
44
53
|
hours: (initialValue === null || initialValue === void 0 ? void 0 : initialValue.hours) ?? 0,
|
|
45
54
|
minutes: (initialValue === null || initialValue === void 0 ? void 0 : initialValue.minutes) ?? 0,
|
|
@@ -101,10 +110,10 @@ const TimerPicker = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
101
110
|
isDisabled: hoursPickerIsDisabled,
|
|
102
111
|
label: hourLabel ?? (!use12HourPicker ? "h" : undefined),
|
|
103
112
|
limit: hourLimit,
|
|
104
|
-
numberOfItems:
|
|
113
|
+
numberOfItems: 24,
|
|
105
114
|
onDurationChange: setSelectedHours,
|
|
106
115
|
padNumbersWithZero: padHoursWithZero,
|
|
107
|
-
padWithNItems:
|
|
116
|
+
padWithNItems: safePadWithNItems,
|
|
108
117
|
pmLabel: pmLabel,
|
|
109
118
|
repeatNumbersNTimes: repeatHourNumbersNTimes,
|
|
110
119
|
styles: styles,
|
|
@@ -118,10 +127,10 @@ const TimerPicker = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
118
127
|
isDisabled: minutesPickerIsDisabled,
|
|
119
128
|
label: minuteLabel ?? "m",
|
|
120
129
|
limit: minuteLimit,
|
|
121
|
-
numberOfItems:
|
|
130
|
+
numberOfItems: 60,
|
|
122
131
|
onDurationChange: setSelectedMinutes,
|
|
123
132
|
padNumbersWithZero: padMinutesWithZero,
|
|
124
|
-
padWithNItems:
|
|
133
|
+
padWithNItems: safePadWithNItems,
|
|
125
134
|
repeatNumbersNTimes: repeatMinuteNumbersNTimes,
|
|
126
135
|
styles: styles,
|
|
127
136
|
testID: "duration-scroll-minute"
|
|
@@ -134,10 +143,10 @@ const TimerPicker = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
134
143
|
isDisabled: secondsPickerIsDisabled,
|
|
135
144
|
label: secondLabel ?? "s",
|
|
136
145
|
limit: secondLimit,
|
|
137
|
-
numberOfItems:
|
|
146
|
+
numberOfItems: 60,
|
|
138
147
|
onDurationChange: setSelectedSeconds,
|
|
139
148
|
padNumbersWithZero: padSecondsWithZero,
|
|
140
|
-
padWithNItems:
|
|
149
|
+
padWithNItems: safePadWithNItems,
|
|
141
150
|
repeatNumbersNTimes: repeatSecondNumbersNTimes,
|
|
142
151
|
styles: styles,
|
|
143
152
|
testID: "duration-scroll-second"
|