react-native-timer-picker 1.10.3 → 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 +81 -52
- package/dist/commonjs/components/DurationScroll/index.js +76 -19
- 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 +16 -4
- 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 +4 -3
- package/dist/commonjs/utils/generateNumbers.js.map +1 -1
- package/dist/commonjs/utils/getAdjustedLimit.js +5 -5
- package/dist/commonjs/utils/getAdjustedLimit.js.map +1 -1
- package/dist/commonjs/utils/getDurationAndIndexFromScrollOffset.js +2 -1
- package/dist/commonjs/utils/getDurationAndIndexFromScrollOffset.js.map +1 -1
- package/dist/commonjs/utils/getInitialScrollIndex.js +2 -1
- package/dist/commonjs/utils/getInitialScrollIndex.js.map +1 -1
- package/dist/module/components/DurationScroll/index.js +76 -19
- 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 +16 -4
- 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 +4 -3
- package/dist/module/utils/generateNumbers.js.map +1 -1
- package/dist/module/utils/getAdjustedLimit.js +5 -5
- package/dist/module/utils/getAdjustedLimit.js.map +1 -1
- package/dist/module/utils/getDurationAndIndexFromScrollOffset.js +2 -1
- package/dist/module/utils/getDurationAndIndexFromScrollOffset.js.map +1 -1
- package/dist/module/utils/getInitialScrollIndex.js +2 -1
- package/dist/module/utils/getInitialScrollIndex.js.map +1 -1
- 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 +2 -0
- package/dist/typescript/utils/getAdjustedLimit.d.ts +1 -1
- package/dist/typescript/utils/getDurationAndIndexFromScrollOffset.d.ts +1 -0
- package/dist/typescript/utils/getInitialScrollIndex.d.ts +1 -0
- package/package.json +14 -10
|
@@ -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":[]}
|
|
@@ -11,7 +11,8 @@ const generateNumbers = (numberOfItems, options) => {
|
|
|
11
11
|
}
|
|
12
12
|
let numbers = [];
|
|
13
13
|
for (let i = 0; i < numberOfItems; i++) {
|
|
14
|
-
|
|
14
|
+
const value = i * options.interval;
|
|
15
|
+
numbers.push((0, _padNumber.padNumber)(value, {
|
|
15
16
|
padWithZero: options.padNumbersWithZero
|
|
16
17
|
}));
|
|
17
18
|
}
|
|
@@ -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: 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(
|
|
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,23 +4,23 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.getAdjustedLimit = void 0;
|
|
7
|
-
const getAdjustedLimit = (limit, numberOfItems) => {
|
|
8
|
-
const
|
|
7
|
+
const getAdjustedLimit = (limit, numberOfItems, interval) => {
|
|
8
|
+
const maxValue = (numberOfItems - 1) * interval;
|
|
9
9
|
if (!limit || !limit.max && !limit.min) {
|
|
10
10
|
return {
|
|
11
|
-
max:
|
|
11
|
+
max: maxValue,
|
|
12
12
|
min: 0
|
|
13
13
|
};
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
// guard against limits that are out of bounds
|
|
17
|
-
const adjustedMaxLimit = limit.max ? Math.min(limit.max,
|
|
17
|
+
const adjustedMaxLimit = limit.max ? Math.min(limit.max, maxValue) : maxValue;
|
|
18
18
|
const adjustedMinLimit = limit.min ? Math.max(limit.min, 0) : 0;
|
|
19
19
|
|
|
20
20
|
// guard against invalid limits
|
|
21
21
|
if (adjustedMaxLimit < adjustedMinLimit) {
|
|
22
22
|
return {
|
|
23
|
-
max:
|
|
23
|
+
max: maxValue,
|
|
24
24
|
min: 0
|
|
25
25
|
};
|
|
26
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getAdjustedLimit","limit","numberOfItems","
|
|
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":[]}
|
|
@@ -7,13 +7,14 @@ exports.getDurationAndIndexFromScrollOffset = void 0;
|
|
|
7
7
|
const getDurationAndIndexFromScrollOffset = variables => {
|
|
8
8
|
const {
|
|
9
9
|
disableInfiniteScroll,
|
|
10
|
+
interval,
|
|
10
11
|
itemHeight,
|
|
11
12
|
numberOfItems,
|
|
12
13
|
padWithNItems,
|
|
13
14
|
yContentOffset
|
|
14
15
|
} = variables;
|
|
15
16
|
const index = Math.round(yContentOffset / itemHeight);
|
|
16
|
-
const duration = (disableInfiniteScroll ? index : index + padWithNItems) % numberOfItems;
|
|
17
|
+
const duration = (disableInfiniteScroll ? index : index + padWithNItems) % numberOfItems * interval;
|
|
17
18
|
return {
|
|
18
19
|
duration,
|
|
19
20
|
index
|
|
@@ -1 +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)
|
|
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":[]}
|
|
@@ -7,12 +7,13 @@ exports.getInitialScrollIndex = void 0;
|
|
|
7
7
|
const getInitialScrollIndex = variables => {
|
|
8
8
|
const {
|
|
9
9
|
disableInfiniteScroll,
|
|
10
|
+
interval,
|
|
10
11
|
numberOfItems,
|
|
11
12
|
padWithNItems,
|
|
12
13
|
repeatNumbersNTimes,
|
|
13
14
|
value
|
|
14
15
|
} = variables;
|
|
15
|
-
return Math.max(numberOfItems * Math.floor(repeatNumbersNTimes / 2) + (value + numberOfItems) % numberOfItems - (!disableInfiniteScroll ? padWithNItems : 0), 0);
|
|
16
|
+
return Math.max(numberOfItems * Math.floor(repeatNumbersNTimes / 2) + (value / interval + numberOfItems) % numberOfItems - (!disableInfiniteScroll ? padWithNItems : 0), 0);
|
|
16
17
|
};
|
|
17
18
|
exports.getInitialScrollIndex = getInitialScrollIndex;
|
|
18
19
|
//# sourceMappingURL=getInitialScrollIndex.js.map
|
|
@@ -1 +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,
|
|
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":[]}
|
|
@@ -18,54 +18,78 @@ const DurationScroll = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
18
18
|
FlatList = RNFlatList,
|
|
19
19
|
Haptics,
|
|
20
20
|
initialValue = 0,
|
|
21
|
+
interval,
|
|
21
22
|
is12HourPicker,
|
|
22
23
|
isDisabled,
|
|
23
24
|
label,
|
|
24
25
|
limit,
|
|
25
26
|
LinearGradient,
|
|
26
|
-
|
|
27
|
+
maximumValue,
|
|
27
28
|
onDurationChange,
|
|
28
29
|
padNumbersWithZero = false,
|
|
29
30
|
padWithNItems,
|
|
31
|
+
pickerFeedback,
|
|
30
32
|
pickerGradientOverlayProps,
|
|
31
33
|
pmLabel,
|
|
32
34
|
repeatNumbersNTimes = 3,
|
|
35
|
+
repeatNumbersNTimesNotExplicitlySet,
|
|
33
36
|
styles,
|
|
34
37
|
testID,
|
|
35
38
|
topPickerGradientOverlayProps
|
|
36
39
|
} = props;
|
|
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]);
|
|
37
47
|
const safeRepeatNumbersNTimes = useMemo(() => {
|
|
48
|
+
// do not repeat numbers if there is only one option
|
|
49
|
+
if (numberOfItems === 1) {
|
|
50
|
+
return 1;
|
|
51
|
+
}
|
|
38
52
|
if (!disableInfiniteScroll && repeatNumbersNTimes < 2) {
|
|
39
53
|
return 2;
|
|
40
54
|
} else if (repeatNumbersNTimes < 1) {
|
|
41
55
|
return 1;
|
|
42
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
|
+
}
|
|
43
64
|
return Math.round(repeatNumbersNTimes);
|
|
44
|
-
}, [disableInfiniteScroll, repeatNumbersNTimes]);
|
|
65
|
+
}, [disableInfiniteScroll, numberOfItems, repeatNumbersNTimes, repeatNumbersNTimesNotExplicitlySet]);
|
|
45
66
|
const numbersForFlatList = useMemo(() => {
|
|
46
67
|
if (is12HourPicker) {
|
|
47
68
|
return generate12HourNumbers({
|
|
48
69
|
padNumbersWithZero,
|
|
49
70
|
repeatNTimes: safeRepeatNumbersNTimes,
|
|
50
71
|
disableInfiniteScroll,
|
|
51
|
-
padWithNItems
|
|
72
|
+
padWithNItems,
|
|
73
|
+
interval
|
|
52
74
|
});
|
|
53
75
|
}
|
|
54
76
|
return generateNumbers(numberOfItems, {
|
|
55
77
|
padNumbersWithZero,
|
|
56
78
|
repeatNTimes: safeRepeatNumbersNTimes,
|
|
57
79
|
disableInfiniteScroll,
|
|
58
|
-
padWithNItems
|
|
80
|
+
padWithNItems,
|
|
81
|
+
interval
|
|
59
82
|
});
|
|
60
|
-
}, [disableInfiniteScroll, is12HourPicker, numberOfItems, padNumbersWithZero, padWithNItems, safeRepeatNumbersNTimes]);
|
|
83
|
+
}, [disableInfiniteScroll, is12HourPicker, interval, numberOfItems, padNumbersWithZero, padWithNItems, safeRepeatNumbersNTimes]);
|
|
61
84
|
const initialScrollIndex = useMemo(() => getInitialScrollIndex({
|
|
62
85
|
disableInfiniteScroll,
|
|
86
|
+
interval,
|
|
63
87
|
numberOfItems,
|
|
64
88
|
padWithNItems,
|
|
65
89
|
repeatNumbersNTimes: safeRepeatNumbersNTimes,
|
|
66
90
|
value: initialValue
|
|
67
|
-
}), [disableInfiniteScroll, initialValue, numberOfItems, padWithNItems, safeRepeatNumbersNTimes]);
|
|
68
|
-
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]);
|
|
69
93
|
const numberOfItemsToShow = 1 + padWithNItems * 2;
|
|
70
94
|
|
|
71
95
|
// keep track of the latest duration as it scrolls
|
|
@@ -131,12 +155,13 @@ const DurationScroll = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
131
155
|
// this function is only used when the picker is in a modal and/or has Haptic/Audio feedback
|
|
132
156
|
// it is used to ensure that the modal gets the latest duration on clicking
|
|
133
157
|
// the confirm button, even if the scrollview is still scrolling
|
|
134
|
-
if (!aggressivelyGetLatestDuration && !Haptics && !Audio) {
|
|
158
|
+
if (!aggressivelyGetLatestDuration && !Haptics && !Audio && !pickerFeedback) {
|
|
135
159
|
return;
|
|
136
160
|
}
|
|
137
161
|
if (aggressivelyGetLatestDuration) {
|
|
138
162
|
const newValues = getDurationAndIndexFromScrollOffset({
|
|
139
163
|
disableInfiniteScroll,
|
|
164
|
+
interval,
|
|
140
165
|
itemHeight: styles.pickerItemContainer.height,
|
|
141
166
|
numberOfItems,
|
|
142
167
|
padWithNItems,
|
|
@@ -152,7 +177,7 @@ const DurationScroll = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
152
177
|
latestDuration.current = newValues.duration;
|
|
153
178
|
}
|
|
154
179
|
}
|
|
155
|
-
if (Haptics || Audio) {
|
|
180
|
+
if (Haptics || Audio || pickerFeedback) {
|
|
156
181
|
const feedbackIndex = Math.round((e.nativeEvent.contentOffset.y + styles.pickerItemContainer.height / 2) / styles.pickerItemContainer.height);
|
|
157
182
|
if (feedbackIndex !== lastFeedbackIndex.current) {
|
|
158
183
|
// this check stops the feedback firing when the component mounts
|
|
@@ -170,16 +195,24 @@ const DurationScroll = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
170
195
|
} catch {
|
|
171
196
|
// do nothing
|
|
172
197
|
}
|
|
198
|
+
|
|
199
|
+
// fire custom feedback if available
|
|
200
|
+
try {
|
|
201
|
+
pickerFeedback === null || pickerFeedback === void 0 || pickerFeedback();
|
|
202
|
+
} catch {
|
|
203
|
+
// do nothing
|
|
204
|
+
}
|
|
173
205
|
}
|
|
174
206
|
lastFeedbackIndex.current = feedbackIndex;
|
|
175
207
|
}
|
|
176
208
|
}
|
|
177
209
|
},
|
|
178
210
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
179
|
-
[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]);
|
|
180
212
|
const onMomentumScrollEnd = useCallback(e => {
|
|
181
213
|
const newValues = getDurationAndIndexFromScrollOffset({
|
|
182
214
|
disableInfiniteScroll,
|
|
215
|
+
interval,
|
|
183
216
|
itemHeight: styles.pickerItemContainer.height,
|
|
184
217
|
numberOfItems,
|
|
185
218
|
padWithNItems,
|
|
@@ -209,11 +242,14 @@ const DurationScroll = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
209
242
|
newValues.duration = adjustedLimited.min;
|
|
210
243
|
}
|
|
211
244
|
onDurationChange(newValues.duration);
|
|
212
|
-
}, [
|
|
245
|
+
}, [disableInfiniteScroll, interval, styles.pickerItemContainer.height, numberOfItems, padWithNItems, adjustedLimited.max, adjustedLimited.min, onDurationChange, numbersForFlatList.length]);
|
|
213
246
|
const onViewableItemsChanged = useCallback(({
|
|
214
247
|
viewableItems
|
|
215
248
|
}) => {
|
|
216
249
|
var _viewableItems$, _viewableItems$2;
|
|
250
|
+
if (numberOfItems === 1) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
217
253
|
if ((_viewableItems$ = viewableItems[0]) !== null && _viewableItems$ !== void 0 && _viewableItems$.index && viewableItems[0].index < numberOfItems * 0.5) {
|
|
218
254
|
var _flatListRef$current3;
|
|
219
255
|
(_flatListRef$current3 = flatListRef.current) === null || _flatListRef$current3 === void 0 || _flatListRef$current3.scrollToIndex({
|
|
@@ -228,17 +264,36 @@ const DurationScroll = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
228
264
|
});
|
|
229
265
|
}
|
|
230
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]);
|
|
231
292
|
const getItemLayout = useCallback((_, index) => ({
|
|
232
293
|
length: styles.pickerItemContainer.height,
|
|
233
294
|
offset: styles.pickerItemContainer.height * index,
|
|
234
295
|
index
|
|
235
296
|
}), [styles.pickerItemContainer.height]);
|
|
236
|
-
const viewabilityConfigCallbackPairs = useRef([{
|
|
237
|
-
viewabilityConfig: {
|
|
238
|
-
viewAreaCoveragePercentThreshold: 0
|
|
239
|
-
},
|
|
240
|
-
onViewableItemsChanged: onViewableItemsChanged
|
|
241
|
-
}]);
|
|
242
297
|
useImperativeHandle(ref, () => ({
|
|
243
298
|
reset: options => {
|
|
244
299
|
var _flatListRef$current5;
|
|
@@ -253,6 +308,7 @@ const DurationScroll = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
253
308
|
animated: (options === null || options === void 0 ? void 0 : options.animated) ?? false,
|
|
254
309
|
index: getInitialScrollIndex({
|
|
255
310
|
disableInfiniteScroll,
|
|
311
|
+
interval,
|
|
256
312
|
numberOfItems,
|
|
257
313
|
padWithNItems,
|
|
258
314
|
repeatNumbersNTimes: safeRepeatNumbersNTimes,
|
|
@@ -270,6 +326,7 @@ const DurationScroll = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
270
326
|
}, isDisabled && styles.disabledPickerContainer],
|
|
271
327
|
testID: testID
|
|
272
328
|
}, /*#__PURE__*/React.createElement(FlatList, {
|
|
329
|
+
key: flatListRenderKey,
|
|
273
330
|
ref: flatListRef,
|
|
274
331
|
data: numbersForFlatList,
|
|
275
332
|
decelerationRate: 0.88,
|
|
@@ -284,11 +341,11 @@ const DurationScroll = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
284
341
|
scrollEventThrottle: 16,
|
|
285
342
|
showsVerticalScrollIndicator: false,
|
|
286
343
|
snapToAlignment: "start"
|
|
287
|
-
// used in place of
|
|
344
|
+
// used in place of snapToInterval due to bug on Android
|
|
288
345
|
,
|
|
289
346
|
snapToOffsets: [...Array(numbersForFlatList.length)].map((_, i) => i * styles.pickerItemContainer.height),
|
|
290
347
|
testID: "duration-scroll-flatlist",
|
|
291
|
-
viewabilityConfigCallbackPairs:
|
|
348
|
+
viewabilityConfigCallbackPairs: viewabilityConfigCallbackPairs,
|
|
292
349
|
windowSize: numberOfItemsToShow
|
|
293
350
|
}), /*#__PURE__*/React.createElement(View, {
|
|
294
351
|
pointerEvents: "none",
|