react-native-timer-picker 1.10.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -53
- package/dist/commonjs/components/DurationScroll/index.js +154 -76
- package/dist/commonjs/components/DurationScroll/index.js.map +1 -1
- package/dist/commonjs/components/DurationScroll/types.js.map +1 -1
- package/dist/commonjs/components/TimerPicker/index.js +31 -10
- package/dist/commonjs/components/TimerPicker/index.js.map +1 -1
- package/dist/commonjs/components/TimerPicker/types.js.map +1 -1
- package/dist/commonjs/tests/DurationScroll.test.js +3 -3
- package/dist/commonjs/tests/DurationScroll.test.js.map +1 -1
- package/dist/commonjs/tests/Modal.test.js +3 -3
- package/dist/commonjs/tests/Modal.test.js.map +1 -1
- package/dist/commonjs/tests/TimerPicker.test.js +4 -4
- package/dist/commonjs/tests/TimerPicker.test.js.map +1 -1
- package/dist/commonjs/tests/TimerPickerModal.test.js +6 -6
- package/dist/commonjs/tests/TimerPickerModal.test.js.map +1 -1
- package/dist/commonjs/utils/generateNumbers.js +7 -6
- package/dist/commonjs/utils/generateNumbers.js.map +1 -1
- package/dist/commonjs/utils/getAdjustedLimit.js +5 -4
- package/dist/commonjs/utils/getAdjustedLimit.js.map +1 -1
- package/dist/commonjs/utils/getDurationAndIndexFromScrollOffset.js +24 -0
- package/dist/commonjs/utils/getDurationAndIndexFromScrollOffset.js.map +1 -0
- package/dist/commonjs/utils/getInitialScrollIndex.js +19 -0
- package/dist/commonjs/utils/getInitialScrollIndex.js.map +1 -0
- package/dist/module/components/DurationScroll/index.js +154 -76
- package/dist/module/components/DurationScroll/index.js.map +1 -1
- package/dist/module/components/DurationScroll/types.js.map +1 -1
- package/dist/module/components/TimerPicker/index.js +31 -10
- package/dist/module/components/TimerPicker/index.js.map +1 -1
- package/dist/module/components/TimerPicker/types.js.map +1 -1
- package/dist/module/tests/DurationScroll.test.js +3 -3
- package/dist/module/tests/DurationScroll.test.js.map +1 -1
- package/dist/module/tests/Modal.test.js +3 -3
- package/dist/module/tests/Modal.test.js.map +1 -1
- package/dist/module/tests/TimerPicker.test.js +4 -4
- package/dist/module/tests/TimerPicker.test.js.map +1 -1
- package/dist/module/tests/TimerPickerModal.test.js +6 -6
- package/dist/module/tests/TimerPickerModal.test.js.map +1 -1
- package/dist/module/utils/generateNumbers.js +7 -6
- package/dist/module/utils/generateNumbers.js.map +1 -1
- package/dist/module/utils/getAdjustedLimit.js +5 -4
- package/dist/module/utils/getAdjustedLimit.js.map +1 -1
- package/dist/module/utils/getDurationAndIndexFromScrollOffset.js +17 -0
- package/dist/module/utils/getDurationAndIndexFromScrollOffset.js.map +1 -0
- package/dist/module/utils/getInitialScrollIndex.js +12 -0
- package/dist/module/utils/getInitialScrollIndex.js.map +1 -0
- package/dist/typescript/components/DurationScroll/types.d.ts +4 -1
- package/dist/typescript/components/TimerPicker/types.d.ts +7 -0
- package/dist/typescript/utils/generateNumbers.d.ts +3 -1
- package/dist/typescript/utils/getAdjustedLimit.d.ts +1 -1
- package/dist/typescript/utils/getDurationAndIndexFromScrollOffset.d.ts +11 -0
- package/dist/typescript/utils/{getScrollIndex.d.ts → getInitialScrollIndex.d.ts} +3 -1
- package/package.json +14 -10
- 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
|
@@ -17,14 +17,14 @@ describe("TimerPickerModal", () => {
|
|
|
17
17
|
it("renders without crashing", () => {
|
|
18
18
|
const {
|
|
19
19
|
getByTestId
|
|
20
|
-
} = (0, _reactNative.render)(
|
|
20
|
+
} = (0, _reactNative.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, defaultProps));
|
|
21
21
|
const component = getByTestId("timer-picker-modal");
|
|
22
22
|
expect(component).toBeDefined();
|
|
23
23
|
});
|
|
24
24
|
it("calls onConfirm when Confirm button is pressed", () => {
|
|
25
25
|
const {
|
|
26
26
|
getByText
|
|
27
|
-
} = (0, _reactNative.render)(
|
|
27
|
+
} = (0, _reactNative.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, defaultProps));
|
|
28
28
|
const confirmButton = getByText("Confirm");
|
|
29
29
|
_reactNative.fireEvent.press(confirmButton);
|
|
30
30
|
expect(mockOnConfirm).toHaveBeenCalled();
|
|
@@ -32,7 +32,7 @@ describe("TimerPickerModal", () => {
|
|
|
32
32
|
it("calls onCancel when Cancel button is pressed", () => {
|
|
33
33
|
const {
|
|
34
34
|
getByText
|
|
35
|
-
} = (0, _reactNative.render)(
|
|
35
|
+
} = (0, _reactNative.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, defaultProps));
|
|
36
36
|
const cancelButton = getByText("Cancel");
|
|
37
37
|
_reactNative.fireEvent.press(cancelButton);
|
|
38
38
|
expect(mockOnCancel).toHaveBeenCalled();
|
|
@@ -41,7 +41,7 @@ describe("TimerPickerModal", () => {
|
|
|
41
41
|
const setIsVisibleMock = jest.fn();
|
|
42
42
|
const {
|
|
43
43
|
getByText
|
|
44
|
-
} = (0, _reactNative.render)(
|
|
44
|
+
} = (0, _reactNative.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, _extends({}, defaultProps, {
|
|
45
45
|
setIsVisible: setIsVisibleMock
|
|
46
46
|
})));
|
|
47
47
|
const cancelButton = getByText("Cancel");
|
|
@@ -52,7 +52,7 @@ describe("TimerPickerModal", () => {
|
|
|
52
52
|
const setIsVisibleMock = jest.fn();
|
|
53
53
|
const {
|
|
54
54
|
getByTestId
|
|
55
|
-
} = (0, _reactNative.render)(
|
|
55
|
+
} = (0, _reactNative.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, _extends({}, defaultProps, {
|
|
56
56
|
closeOnOverlayPress: true,
|
|
57
57
|
setIsVisible: setIsVisibleMock
|
|
58
58
|
})));
|
|
@@ -63,7 +63,7 @@ describe("TimerPickerModal", () => {
|
|
|
63
63
|
it("calls onConfirm with selected duration when Confirm button is pressed", () => {
|
|
64
64
|
const {
|
|
65
65
|
getByText
|
|
66
|
-
} = (0, _reactNative.render)(
|
|
66
|
+
} = (0, _reactNative.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, defaultProps));
|
|
67
67
|
// Select duration in TimerPicker, assuming its interaction is tested separately
|
|
68
68
|
const confirmButton = getByText("Confirm");
|
|
69
69
|
_reactNative.fireEvent.press(confirmButton);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","_TimerPickerModal","e","__esModule","default","_extends","Object","assign","bind","n","arguments","length","t","r","hasOwnProperty","call","apply","describe","mockOnConfirm","jest","fn","mockOnCancel","defaultProps","visible","setIsVisible","onConfirm","onCancel","it","getByTestId","render","createElement","component","expect","toBeDefined","getByText","confirmButton","fireEvent","press","toHaveBeenCalled","cancelButton","setIsVisibleMock","toHaveBeenCalledWith","closeOnOverlayPress","overlay","objectContaining"],"sources":["TimerPickerModal.test.tsx"],"sourcesContent":["import React from \"react\";\n\nimport { render, fireEvent } from \"@testing-library/react-native\";\n\nimport TimerPickerModal from \"../components/TimerPickerModal\";\n\ndescribe(\"TimerPickerModal\", () => {\n const mockOnConfirm = jest.fn();\n const mockOnCancel = jest.fn();\n\n const defaultProps = {\n visible: true,\n setIsVisible: jest.fn(),\n onConfirm: mockOnConfirm,\n onCancel: mockOnCancel,\n };\n\n it(\"renders without crashing\", () => {\n const { getByTestId } = render(<TimerPickerModal {...defaultProps} />);\n const component = getByTestId(\"timer-picker-modal\");\n expect(component).toBeDefined();\n });\n\n it(\"calls onConfirm when Confirm button is pressed\", () => {\n const { getByText } = render(<TimerPickerModal {...defaultProps} />);\n const confirmButton = getByText(\"Confirm\");\n fireEvent.press(confirmButton);\n expect(mockOnConfirm).toHaveBeenCalled();\n });\n\n it(\"calls onCancel when Cancel button is pressed\", () => {\n const { getByText } = render(<TimerPickerModal {...defaultProps} />);\n const cancelButton = getByText(\"Cancel\");\n fireEvent.press(cancelButton);\n expect(mockOnCancel).toHaveBeenCalled();\n });\n\n it(\"hides the modal when Cancel button is pressed\", () => {\n const setIsVisibleMock = jest.fn();\n const { getByText } = render(\n <TimerPickerModal\n {...defaultProps}\n setIsVisible={setIsVisibleMock}\n />\n );\n const cancelButton = getByText(\"Cancel\");\n fireEvent.press(cancelButton);\n expect(setIsVisibleMock).toHaveBeenCalledWith(false);\n });\n\n it(\"hides the modal when overlay is pressed\", () => {\n const setIsVisibleMock = jest.fn();\n const { getByTestId } = render(\n <TimerPickerModal\n {...defaultProps}\n closeOnOverlayPress\n setIsVisible={setIsVisibleMock}\n />\n );\n const overlay = getByTestId(\"modal-backdrop\");\n fireEvent.press(overlay);\n expect(setIsVisibleMock).toHaveBeenCalledWith(false);\n });\n\n it(\"calls onConfirm with selected duration when Confirm button is pressed\", () => {\n const { getByText } = render(<TimerPickerModal {...defaultProps} />);\n // Select duration in TimerPicker, assuming its interaction is tested separately\n const confirmButton = getByText(\"Confirm\");\n fireEvent.press(confirmButton);\n expect(mockOnConfirm).toHaveBeenCalledWith(expect.objectContaining({}));\n });\n});\n"],"mappings":";;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,YAAA,GAAAD,OAAA;AAEA,IAAAE,iBAAA,GAAAH,sBAAA,CAAAC,OAAA;AAA8D,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,SAAAG,SAAA,WAAAA,QAAA,GAAAC,MAAA,CAAAC,MAAA,GAAAD,MAAA,CAAAC,MAAA,CAAAC,IAAA,eAAAC,CAAA,aAAAP,CAAA,MAAAA,CAAA,GAAAQ,SAAA,CAAAC,MAAA,EAAAT,CAAA,UAAAU,CAAA,GAAAF,SAAA,CAAAR,CAAA,YAAAW,CAAA,IAAAD,CAAA,OAAAE,cAAA,CAAAC,IAAA,CAAAH,CAAA,EAAAC,CAAA,MAAAJ,CAAA,CAAAI,CAAA,IAAAD,CAAA,CAAAC,CAAA,aAAAJ,CAAA,KAAAJ,QAAA,CAAAW,KAAA,OAAAN,SAAA;AAE9DO,QAAQ,CAAC,kBAAkB,EAAE,MAAM;EAC/B,MAAMC,aAAa,GAAGC,IAAI,CAACC,EAAE,CAAC,CAAC;EAC/B,MAAMC,YAAY,GAAGF,IAAI,CAACC,EAAE,CAAC,CAAC;EAE9B,MAAME,YAAY,GAAG;IACjBC,OAAO,EAAE,IAAI;IACbC,YAAY,EAAEL,IAAI,CAACC,EAAE,CAAC,CAAC;IACvBK,SAAS,EAAEP,aAAa;IACxBQ,QAAQ,EAAEL;EACd,CAAC;EAEDM,EAAE,CAAC,0BAA0B,EAAE,MAAM;IACjC,MAAM;MAAEC;IAAY,CAAC,GAAG,IAAAC,mBAAM,
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","_TimerPickerModal","e","__esModule","default","_extends","Object","assign","bind","n","arguments","length","t","r","hasOwnProperty","call","apply","describe","mockOnConfirm","jest","fn","mockOnCancel","defaultProps","visible","setIsVisible","onConfirm","onCancel","it","getByTestId","render","createElement","component","expect","toBeDefined","getByText","confirmButton","fireEvent","press","toHaveBeenCalled","cancelButton","setIsVisibleMock","toHaveBeenCalledWith","closeOnOverlayPress","overlay","objectContaining"],"sources":["TimerPickerModal.test.tsx"],"sourcesContent":["import React from \"react\";\n\nimport { render, fireEvent } from \"@testing-library/react-native\";\n\nimport TimerPickerModal from \"../components/TimerPickerModal\";\n\ndescribe(\"TimerPickerModal\", () => {\n const mockOnConfirm = jest.fn();\n const mockOnCancel = jest.fn();\n\n const defaultProps = {\n visible: true,\n setIsVisible: jest.fn(),\n onConfirm: mockOnConfirm,\n onCancel: mockOnCancel,\n };\n\n it(\"renders without crashing\", () => {\n const { getByTestId } = render(<TimerPickerModal {...defaultProps} />);\n const component = getByTestId(\"timer-picker-modal\");\n expect(component).toBeDefined();\n });\n\n it(\"calls onConfirm when Confirm button is pressed\", () => {\n const { getByText } = render(<TimerPickerModal {...defaultProps} />);\n const confirmButton = getByText(\"Confirm\");\n fireEvent.press(confirmButton);\n expect(mockOnConfirm).toHaveBeenCalled();\n });\n\n it(\"calls onCancel when Cancel button is pressed\", () => {\n const { getByText } = render(<TimerPickerModal {...defaultProps} />);\n const cancelButton = getByText(\"Cancel\");\n fireEvent.press(cancelButton);\n expect(mockOnCancel).toHaveBeenCalled();\n });\n\n it(\"hides the modal when Cancel button is pressed\", () => {\n const setIsVisibleMock = jest.fn();\n const { getByText } = render(\n <TimerPickerModal\n {...defaultProps}\n setIsVisible={setIsVisibleMock}\n />\n );\n const cancelButton = getByText(\"Cancel\");\n fireEvent.press(cancelButton);\n expect(setIsVisibleMock).toHaveBeenCalledWith(false);\n });\n\n it(\"hides the modal when overlay is pressed\", () => {\n const setIsVisibleMock = jest.fn();\n const { getByTestId } = render(\n <TimerPickerModal\n {...defaultProps}\n closeOnOverlayPress\n setIsVisible={setIsVisibleMock}\n />\n );\n const overlay = getByTestId(\"modal-backdrop\");\n fireEvent.press(overlay);\n expect(setIsVisibleMock).toHaveBeenCalledWith(false);\n });\n\n it(\"calls onConfirm with selected duration when Confirm button is pressed\", () => {\n const { getByText } = render(<TimerPickerModal {...defaultProps} />);\n // Select duration in TimerPicker, assuming its interaction is tested separately\n const confirmButton = getByText(\"Confirm\");\n fireEvent.press(confirmButton);\n expect(mockOnConfirm).toHaveBeenCalledWith(expect.objectContaining({}));\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -10,15 +10,16 @@ const generateNumbers = (numberOfItems, options) => {
|
|
|
10
10
|
return [];
|
|
11
11
|
}
|
|
12
12
|
let numbers = [];
|
|
13
|
-
for (let i = 0; i
|
|
14
|
-
|
|
13
|
+
for (let i = 0; i < numberOfItems; i++) {
|
|
14
|
+
const value = i * options.interval;
|
|
15
|
+
numbers.push((0, _padNumber.padNumber)(value, {
|
|
15
16
|
padWithZero: options.padNumbersWithZero
|
|
16
17
|
}));
|
|
17
18
|
}
|
|
18
|
-
if (
|
|
19
|
+
if (options.repeatNTimes > 1) {
|
|
19
20
|
numbers = Array(options.repeatNTimes).fill(numbers).flat();
|
|
20
21
|
}
|
|
21
|
-
if (options.disableInfiniteScroll) {
|
|
22
|
+
if (options.disableInfiniteScroll || options.repeatNTimes === 1) {
|
|
22
23
|
numbers.push(...Array(options.padWithNItems).fill(""));
|
|
23
24
|
numbers.unshift(...Array(options.padWithNItems).fill(""));
|
|
24
25
|
}
|
|
@@ -29,14 +30,14 @@ const generate12HourNumbers = options => {
|
|
|
29
30
|
let numbers = [];
|
|
30
31
|
|
|
31
32
|
// Generate numbers from 0 to 11 for AM
|
|
32
|
-
for (let i = 0; i
|
|
33
|
+
for (let i = 0; i < 12; i += options.interval) {
|
|
33
34
|
numbers.push(`${(0, _padNumber.padNumber)(i, {
|
|
34
35
|
padWithZero: options.padNumbersWithZero
|
|
35
36
|
})} AM`);
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
// Generate numbers from 12 to 11 for PM
|
|
39
|
-
for (let i = 12; i
|
|
40
|
+
for (let i = 12; i < 24; i += options.interval) {
|
|
40
41
|
const hour = i > 12 ? i - 12 : i;
|
|
41
42
|
numbers.push(`${(0, _padNumber.padNumber)(hour, {
|
|
42
43
|
padWithZero: options.padNumbersWithZero
|
|
@@ -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","value","interval","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 interval: number;\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 const value = i * options.interval;\n numbers.push(\n padNumber(value, { padWithZero: options.padNumbersWithZero })\n );\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 interval: number;\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 < 12; i += options.interval) {\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 < 24; i += options.interval) {\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,OAMC,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;IACpC,MAAMC,KAAK,GAAGD,CAAC,GAAGF,OAAO,CAACI,QAAQ;IAClCH,OAAO,CAACI,IAAI,CACR,IAAAC,oBAAS,EAACH,KAAK,EAAE;MAAEI,WAAW,EAAEP,OAAO,CAACQ;IAAmB,CAAC,CAChE,CAAC;EACL;EAEA,IAAIR,OAAO,CAACS,YAAY,GAAG,CAAC,EAAE;IAC1BR,OAAO,GAAGS,KAAK,CAACV,OAAO,CAACS,YAAY,CAAC,CAACE,IAAI,CAACV,OAAO,CAAC,CAACW,IAAI,CAAC,CAAC;EAC9D;EACA,IAAIZ,OAAO,CAACa,qBAAqB,IAAIb,OAAO,CAACS,YAAY,KAAK,CAAC,EAAE;IAC7DR,OAAO,CAACI,IAAI,CAAC,GAAGK,KAAK,CAACV,OAAO,CAACc,aAAa,CAAC,CAACH,IAAI,CAAC,EAAE,CAAC,CAAC;IACtDV,OAAO,CAACc,OAAO,CAAC,GAAGL,KAAK,CAACV,OAAO,CAACc,aAAa,CAAC,CAACH,IAAI,CAAC,EAAE,CAAC,CAAC;EAC7D;EACA,OAAOV,OAAO;AAClB,CAAC;AAACe,OAAA,CAAAlB,eAAA,GAAAA,eAAA;AAEK,MAAMmB,qBAAqB,GAAIjB,OAMrC,IAAK;EACF,IAAIC,OAAiB,GAAG,EAAE;;EAE1B;EACA,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG,EAAE,EAAEA,CAAC,IAAIF,OAAO,CAACI,QAAQ,EAAE;IAC3CH,OAAO,CAACI,IAAI,CACR,GAAG,IAAAC,oBAAS,EAACJ,CAAC,EAAE;MAAEK,WAAW,EAAEP,OAAO,CAACQ;IAAmB,CAAC,CAAC,KAChE,CAAC;EACL;;EAEA;EACA,KAAK,IAAIN,CAAC,GAAG,EAAE,EAAEA,CAAC,GAAG,EAAE,EAAEA,CAAC,IAAIF,OAAO,CAACI,QAAQ,EAAE;IAC5C,MAAMc,IAAI,GAAGhB,CAAC,GAAG,EAAE,GAAGA,CAAC,GAAG,EAAE,GAAGA,CAAC;IAChCD,OAAO,CAACI,IAAI,CACR,GAAG,IAAAC,oBAAS,EAACY,IAAI,EAAE;MAAEX,WAAW,EAAEP,OAAO,CAACQ;IAAmB,CAAC,CAAC,KACnE,CAAC;EACL;EAEA,IAAI,CAACR,OAAO,CAACS,YAAY,IAAI,CAAC,IAAI,CAAC,EAAE;IACjCR,OAAO,GAAGS,KAAK,CAACV,OAAO,CAACS,YAAY,CAAC,CAACE,IAAI,CAACV,OAAO,CAAC,CAACW,IAAI,CAAC,CAAC;EAC9D;EAEA,IAAIZ,OAAO,CAACa,qBAAqB,EAAE;IAC/BZ,OAAO,CAACI,IAAI,CAAC,GAAGK,KAAK,CAACV,OAAO,CAACc,aAAa,CAAC,CAACH,IAAI,CAAC,EAAE,CAAC,CAAC;IACtDV,OAAO,CAACc,OAAO,CAAC,GAAGL,KAAK,CAACV,OAAO,CAACc,aAAa,CAAC,CAACH,IAAI,CAAC,EAAE,CAAC,CAAC;EAC7D;EAEA,OAAOV,OAAO;AAClB,CAAC;AAACe,OAAA,CAAAC,qBAAA,GAAAA,qBAAA","ignoreList":[]}
|
|
@@ -4,22 +4,23 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.getAdjustedLimit = void 0;
|
|
7
|
-
const getAdjustedLimit = (limit, numberOfItems) => {
|
|
7
|
+
const getAdjustedLimit = (limit, numberOfItems, interval) => {
|
|
8
|
+
const maxValue = (numberOfItems - 1) * interval;
|
|
8
9
|
if (!limit || !limit.max && !limit.min) {
|
|
9
10
|
return {
|
|
10
|
-
max:
|
|
11
|
+
max: maxValue,
|
|
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, maxValue) : maxValue;
|
|
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: maxValue,
|
|
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","interval","maxValue","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 interval: number\n): {\n max: number;\n min: number;\n} => {\n const maxValue = (numberOfItems - 1) * interval;\n\n if (!limit || (!limit.max && !limit.min)) {\n return {\n max: maxValue,\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, maxValue)\n : maxValue;\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: maxValue,\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,EACrBC,QAAgB,KAIf;EACD,MAAMC,QAAQ,GAAG,CAACF,aAAa,GAAG,CAAC,IAAIC,QAAQ;EAE/C,IAAI,CAACF,KAAK,IAAK,CAACA,KAAK,CAACI,GAAG,IAAI,CAACJ,KAAK,CAACK,GAAI,EAAE;IACtC,OAAO;MACHD,GAAG,EAAED,QAAQ;MACbE,GAAG,EAAE;IACT,CAAC;EACL;;EAEA;EACA,MAAMC,gBAAgB,GAAGN,KAAK,CAACI,GAAG,GAC5BG,IAAI,CAACF,GAAG,CAACL,KAAK,CAACI,GAAG,EAAED,QAAQ,CAAC,GAC7BA,QAAQ;EACd,MAAMK,gBAAgB,GAAGR,KAAK,CAACK,GAAG,GAAGE,IAAI,CAACH,GAAG,CAACJ,KAAK,CAACK,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,CAAAV,gBAAA,GAAAA,gBAAA","ignoreList":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
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
|
+
interval,
|
|
11
|
+
itemHeight,
|
|
12
|
+
numberOfItems,
|
|
13
|
+
padWithNItems,
|
|
14
|
+
yContentOffset
|
|
15
|
+
} = variables;
|
|
16
|
+
const index = Math.round(yContentOffset / itemHeight);
|
|
17
|
+
const duration = (disableInfiniteScroll ? index : index + padWithNItems) % numberOfItems * interval;
|
|
18
|
+
return {
|
|
19
|
+
duration,
|
|
20
|
+
index
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
exports.getDurationAndIndexFromScrollOffset = getDurationAndIndexFromScrollOffset;
|
|
24
|
+
//# 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":["export 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) %\n numberOfItems) *\n interval;\n\n return {\n duration,\n index,\n };\n};\n"],"mappings":";;;;;;AAAO,MAAMA,mCAAmC,GAAIC,SAOnD,IAAK;EACF,MAAM;IACFC,qBAAqB;IACrBC,QAAQ;IACRC,UAAU;IACVC,aAAa;IACbC,aAAa;IACbC;EACJ,CAAC,GAAGN,SAAS;EAEb,MAAMO,KAAK,GAAGC,IAAI,CAACC,KAAK,CAACH,cAAc,GAAGH,UAAU,CAAC;EAErD,MAAMO,QAAQ,GACT,CAACT,qBAAqB,GAAGM,KAAK,GAAGA,KAAK,GAAGF,aAAa,IACnDD,aAAa,GACjBF,QAAQ;EAEZ,OAAO;IACHQ,QAAQ;IACRH;EACJ,CAAC;AACL,CAAC;AAACI,OAAA,CAAAZ,mCAAA,GAAAA,mCAAA","ignoreList":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
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
|
+
interval,
|
|
11
|
+
numberOfItems,
|
|
12
|
+
padWithNItems,
|
|
13
|
+
repeatNumbersNTimes,
|
|
14
|
+
value
|
|
15
|
+
} = variables;
|
|
16
|
+
return Math.max(numberOfItems * Math.floor(repeatNumbersNTimes / 2) + (value / interval + numberOfItems) % numberOfItems - (!disableInfiniteScroll ? padWithNItems : 0), 0);
|
|
17
|
+
};
|
|
18
|
+
exports.getInitialScrollIndex = getInitialScrollIndex;
|
|
19
|
+
//# 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":["export 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":";;;;;;AAAO,MAAMA,qBAAqB,GAAIC,SAOrC,IAAK;EACF,MAAM;IACFC,qBAAqB;IACrBC,QAAQ;IACRC,aAAa;IACbC,aAAa;IACbC,mBAAmB;IACnBC;EACJ,CAAC,GAAGN,SAAS;EAEb,OAAOO,IAAI,CAACC,GAAG,CACXL,aAAa,GAAGI,IAAI,CAACE,KAAK,CAACJ,mBAAmB,GAAG,CAAC,CAAC,GAC9C,CAACC,KAAK,GAAGJ,QAAQ,GAAGC,aAAa,IAAIA,aAAc,IACnD,CAACF,qBAAqB,GAAGG,aAAa,GAAG,CAAC,CAAC,EAChD,CACJ,CAAC;AACL,CAAC;AAACM,OAAA,CAAAX,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,
|
|
@@ -17,45 +18,78 @@ const DurationScroll = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
17
18
|
FlatList = RNFlatList,
|
|
18
19
|
Haptics,
|
|
19
20
|
initialValue = 0,
|
|
21
|
+
interval,
|
|
20
22
|
is12HourPicker,
|
|
21
23
|
isDisabled,
|
|
22
24
|
label,
|
|
23
25
|
limit,
|
|
24
26
|
LinearGradient,
|
|
25
|
-
|
|
27
|
+
maximumValue,
|
|
26
28
|
onDurationChange,
|
|
27
29
|
padNumbersWithZero = false,
|
|
28
30
|
padWithNItems,
|
|
31
|
+
pickerFeedback,
|
|
29
32
|
pickerGradientOverlayProps,
|
|
30
33
|
pmLabel,
|
|
31
34
|
repeatNumbersNTimes = 3,
|
|
35
|
+
repeatNumbersNTimesNotExplicitlySet,
|
|
32
36
|
styles,
|
|
33
37
|
testID,
|
|
34
38
|
topPickerGradientOverlayProps
|
|
35
39
|
} = props;
|
|
36
|
-
const
|
|
40
|
+
const numberOfItems = useMemo(() => {
|
|
41
|
+
// guard against negative maximum values
|
|
42
|
+
if (maximumValue < 0) {
|
|
43
|
+
return 1;
|
|
44
|
+
}
|
|
45
|
+
return Math.floor(maximumValue / interval) + 1;
|
|
46
|
+
}, [interval, maximumValue]);
|
|
47
|
+
const safeRepeatNumbersNTimes = useMemo(() => {
|
|
48
|
+
// do not repeat numbers if there is only one option
|
|
49
|
+
if (numberOfItems === 1) {
|
|
50
|
+
return 1;
|
|
51
|
+
}
|
|
52
|
+
if (!disableInfiniteScroll && repeatNumbersNTimes < 2) {
|
|
53
|
+
return 2;
|
|
54
|
+
} else if (repeatNumbersNTimes < 1) {
|
|
55
|
+
return 1;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// if this variable is not explicitly set, we calculate a reasonable value based on
|
|
59
|
+
// the number of items in the picker, avoiding regular jumps up/down the list
|
|
60
|
+
// whilst avoiding rendering too many items in the picker
|
|
61
|
+
if (repeatNumbersNTimesNotExplicitlySet) {
|
|
62
|
+
return Math.max(Math.round(180 / numberOfItems), 1);
|
|
63
|
+
}
|
|
64
|
+
return Math.round(repeatNumbersNTimes);
|
|
65
|
+
}, [disableInfiniteScroll, numberOfItems, repeatNumbersNTimes, repeatNumbersNTimesNotExplicitlySet]);
|
|
66
|
+
const numbersForFlatList = useMemo(() => {
|
|
37
67
|
if (is12HourPicker) {
|
|
38
68
|
return generate12HourNumbers({
|
|
39
69
|
padNumbersWithZero,
|
|
40
|
-
repeatNTimes:
|
|
70
|
+
repeatNTimes: safeRepeatNumbersNTimes,
|
|
41
71
|
disableInfiniteScroll,
|
|
42
|
-
padWithNItems
|
|
72
|
+
padWithNItems,
|
|
73
|
+
interval
|
|
43
74
|
});
|
|
44
75
|
}
|
|
45
76
|
return generateNumbers(numberOfItems, {
|
|
46
77
|
padNumbersWithZero,
|
|
47
|
-
repeatNTimes:
|
|
78
|
+
repeatNTimes: safeRepeatNumbersNTimes,
|
|
48
79
|
disableInfiniteScroll,
|
|
49
|
-
padWithNItems
|
|
80
|
+
padWithNItems,
|
|
81
|
+
interval
|
|
50
82
|
});
|
|
51
|
-
}, [disableInfiniteScroll, is12HourPicker, numberOfItems, padNumbersWithZero, padWithNItems,
|
|
52
|
-
const initialScrollIndex = useMemo(() =>
|
|
83
|
+
}, [disableInfiniteScroll, is12HourPicker, interval, numberOfItems, padNumbersWithZero, padWithNItems, safeRepeatNumbersNTimes]);
|
|
84
|
+
const initialScrollIndex = useMemo(() => getInitialScrollIndex({
|
|
85
|
+
disableInfiniteScroll,
|
|
86
|
+
interval,
|
|
53
87
|
numberOfItems,
|
|
54
88
|
padWithNItems,
|
|
55
|
-
repeatNumbersNTimes,
|
|
89
|
+
repeatNumbersNTimes: safeRepeatNumbersNTimes,
|
|
56
90
|
value: initialValue
|
|
57
|
-
}), [initialValue, numberOfItems, padWithNItems,
|
|
58
|
-
const adjustedLimited = useMemo(() => getAdjustedLimit(limit, numberOfItems), [limit, numberOfItems]);
|
|
91
|
+
}), [disableInfiniteScroll, initialValue, interval, numberOfItems, padWithNItems, safeRepeatNumbersNTimes]);
|
|
92
|
+
const adjustedLimited = useMemo(() => getAdjustedLimit(limit, numberOfItems, interval), [interval, limit, numberOfItems]);
|
|
59
93
|
const numberOfItemsToShow = 1 + padWithNItems * 2;
|
|
60
94
|
|
|
61
95
|
// keep track of the latest duration as it scrolls
|
|
@@ -89,28 +123,6 @@ const DurationScroll = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
89
123
|
};
|
|
90
124
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
91
125
|
}, [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
126
|
const renderItem = useCallback(({
|
|
115
127
|
item
|
|
116
128
|
}) => {
|
|
@@ -143,23 +155,29 @@ const DurationScroll = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
143
155
|
// this function is only used when the picker is in a modal and/or has Haptic/Audio feedback
|
|
144
156
|
// it is used to ensure that the modal gets the latest duration on clicking
|
|
145
157
|
// the confirm button, even if the scrollview is still scrolling
|
|
146
|
-
if (!aggressivelyGetLatestDuration && !Haptics && !Audio) {
|
|
158
|
+
if (!aggressivelyGetLatestDuration && !Haptics && !Audio && !pickerFeedback) {
|
|
147
159
|
return;
|
|
148
160
|
}
|
|
149
161
|
if (aggressivelyGetLatestDuration) {
|
|
150
|
-
const
|
|
151
|
-
|
|
152
|
-
|
|
162
|
+
const newValues = getDurationAndIndexFromScrollOffset({
|
|
163
|
+
disableInfiniteScroll,
|
|
164
|
+
interval,
|
|
165
|
+
itemHeight: styles.pickerItemContainer.height,
|
|
166
|
+
numberOfItems,
|
|
167
|
+
padWithNItems,
|
|
168
|
+
yContentOffset: e.nativeEvent.contentOffset.y
|
|
169
|
+
});
|
|
170
|
+
if (newValues.duration !== latestDuration.current) {
|
|
153
171
|
// check limits
|
|
154
|
-
if (
|
|
155
|
-
|
|
156
|
-
} else if (
|
|
157
|
-
|
|
172
|
+
if (newValues.duration > adjustedLimited.max) {
|
|
173
|
+
newValues.duration = adjustedLimited.max;
|
|
174
|
+
} else if (newValues.duration < adjustedLimited.min) {
|
|
175
|
+
newValues.duration = adjustedLimited.min;
|
|
158
176
|
}
|
|
159
|
-
latestDuration.current =
|
|
177
|
+
latestDuration.current = newValues.duration;
|
|
160
178
|
}
|
|
161
179
|
}
|
|
162
|
-
if (Haptics || Audio) {
|
|
180
|
+
if (Haptics || Audio || pickerFeedback) {
|
|
163
181
|
const feedbackIndex = Math.round((e.nativeEvent.contentOffset.y + styles.pickerItemContainer.height / 2) / styles.pickerItemContainer.height);
|
|
164
182
|
if (feedbackIndex !== lastFeedbackIndex.current) {
|
|
165
183
|
// this check stops the feedback firing when the component mounts
|
|
@@ -177,70 +195,129 @@ const DurationScroll = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
177
195
|
} catch {
|
|
178
196
|
// do nothing
|
|
179
197
|
}
|
|
198
|
+
|
|
199
|
+
// fire custom feedback if available
|
|
200
|
+
try {
|
|
201
|
+
pickerFeedback === null || pickerFeedback === void 0 || pickerFeedback();
|
|
202
|
+
} catch {
|
|
203
|
+
// do nothing
|
|
204
|
+
}
|
|
180
205
|
}
|
|
181
206
|
lastFeedbackIndex.current = feedbackIndex;
|
|
182
207
|
}
|
|
183
208
|
}
|
|
184
209
|
},
|
|
185
210
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
186
|
-
[adjustedLimited.max, adjustedLimited.min, aggressivelyGetLatestDuration, clickSound, disableInfiniteScroll, numberOfItems, padWithNItems, styles.pickerItemContainer.height]);
|
|
211
|
+
[adjustedLimited.max, adjustedLimited.min, aggressivelyGetLatestDuration, clickSound, disableInfiniteScroll, interval, numberOfItems, padWithNItems, styles.pickerItemContainer.height]);
|
|
187
212
|
const onMomentumScrollEnd = useCallback(e => {
|
|
188
|
-
const
|
|
189
|
-
|
|
213
|
+
const newValues = getDurationAndIndexFromScrollOffset({
|
|
214
|
+
disableInfiniteScroll,
|
|
215
|
+
interval,
|
|
216
|
+
itemHeight: styles.pickerItemContainer.height,
|
|
217
|
+
numberOfItems,
|
|
218
|
+
padWithNItems,
|
|
219
|
+
yContentOffset: e.nativeEvent.contentOffset.y
|
|
220
|
+
});
|
|
190
221
|
|
|
191
222
|
// check limits
|
|
192
|
-
if (
|
|
193
|
-
var _flatListRef$
|
|
194
|
-
const targetScrollIndex =
|
|
195
|
-
(_flatListRef$
|
|
223
|
+
if (newValues.duration > adjustedLimited.max) {
|
|
224
|
+
var _flatListRef$current;
|
|
225
|
+
const targetScrollIndex = newValues.index - (newValues.duration - adjustedLimited.max);
|
|
226
|
+
(_flatListRef$current = flatListRef.current) === null || _flatListRef$current === void 0 || _flatListRef$current.scrollToIndex({
|
|
196
227
|
animated: true,
|
|
197
228
|
index:
|
|
198
229
|
// guard against scrolling beyond end of list
|
|
199
230
|
targetScrollIndex >= 0 ? targetScrollIndex : adjustedLimited.max - 1
|
|
200
231
|
}); // scroll down to max
|
|
201
|
-
|
|
202
|
-
} else if (
|
|
203
|
-
var _flatListRef$
|
|
204
|
-
const targetScrollIndex =
|
|
205
|
-
(_flatListRef$
|
|
232
|
+
newValues.duration = adjustedLimited.max;
|
|
233
|
+
} else if (newValues.duration < adjustedLimited.min) {
|
|
234
|
+
var _flatListRef$current2;
|
|
235
|
+
const targetScrollIndex = newValues.index + (adjustedLimited.min - newValues.duration);
|
|
236
|
+
(_flatListRef$current2 = flatListRef.current) === null || _flatListRef$current2 === void 0 || _flatListRef$current2.scrollToIndex({
|
|
206
237
|
animated: true,
|
|
207
238
|
index:
|
|
208
239
|
// guard against scrolling beyond end of list
|
|
209
|
-
targetScrollIndex <=
|
|
240
|
+
targetScrollIndex <= numbersForFlatList.length - 1 ? targetScrollIndex : adjustedLimited.min
|
|
210
241
|
}); // scroll up to min
|
|
211
|
-
|
|
242
|
+
newValues.duration = adjustedLimited.min;
|
|
212
243
|
}
|
|
213
|
-
onDurationChange(
|
|
214
|
-
}, [
|
|
244
|
+
onDurationChange(newValues.duration);
|
|
245
|
+
}, [disableInfiniteScroll, interval, styles.pickerItemContainer.height, numberOfItems, padWithNItems, adjustedLimited.max, adjustedLimited.min, onDurationChange, numbersForFlatList.length]);
|
|
215
246
|
const onViewableItemsChanged = useCallback(({
|
|
216
247
|
viewableItems
|
|
217
248
|
}) => {
|
|
218
249
|
var _viewableItems$, _viewableItems$2;
|
|
250
|
+
if (numberOfItems === 1) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
219
253
|
if ((_viewableItems$ = viewableItems[0]) !== null && _viewableItems$ !== void 0 && _viewableItems$.index && viewableItems[0].index < numberOfItems * 0.5) {
|
|
220
|
-
var _flatListRef$
|
|
221
|
-
(_flatListRef$
|
|
254
|
+
var _flatListRef$current3;
|
|
255
|
+
(_flatListRef$current3 = flatListRef.current) === null || _flatListRef$current3 === void 0 || _flatListRef$current3.scrollToIndex({
|
|
222
256
|
animated: false,
|
|
223
257
|
index: viewableItems[0].index + numberOfItems
|
|
224
258
|
});
|
|
225
|
-
} else if ((_viewableItems$2 = viewableItems[0]) !== null && _viewableItems$2 !== void 0 && _viewableItems$2.index && viewableItems[0].index >= numberOfItems * (
|
|
226
|
-
var _flatListRef$
|
|
227
|
-
(_flatListRef$
|
|
259
|
+
} else if ((_viewableItems$2 = viewableItems[0]) !== null && _viewableItems$2 !== void 0 && _viewableItems$2.index && viewableItems[0].index >= numberOfItems * (safeRepeatNumbersNTimes - 0.5)) {
|
|
260
|
+
var _flatListRef$current4;
|
|
261
|
+
(_flatListRef$current4 = flatListRef.current) === null || _flatListRef$current4 === void 0 || _flatListRef$current4.scrollToIndex({
|
|
228
262
|
animated: false,
|
|
229
|
-
index: viewableItems[0].index - numberOfItems
|
|
263
|
+
index: viewableItems[0].index - numberOfItems
|
|
230
264
|
});
|
|
231
265
|
}
|
|
232
|
-
}, [numberOfItems,
|
|
266
|
+
}, [numberOfItems, safeRepeatNumbersNTimes]);
|
|
267
|
+
const [viewabilityConfigCallbackPairs, setViewabilityConfigCallbackPairs] = useState(!disableInfiniteScroll ? [{
|
|
268
|
+
viewabilityConfig: {
|
|
269
|
+
viewAreaCoveragePercentThreshold: 0
|
|
270
|
+
},
|
|
271
|
+
onViewableItemsChanged: onViewableItemsChanged
|
|
272
|
+
}] : undefined);
|
|
273
|
+
const [flatListRenderKey, setFlatListRenderKey] = useState(0);
|
|
274
|
+
const initialRender = useRef(true);
|
|
275
|
+
useEffect(() => {
|
|
276
|
+
// don't run on first render
|
|
277
|
+
if (initialRender.current) {
|
|
278
|
+
initialRender.current = false;
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// if the onViewableItemsChanged callback changes, we need to update viewabilityConfigCallbackPairs
|
|
283
|
+
// which requires the FlatList to be remounted, hence the increase of the FlatList key
|
|
284
|
+
setFlatListRenderKey(prev => prev + 1);
|
|
285
|
+
setViewabilityConfigCallbackPairs(!disableInfiniteScroll ? [{
|
|
286
|
+
viewabilityConfig: {
|
|
287
|
+
viewAreaCoveragePercentThreshold: 0
|
|
288
|
+
},
|
|
289
|
+
onViewableItemsChanged: onViewableItemsChanged
|
|
290
|
+
}] : undefined);
|
|
291
|
+
}, [disableInfiniteScroll, onViewableItemsChanged]);
|
|
233
292
|
const getItemLayout = useCallback((_, index) => ({
|
|
234
293
|
length: styles.pickerItemContainer.height,
|
|
235
294
|
offset: styles.pickerItemContainer.height * index,
|
|
236
295
|
index
|
|
237
296
|
}), [styles.pickerItemContainer.height]);
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
297
|
+
useImperativeHandle(ref, () => ({
|
|
298
|
+
reset: options => {
|
|
299
|
+
var _flatListRef$current5;
|
|
300
|
+
(_flatListRef$current5 = flatListRef.current) === null || _flatListRef$current5 === void 0 || _flatListRef$current5.scrollToIndex({
|
|
301
|
+
animated: (options === null || options === void 0 ? void 0 : options.animated) ?? false,
|
|
302
|
+
index: initialScrollIndex
|
|
303
|
+
});
|
|
241
304
|
},
|
|
242
|
-
|
|
243
|
-
|
|
305
|
+
setValue: (value, options) => {
|
|
306
|
+
var _flatListRef$current6;
|
|
307
|
+
(_flatListRef$current6 = flatListRef.current) === null || _flatListRef$current6 === void 0 || _flatListRef$current6.scrollToIndex({
|
|
308
|
+
animated: (options === null || options === void 0 ? void 0 : options.animated) ?? false,
|
|
309
|
+
index: getInitialScrollIndex({
|
|
310
|
+
disableInfiniteScroll,
|
|
311
|
+
interval,
|
|
312
|
+
numberOfItems,
|
|
313
|
+
padWithNItems,
|
|
314
|
+
repeatNumbersNTimes: safeRepeatNumbersNTimes,
|
|
315
|
+
value: value
|
|
316
|
+
})
|
|
317
|
+
});
|
|
318
|
+
},
|
|
319
|
+
latestDuration: latestDuration
|
|
320
|
+
}));
|
|
244
321
|
return /*#__PURE__*/React.createElement(View, {
|
|
245
322
|
pointerEvents: isDisabled ? "none" : undefined,
|
|
246
323
|
style: [{
|
|
@@ -249,8 +326,9 @@ const DurationScroll = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
249
326
|
}, isDisabled && styles.disabledPickerContainer],
|
|
250
327
|
testID: testID
|
|
251
328
|
}, /*#__PURE__*/React.createElement(FlatList, {
|
|
329
|
+
key: flatListRenderKey,
|
|
252
330
|
ref: flatListRef,
|
|
253
|
-
data:
|
|
331
|
+
data: numbersForFlatList,
|
|
254
332
|
decelerationRate: 0.88,
|
|
255
333
|
getItemLayout: getItemLayout,
|
|
256
334
|
initialScrollIndex: initialScrollIndex,
|
|
@@ -263,11 +341,11 @@ const DurationScroll = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
263
341
|
scrollEventThrottle: 16,
|
|
264
342
|
showsVerticalScrollIndicator: false,
|
|
265
343
|
snapToAlignment: "start"
|
|
266
|
-
// used in place of
|
|
344
|
+
// used in place of snapToInterval due to bug on Android
|
|
267
345
|
,
|
|
268
|
-
snapToOffsets: [...Array(
|
|
346
|
+
snapToOffsets: [...Array(numbersForFlatList.length)].map((_, i) => i * styles.pickerItemContainer.height),
|
|
269
347
|
testID: "duration-scroll-flatlist",
|
|
270
|
-
viewabilityConfigCallbackPairs:
|
|
348
|
+
viewabilityConfigCallbackPairs: viewabilityConfigCallbackPairs,
|
|
271
349
|
windowSize: numberOfItemsToShow
|
|
272
350
|
}), /*#__PURE__*/React.createElement(View, {
|
|
273
351
|
pointerEvents: "none",
|