react-native-timer-picker 1.2.7 → 1.2.9
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/dist/commonjs/components/Modal/Modal.styles.js +32 -0
- package/dist/commonjs/components/Modal/Modal.styles.js.map +1 -0
- package/dist/commonjs/components/Modal/index.js +108 -0
- package/dist/commonjs/components/Modal/index.js.map +1 -0
- package/dist/commonjs/components/TimerPicker/DurationScroll.js +210 -0
- package/dist/commonjs/components/TimerPicker/DurationScroll.js.map +1 -0
- package/dist/commonjs/components/TimerPicker/TimerPicker.styles.js +67 -0
- package/dist/commonjs/components/TimerPicker/TimerPicker.styles.js.map +1 -0
- package/dist/commonjs/components/TimerPicker/index.js +130 -0
- package/dist/commonjs/components/TimerPicker/index.js.map +1 -0
- package/dist/commonjs/components/TimerPickerModal.styles.js +69 -0
- package/dist/commonjs/components/TimerPickerModal.styles.js.map +1 -0
- package/dist/commonjs/components/index.js +156 -0
- package/dist/commonjs/components/index.js.map +1 -0
- package/dist/commonjs/index.js +21 -0
- package/dist/commonjs/index.js.map +1 -0
- package/dist/commonjs/tests/DurationScroll.test.js +56 -0
- package/dist/commonjs/tests/DurationScroll.test.js.map +1 -0
- package/dist/commonjs/tests/Modal.test.js +40 -0
- package/dist/commonjs/tests/Modal.test.js.map +1 -0
- package/dist/commonjs/tests/TimerPicker.test.js +37 -0
- package/dist/commonjs/tests/TimerPicker.test.js.map +1 -0
- package/dist/commonjs/tests/TimerPickerModal.test.js +73 -0
- package/dist/commonjs/tests/TimerPickerModal.test.js.map +1 -0
- package/dist/commonjs/utils/colorToRgba.js +51 -0
- package/dist/commonjs/utils/colorToRgba.js.map +1 -0
- package/dist/commonjs/utils/generateNumbers.js +32 -0
- package/dist/commonjs/utils/generateNumbers.js.map +1 -0
- package/dist/commonjs/utils/getAdjustedLimit.js +32 -0
- package/dist/commonjs/utils/getAdjustedLimit.js.map +1 -0
- package/dist/commonjs/utils/getScrollIndex.js +17 -0
- package/dist/commonjs/utils/getScrollIndex.js.map +1 -0
- package/dist/commonjs/utils/padWithZero.js +15 -0
- package/dist/commonjs/utils/padWithZero.js.map +1 -0
- package/dist/module/components/Modal/Modal.styles.js +26 -0
- package/dist/module/components/Modal/Modal.styles.js.map +1 -0
- package/dist/module/components/Modal/index.js +100 -0
- package/dist/module/components/Modal/index.js.map +1 -0
- package/dist/module/components/TimerPicker/DurationScroll.js +202 -0
- package/dist/module/components/TimerPicker/DurationScroll.js.map +1 -0
- package/dist/module/components/TimerPicker/TimerPicker.styles.js +59 -0
- package/dist/module/components/TimerPicker/TimerPicker.styles.js.map +1 -0
- package/dist/module/components/TimerPicker/index.js +121 -0
- package/dist/module/components/TimerPicker/index.js.map +1 -0
- package/dist/module/components/TimerPickerModal.styles.js +61 -0
- package/dist/module/components/TimerPickerModal.styles.js.map +1 -0
- package/dist/module/components/index.js +147 -0
- package/dist/module/components/index.js.map +1 -0
- package/dist/module/index.js +3 -0
- package/dist/module/index.js.map +1 -0
- package/dist/module/tests/DurationScroll.test.js +53 -0
- package/dist/module/tests/DurationScroll.test.js.map +1 -0
- package/dist/module/tests/Modal.test.js +37 -0
- package/dist/module/tests/Modal.test.js.map +1 -0
- package/dist/module/tests/TimerPicker.test.js +34 -0
- package/dist/module/tests/TimerPicker.test.js.map +1 -0
- package/dist/module/tests/TimerPickerModal.test.js +70 -0
- package/dist/module/tests/TimerPickerModal.test.js.map +1 -0
- package/dist/module/utils/colorToRgba.js +44 -0
- package/dist/module/utils/colorToRgba.js.map +1 -0
- package/dist/module/utils/generateNumbers.js +25 -0
- package/dist/module/utils/generateNumbers.js.map +1 -0
- package/dist/module/utils/getAdjustedLimit.js +25 -0
- package/dist/module/utils/getAdjustedLimit.js.map +1 -0
- package/dist/module/utils/getScrollIndex.js +10 -0
- package/dist/module/utils/getScrollIndex.js.map +1 -0
- package/dist/module/utils/padWithZero.js +8 -0
- package/dist/module/utils/padWithZero.js.map +1 -0
- package/dist/typescript/index.d.ts +4 -0
- package/dist/{utils → typescript/utils}/colorToRgba.d.ts +1 -1
- package/dist/{utils → typescript/utils}/getScrollIndex.d.ts +1 -1
- package/package.json +29 -12
- package/{dist/components/Modal/Modal.styles.js → src/components/Modal/Modal.styles.ts} +4 -6
- package/src/components/Modal/index.tsx +134 -0
- package/src/components/TimerPicker/DurationScroll.tsx +337 -0
- package/src/components/TimerPicker/TimerPicker.styles.ts +87 -0
- package/src/components/TimerPicker/index.tsx +216 -0
- package/src/components/TimerPickerModal.styles.ts +87 -0
- package/src/components/index.tsx +243 -0
- package/src/index.ts +14 -0
- package/src/tests/DurationScroll.test.tsx +57 -0
- package/src/tests/Modal.test.tsx +34 -0
- package/src/tests/TimerPicker.test.tsx +27 -0
- package/src/tests/TimerPickerModal.test.tsx +70 -0
- package/{dist/utils/colorToRgba.js → src/utils/colorToRgba.ts} +18 -17
- package/src/utils/generateNumbers.ts +34 -0
- package/{dist/utils/getAdjustedLimit.js → src/utils/getAdjustedLimit.ts} +14 -7
- package/src/utils/getScrollIndex.ts +15 -0
- package/src/utils/padWithZero.ts +7 -0
- package/dist/components/Modal/index.js +0 -109
- package/dist/components/TimerPicker/DurationScroll.js +0 -211
- package/dist/components/TimerPicker/TimerPicker.styles.js +0 -41
- package/dist/components/TimerPicker/index.js +0 -81
- package/dist/components/TimerPickerModal.styles.js +0 -37
- package/dist/components/index.js +0 -118
- package/dist/index.d.ts +0 -4
- package/dist/index.js +0 -10
- package/dist/utils/generateNumbers.js +0 -30
- package/dist/utils/getScrollIndex.js +0 -10
- package/dist/utils/padWithZero.js +0 -12
- /package/dist/{components → typescript/components}/Modal/Modal.styles.d.ts +0 -0
- /package/dist/{components → typescript/components}/Modal/index.d.ts +0 -0
- /package/dist/{components → typescript/components}/TimerPicker/DurationScroll.d.ts +0 -0
- /package/dist/{components → typescript/components}/TimerPicker/TimerPicker.styles.d.ts +0 -0
- /package/dist/{components → typescript/components}/TimerPicker/index.d.ts +0 -0
- /package/dist/{components → typescript/components}/TimerPickerModal.styles.d.ts +0 -0
- /package/dist/{components → typescript/components}/index.d.ts +0 -0
- /package/dist/{utils → typescript/utils}/generateNumbers.d.ts +0 -0
- /package/dist/{utils → typescript/utils}/getAdjustedLimit.d.ts +0 -0
- /package/dist/{utils → typescript/utils}/padWithZero.d.ts +0 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { render, fireEvent } from "@testing-library/react-native";
|
|
4
|
+
import TimerPickerModal from "../components";
|
|
5
|
+
describe("TimerPickerModal", () => {
|
|
6
|
+
const mockOnConfirm = jest.fn();
|
|
7
|
+
const mockOnCancel = jest.fn();
|
|
8
|
+
const defaultProps = {
|
|
9
|
+
visible: true,
|
|
10
|
+
setIsVisible: jest.fn(),
|
|
11
|
+
onConfirm: mockOnConfirm,
|
|
12
|
+
onCancel: mockOnCancel
|
|
13
|
+
};
|
|
14
|
+
it("renders without crashing", () => {
|
|
15
|
+
const {
|
|
16
|
+
getByTestId
|
|
17
|
+
} = render( /*#__PURE__*/React.createElement(TimerPickerModal, defaultProps));
|
|
18
|
+
const component = getByTestId("timer-picker-modal");
|
|
19
|
+
expect(component).toBeDefined();
|
|
20
|
+
});
|
|
21
|
+
it("calls onConfirm when Confirm button is pressed", () => {
|
|
22
|
+
const {
|
|
23
|
+
getByText
|
|
24
|
+
} = render( /*#__PURE__*/React.createElement(TimerPickerModal, defaultProps));
|
|
25
|
+
const confirmButton = getByText("Confirm");
|
|
26
|
+
fireEvent.press(confirmButton);
|
|
27
|
+
expect(mockOnConfirm).toHaveBeenCalled();
|
|
28
|
+
});
|
|
29
|
+
it("calls onCancel when Cancel button is pressed", () => {
|
|
30
|
+
const {
|
|
31
|
+
getByText
|
|
32
|
+
} = render( /*#__PURE__*/React.createElement(TimerPickerModal, defaultProps));
|
|
33
|
+
const cancelButton = getByText("Cancel");
|
|
34
|
+
fireEvent.press(cancelButton);
|
|
35
|
+
expect(mockOnCancel).toHaveBeenCalled();
|
|
36
|
+
});
|
|
37
|
+
it("hides the modal when Cancel button is pressed", () => {
|
|
38
|
+
const setIsVisibleMock = jest.fn();
|
|
39
|
+
const {
|
|
40
|
+
getByText
|
|
41
|
+
} = render( /*#__PURE__*/React.createElement(TimerPickerModal, _extends({}, defaultProps, {
|
|
42
|
+
setIsVisible: setIsVisibleMock
|
|
43
|
+
})));
|
|
44
|
+
const cancelButton = getByText("Cancel");
|
|
45
|
+
fireEvent.press(cancelButton);
|
|
46
|
+
expect(setIsVisibleMock).toHaveBeenCalledWith(false);
|
|
47
|
+
});
|
|
48
|
+
it("hides the modal when overlay is pressed", () => {
|
|
49
|
+
const setIsVisibleMock = jest.fn();
|
|
50
|
+
const {
|
|
51
|
+
getByTestId
|
|
52
|
+
} = render( /*#__PURE__*/React.createElement(TimerPickerModal, _extends({}, defaultProps, {
|
|
53
|
+
setIsVisible: setIsVisibleMock,
|
|
54
|
+
closeOnOverlayPress: true
|
|
55
|
+
})));
|
|
56
|
+
const overlay = getByTestId("modal-backdrop");
|
|
57
|
+
fireEvent.press(overlay);
|
|
58
|
+
expect(setIsVisibleMock).toHaveBeenCalledWith(false);
|
|
59
|
+
});
|
|
60
|
+
it("calls onConfirm with selected duration when Confirm button is pressed", () => {
|
|
61
|
+
const {
|
|
62
|
+
getByText
|
|
63
|
+
} = render( /*#__PURE__*/React.createElement(TimerPickerModal, defaultProps));
|
|
64
|
+
// Select duration in TimerPicker, assuming its interaction is tested separately
|
|
65
|
+
const confirmButton = getByText("Confirm");
|
|
66
|
+
fireEvent.press(confirmButton);
|
|
67
|
+
expect(mockOnConfirm).toHaveBeenCalledWith(expect.objectContaining({}));
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=TimerPickerModal.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","render","fireEvent","TimerPickerModal","describe","mockOnConfirm","jest","fn","mockOnCancel","defaultProps","visible","setIsVisible","onConfirm","onCancel","it","getByTestId","createElement","component","expect","toBeDefined","getByText","confirmButton","press","toHaveBeenCalled","cancelButton","setIsVisibleMock","_extends","toHaveBeenCalledWith","closeOnOverlayPress","overlay","objectContaining"],"sources":["TimerPickerModal.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { render, fireEvent } from \"@testing-library/react-native\";\nimport TimerPickerModal from \"../components\";\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 setIsVisible={setIsVisibleMock}\n closeOnOverlayPress\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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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export const colorToRgba = variables => {
|
|
2
|
+
// this function is required for expo-linear-gradient on iOS. To fade to transparent, we need
|
|
3
|
+
// to be able to add opacity to the background color. Supplying 'transparent' does not work
|
|
4
|
+
// because that is actually a transparent black (rgba(0, 0, 0, 1)), which results in dodgy rendering
|
|
5
|
+
|
|
6
|
+
const {
|
|
7
|
+
color,
|
|
8
|
+
opacity = 1
|
|
9
|
+
} = variables;
|
|
10
|
+
// Handle named colors
|
|
11
|
+
const namedColors = {
|
|
12
|
+
transparent: "rgba(0, 0, 0, 0)",
|
|
13
|
+
black: "rgba(0, 0, 0, 1)",
|
|
14
|
+
white: "rgba(255, 255, 255, 1)",
|
|
15
|
+
blue: "rgba(0, 0, 255, 1)",
|
|
16
|
+
green: "rgba(0, 128, 0, 1)",
|
|
17
|
+
gray: "rgba(128, 128, 128, 1)",
|
|
18
|
+
red: "rgba(255, 0, 0, 1)"
|
|
19
|
+
};
|
|
20
|
+
if (color in namedColors) {
|
|
21
|
+
return namedColors[color];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Handle RGB format
|
|
25
|
+
if (color.startsWith("rgb(")) {
|
|
26
|
+
const rgbValues = color.replace("rgb(", "").replace(")", "").split(",").map(value => parseInt(value.trim(), 10));
|
|
27
|
+
const [r, g, b] = rgbValues;
|
|
28
|
+
return `rgba(${r}, ${g}, ${b}, ${opacity})`;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Handle hex format
|
|
32
|
+
if (color.startsWith("#")) {
|
|
33
|
+
let hexColor = color.slice(1);
|
|
34
|
+
if (hexColor.length === 3) {
|
|
35
|
+
hexColor = hexColor.split("").map(value => value + value).join("");
|
|
36
|
+
}
|
|
37
|
+
const r = parseInt(hexColor.slice(0, 2), 16);
|
|
38
|
+
const g = parseInt(hexColor.slice(2, 4), 16);
|
|
39
|
+
const b = parseInt(hexColor.slice(4, 6), 16);
|
|
40
|
+
return `rgba(${r}, ${g}, ${b}, ${opacity})`;
|
|
41
|
+
}
|
|
42
|
+
return color; // Return unchanged if unable to parse
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=colorToRgba.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["colorToRgba","variables","color","opacity","namedColors","transparent","black","white","blue","green","gray","red","startsWith","rgbValues","replace","split","map","value","parseInt","trim","r","g","b","hexColor","slice","length","join"],"sources":["colorToRgba.ts"],"sourcesContent":["export const colorToRgba = (variables: { color: string; opacity?: number }) => {\n // this function is required for expo-linear-gradient on iOS. To fade to transparent, we need\n // to be able to add opacity to the background color. Supplying 'transparent' does not work\n // because that is actually a transparent black (rgba(0, 0, 0, 1)), which results in dodgy rendering\n\n const { color, opacity = 1 } = variables;\n // Handle named colors\n const namedColors: { [key: string]: string } = {\n transparent: \"rgba(0, 0, 0, 0)\",\n black: \"rgba(0, 0, 0, 1)\",\n white: \"rgba(255, 255, 255, 1)\",\n blue: \"rgba(0, 0, 255, 1)\",\n green: \"rgba(0, 128, 0, 1)\",\n gray: \"rgba(128, 128, 128, 1)\",\n red: \"rgba(255, 0, 0, 1)\",\n };\n\n if (color in namedColors) {\n return namedColors[color];\n }\n\n // Handle RGB format\n if (color.startsWith(\"rgb(\")) {\n const rgbValues = color\n .replace(\"rgb(\", \"\")\n .replace(\")\", \"\")\n .split(\",\")\n .map((value) => parseInt(value.trim(), 10));\n const [r, g, b] = rgbValues;\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n }\n\n // Handle hex format\n if (color.startsWith(\"#\")) {\n let hexColor = color.slice(1);\n if (hexColor.length === 3) {\n hexColor = hexColor\n .split(\"\")\n .map((value) => value + value)\n .join(\"\");\n }\n const r = parseInt(hexColor.slice(0, 2), 16);\n const g = parseInt(hexColor.slice(2, 4), 16);\n const b = parseInt(hexColor.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n }\n\n return color; // Return unchanged if unable to parse\n};\n"],"mappings":"AAAA,OAAO,MAAMA,WAAW,GAAIC,SAA8C,IAAK;EAC3E;EACA;EACA;;EAEA,MAAM;IAAEC,KAAK;IAAEC,OAAO,GAAG;EAAE,CAAC,GAAGF,SAAS;EACxC;EACA,MAAMG,WAAsC,GAAG;IAC3CC,WAAW,EAAE,kBAAkB;IAC/BC,KAAK,EAAE,kBAAkB;IACzBC,KAAK,EAAE,wBAAwB;IAC/BC,IAAI,EAAE,oBAAoB;IAC1BC,KAAK,EAAE,oBAAoB;IAC3BC,IAAI,EAAE,wBAAwB;IAC9BC,GAAG,EAAE;EACT,CAAC;EAED,IAAIT,KAAK,IAAIE,WAAW,EAAE;IACtB,OAAOA,WAAW,CAACF,KAAK,CAAC;EAC7B;;EAEA;EACA,IAAIA,KAAK,CAACU,UAAU,CAAC,MAAM,CAAC,EAAE;IAC1B,MAAMC,SAAS,GAAGX,KAAK,CAClBY,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CACnBA,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAChBC,KAAK,CAAC,GAAG,CAAC,CACVC,GAAG,CAAEC,KAAK,IAAKC,QAAQ,CAACD,KAAK,CAACE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/C,MAAM,CAACC,CAAC,EAAEC,CAAC,EAAEC,CAAC,CAAC,GAAGT,SAAS;IAC3B,OAAQ,QAAOO,CAAE,KAAIC,CAAE,KAAIC,CAAE,KAAInB,OAAQ,GAAE;EAC/C;;EAEA;EACA,IAAID,KAAK,CAACU,UAAU,CAAC,GAAG,CAAC,EAAE;IACvB,IAAIW,QAAQ,GAAGrB,KAAK,CAACsB,KAAK,CAAC,CAAC,CAAC;IAC7B,IAAID,QAAQ,CAACE,MAAM,KAAK,CAAC,EAAE;MACvBF,QAAQ,GAAGA,QAAQ,CACdR,KAAK,CAAC,EAAE,CAAC,CACTC,GAAG,CAAEC,KAAK,IAAKA,KAAK,GAAGA,KAAK,CAAC,CAC7BS,IAAI,CAAC,EAAE,CAAC;IACjB;IACA,MAAMN,CAAC,GAAGF,QAAQ,CAACK,QAAQ,CAACC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;IAC5C,MAAMH,CAAC,GAAGH,QAAQ,CAACK,QAAQ,CAACC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;IAC5C,MAAMF,CAAC,GAAGJ,QAAQ,CAACK,QAAQ,CAACC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;IAC5C,OAAQ,QAAOJ,CAAE,KAAIC,CAAE,KAAIC,CAAE,KAAInB,OAAQ,GAAE;EAC/C;EAEA,OAAOD,KAAK,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { padWithZero } from "./padWithZero";
|
|
2
|
+
export const generateNumbers = (numberOfItems, options) => {
|
|
3
|
+
if (numberOfItems <= 0) {
|
|
4
|
+
return [];
|
|
5
|
+
}
|
|
6
|
+
let numbers = [];
|
|
7
|
+
if (options.padWithZero) {
|
|
8
|
+
for (let i = 0; i <= numberOfItems; i++) {
|
|
9
|
+
numbers.push(padWithZero(i));
|
|
10
|
+
}
|
|
11
|
+
} else {
|
|
12
|
+
for (let i = 0; i <= numberOfItems; i++) {
|
|
13
|
+
numbers.push(String(i));
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
if ((options.repeatNTimes ?? 1) > 1) {
|
|
17
|
+
numbers = Array(options.repeatNTimes).fill(numbers).flat();
|
|
18
|
+
}
|
|
19
|
+
if (options.disableInfiniteScroll) {
|
|
20
|
+
numbers.push(...Array(options.padWithNItems).fill(""));
|
|
21
|
+
numbers.unshift(...Array(options.padWithNItems).fill(""));
|
|
22
|
+
}
|
|
23
|
+
return numbers;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=generateNumbers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["padWithZero","generateNumbers","numberOfItems","options","numbers","i","push","String","repeatNTimes","Array","fill","flat","disableInfiniteScroll","padWithNItems","unshift"],"sources":["generateNumbers.ts"],"sourcesContent":["import { padWithZero } from \"./padWithZero\";\n\nexport const generateNumbers = (\n numberOfItems: number,\n options: {\n repeatNTimes?: number;\n padWithZero?: boolean;\n disableInfiniteScroll?: boolean;\n padWithNItems: number;\n }\n) => {\n if (numberOfItems <= 0) {\n return [];\n }\n\n let numbers: string[] = [];\n if (options.padWithZero) {\n for (let i = 0; i <= numberOfItems; i++) {\n numbers.push(padWithZero(i));\n }\n } else {\n for (let i = 0; i <= numberOfItems; i++) {\n numbers.push(String(i));\n }\n }\n if ((options.repeatNTimes ?? 1) > 1) {\n numbers = Array(options.repeatNTimes).fill(numbers).flat();\n }\n if (options.disableInfiniteScroll) {\n numbers.push(...Array(options.padWithNItems).fill(\"\"));\n numbers.unshift(...Array(options.padWithNItems).fill(\"\"));\n }\n return numbers;\n};\n"],"mappings":"AAAA,SAASA,WAAW,QAAQ,eAAe;AAE3C,OAAO,MAAMC,eAAe,GAAGA,CAC3BC,aAAqB,EACrBC,OAKC,KACA;EACD,IAAID,aAAa,IAAI,CAAC,EAAE;IACpB,OAAO,EAAE;EACb;EAEA,IAAIE,OAAiB,GAAG,EAAE;EAC1B,IAAID,OAAO,CAACH,WAAW,EAAE;IACrB,KAAK,IAAIK,CAAC,GAAG,CAAC,EAAEA,CAAC,IAAIH,aAAa,EAAEG,CAAC,EAAE,EAAE;MACrCD,OAAO,CAACE,IAAI,CAACN,WAAW,CAACK,CAAC,CAAC,CAAC;IAChC;EACJ,CAAC,MAAM;IACH,KAAK,IAAIA,CAAC,GAAG,CAAC,EAAEA,CAAC,IAAIH,aAAa,EAAEG,CAAC,EAAE,EAAE;MACrCD,OAAO,CAACE,IAAI,CAACC,MAAM,CAACF,CAAC,CAAC,CAAC;IAC3B;EACJ;EACA,IAAI,CAACF,OAAO,CAACK,YAAY,IAAI,CAAC,IAAI,CAAC,EAAE;IACjCJ,OAAO,GAAGK,KAAK,CAACN,OAAO,CAACK,YAAY,CAAC,CAACE,IAAI,CAACN,OAAO,CAAC,CAACO,IAAI,CAAC,CAAC;EAC9D;EACA,IAAIR,OAAO,CAACS,qBAAqB,EAAE;IAC/BR,OAAO,CAACE,IAAI,CAAC,GAAGG,KAAK,CAACN,OAAO,CAACU,aAAa,CAAC,CAACH,IAAI,CAAC,EAAE,CAAC,CAAC;IACtDN,OAAO,CAACU,OAAO,CAAC,GAAGL,KAAK,CAACN,OAAO,CAACU,aAAa,CAAC,CAACH,IAAI,CAAC,EAAE,CAAC,CAAC;EAC7D;EACA,OAAON,OAAO;AAClB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export const getAdjustedLimit = (limit, numberOfItems) => {
|
|
2
|
+
if (!limit || !limit.max && !limit.min) {
|
|
3
|
+
return {
|
|
4
|
+
max: numberOfItems,
|
|
5
|
+
min: 0
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// guard against limits that are out of bounds
|
|
10
|
+
const adjustedMaxLimit = limit.max ? Math.min(limit.max, numberOfItems) : numberOfItems;
|
|
11
|
+
const adjustedMinLimit = limit.min ? Math.max(limit.min, 0) : 0;
|
|
12
|
+
|
|
13
|
+
// guard against invalid limits
|
|
14
|
+
if (adjustedMaxLimit < adjustedMinLimit) {
|
|
15
|
+
return {
|
|
16
|
+
max: numberOfItems,
|
|
17
|
+
min: 0
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
max: adjustedMaxLimit,
|
|
22
|
+
min: adjustedMinLimit
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=getAdjustedLimit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getAdjustedLimit","limit","numberOfItems","max","min","adjustedMaxLimit","Math","adjustedMinLimit"],"sources":["getAdjustedLimit.ts"],"sourcesContent":["import type { LimitType } from \"../components/TimerPicker/DurationScroll\";\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: numberOfItems,\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, numberOfItems)\n : numberOfItems;\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: numberOfItems,\n min: 0,\n };\n }\n\n return {\n max: adjustedMaxLimit,\n min: adjustedMinLimit,\n };\n};\n"],"mappings":"AAEA,OAAO,MAAMA,gBAAgB,GAAGA,CAC5BC,KAA4B,EAC5BC,aAAqB,KAIpB;EACD,IAAI,CAACD,KAAK,IAAK,CAACA,KAAK,CAACE,GAAG,IAAI,CAACF,KAAK,CAACG,GAAI,EAAE;IACtC,OAAO;MACHD,GAAG,EAAED,aAAa;MAClBE,GAAG,EAAE;IACT,CAAC;EACL;;EAEA;EACA,MAAMC,gBAAgB,GAAGJ,KAAK,CAACE,GAAG,GAC5BG,IAAI,CAACF,GAAG,CAACH,KAAK,CAACE,GAAG,EAAED,aAAa,CAAC,GAClCA,aAAa;EACnB,MAAMK,gBAAgB,GAAGN,KAAK,CAACG,GAAG,GAAGE,IAAI,CAACH,GAAG,CAACF,KAAK,CAACG,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC;;EAE/D;EACA,IAAIC,gBAAgB,GAAGE,gBAAgB,EAAE;IACrC,OAAO;MACHJ,GAAG,EAAED,aAAa;MAClBE,GAAG,EAAE;IACT,CAAC;EACL;EAEA,OAAO;IACHD,GAAG,EAAEE,gBAAgB;IACrBD,GAAG,EAAEG;EACT,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const getScrollIndex = variables => {
|
|
2
|
+
const {
|
|
3
|
+
value,
|
|
4
|
+
numberOfItems,
|
|
5
|
+
padWithNItems,
|
|
6
|
+
disableInfiniteScroll
|
|
7
|
+
} = variables;
|
|
8
|
+
return (value + numberOfItems) % (numberOfItems * 3) + (disableInfiniteScroll ? padWithNItems : 0) - (padWithNItems - 1);
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=getScrollIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getScrollIndex","variables","value","numberOfItems","padWithNItems","disableInfiniteScroll"],"sources":["getScrollIndex.ts"],"sourcesContent":["export const getScrollIndex = (variables: {\n value: number;\n numberOfItems: number;\n padWithNItems: number;\n disableInfiniteScroll?: boolean;\n}) => {\n const { value, numberOfItems, padWithNItems, disableInfiniteScroll } =\n variables;\n\n return (\n ((value + numberOfItems) % (numberOfItems * 3)) +\n (disableInfiniteScroll ? padWithNItems : 0) -\n (padWithNItems - 1)\n );\n};\n"],"mappings":"AAAA,OAAO,MAAMA,cAAc,GAAIC,SAK9B,IAAK;EACF,MAAM;IAAEC,KAAK;IAAEC,aAAa;IAAEC,aAAa;IAAEC;EAAsB,CAAC,GAChEJ,SAAS;EAEb,OACK,CAACC,KAAK,GAAGC,aAAa,KAAKA,aAAa,GAAG,CAAC,CAAC,IAC7CE,qBAAqB,GAAGD,aAAa,GAAG,CAAC,CAAC,IAC1CA,aAAa,GAAG,CAAC,CAAC;AAE3B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["padWithZero","value","String"],"sources":["padWithZero.ts"],"sourcesContent":["export const padWithZero = (value: number): string => {\n if (value < 10) {\n return \"0\" + value;\n } else {\n return String(value);\n }\n};"],"mappings":"AAAA,OAAO,MAAMA,WAAW,GAAIC,KAAa,IAAa;EAClD,IAAIA,KAAK,GAAG,EAAE,EAAE;IACZ,OAAO,GAAG,GAAGA,KAAK;EACtB,CAAC,MAAM;IACH,OAAOC,MAAM,CAACD,KAAK,CAAC;EACxB;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { default as TimerPickerModal, type TimerPickerModalProps, type TimerPickerModalRef, } from "./components";
|
|
2
|
+
export { default as TimerPicker, type TimerPickerProps, type TimerPickerRef, } from "./components/TimerPicker";
|
|
3
|
+
export { type CustomTimerPickerModalStyles } from "./components/TimerPickerModal.styles";
|
|
4
|
+
export { type CustomTimerPickerStyles } from "./components/TimerPicker/TimerPicker.styles";
|
package/package.json
CHANGED
|
@@ -6,17 +6,17 @@
|
|
|
6
6
|
"url": "https://github.com/troberts-28"
|
|
7
7
|
},
|
|
8
8
|
"license": "MIT",
|
|
9
|
-
"version": "1.2.
|
|
10
|
-
"main": "dist/index.js",
|
|
11
|
-
"types": "dist/index.d.ts",
|
|
9
|
+
"version": "1.2.9",
|
|
10
|
+
"main": "dist/commonjs/index.js",
|
|
11
|
+
"types": "dist/typescript/src/index.d.ts",
|
|
12
12
|
"scripts": {
|
|
13
13
|
"test": "jest --forceExit --silent",
|
|
14
|
-
"build": "
|
|
15
|
-
"build:dev": "tsc --noEmit",
|
|
14
|
+
"build": "bob build",
|
|
16
15
|
"clean": "rm yarn.lock && rm -rf ./node_modules && yarn install",
|
|
17
16
|
"start": "cp -Rf src example && cd example && yarn add expo && npx expo install && npx expo start",
|
|
18
17
|
"lint": "eslint --ext .ts,.tsx .",
|
|
19
|
-
"lint:fix": "eslint --ext .ts,.tsx . --fix"
|
|
18
|
+
"lint:fix": "eslint --ext .ts,.tsx . --fix",
|
|
19
|
+
"prepare": "yarn build"
|
|
20
20
|
},
|
|
21
21
|
"homepage": "https://github.com/troberts-28/react-native-timer-picker",
|
|
22
22
|
"bugs": {
|
|
@@ -31,7 +31,11 @@
|
|
|
31
31
|
"registry": "https://registry.npmjs.org/"
|
|
32
32
|
},
|
|
33
33
|
"files": [
|
|
34
|
+
"src",
|
|
34
35
|
"dist",
|
|
36
|
+
"!**/__tests__",
|
|
37
|
+
"!**/__fixtures__",
|
|
38
|
+
"!**/__mocks__",
|
|
35
39
|
"package.json",
|
|
36
40
|
"README.md",
|
|
37
41
|
"LICENSE"
|
|
@@ -90,8 +94,6 @@
|
|
|
90
94
|
],
|
|
91
95
|
"transformIgnorePatterns": []
|
|
92
96
|
},
|
|
93
|
-
"private": false,
|
|
94
|
-
"typings": "./dist/index.d.ts",
|
|
95
97
|
"peerDependencies": {
|
|
96
98
|
"react": ">=16.8.0",
|
|
97
99
|
"react-native": ">=0.59.0"
|
|
@@ -113,10 +115,25 @@
|
|
|
113
115
|
"eslint-plugin-react-hooks": ">=4.6.0",
|
|
114
116
|
"jest": "^29.0.0",
|
|
115
117
|
"metro-react-native-babel-preset": "^0.71.1",
|
|
118
|
+
"react-native-builder-bob": "^0.18.3",
|
|
116
119
|
"react-test-renderer": "^18.0.0",
|
|
117
|
-
"typescript": ">=4.
|
|
120
|
+
"typescript": ">=4.7.4"
|
|
118
121
|
},
|
|
119
|
-
"
|
|
120
|
-
|
|
121
|
-
|
|
122
|
+
"react-native": "src/index.ts",
|
|
123
|
+
"source": "src/index.ts",
|
|
124
|
+
"module": "dist/module/index.js",
|
|
125
|
+
"typings": "./dist/typescript/index.d.ts",
|
|
126
|
+
"react-native-builder-bob": {
|
|
127
|
+
"source": "src",
|
|
128
|
+
"output": "dist",
|
|
129
|
+
"targets": [
|
|
130
|
+
"commonjs",
|
|
131
|
+
"module",
|
|
132
|
+
"typescript"
|
|
133
|
+
]
|
|
134
|
+
},
|
|
135
|
+
"eslintIgnore": [
|
|
136
|
+
"node_modules/",
|
|
137
|
+
"dist/"
|
|
138
|
+
]
|
|
122
139
|
}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
var react_native_1 = require("react-native");
|
|
5
|
-
exports.styles = react_native_1.StyleSheet.create({
|
|
1
|
+
import { StyleSheet } from "react-native";
|
|
2
|
+
|
|
3
|
+
export const styles = StyleSheet.create({
|
|
6
4
|
container: {
|
|
7
5
|
position: "absolute",
|
|
8
6
|
top: 0,
|
|
@@ -25,4 +23,4 @@ exports.styles = react_native_1.StyleSheet.create({
|
|
|
25
23
|
alignItems: "center",
|
|
26
24
|
zIndex: 1,
|
|
27
25
|
},
|
|
28
|
-
});
|
|
26
|
+
});
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import React, { useCallback, useEffect, useRef } from "react";
|
|
3
|
+
import {
|
|
4
|
+
Animated,
|
|
5
|
+
Easing,
|
|
6
|
+
Modal as ReactNativeModal,
|
|
7
|
+
TouchableWithoutFeedback,
|
|
8
|
+
useWindowDimensions,
|
|
9
|
+
} from "react-native";
|
|
10
|
+
|
|
11
|
+
import { styles } from "./Modal.styles";
|
|
12
|
+
|
|
13
|
+
interface ModalProps {
|
|
14
|
+
children?: React.ReactElement;
|
|
15
|
+
onOverlayPress?: () => void;
|
|
16
|
+
onHide?: () => void;
|
|
17
|
+
isVisible?: boolean;
|
|
18
|
+
animationDuration?: number;
|
|
19
|
+
overlayOpacity?: number;
|
|
20
|
+
modalProps?: any;
|
|
21
|
+
contentStyle?: any;
|
|
22
|
+
overlayStyle?: any;
|
|
23
|
+
testID?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export const Modal = ({
|
|
27
|
+
children,
|
|
28
|
+
onOverlayPress,
|
|
29
|
+
onHide,
|
|
30
|
+
isVisible = false,
|
|
31
|
+
animationDuration = 300,
|
|
32
|
+
overlayOpacity = 0.4,
|
|
33
|
+
modalProps,
|
|
34
|
+
contentStyle,
|
|
35
|
+
overlayStyle,
|
|
36
|
+
testID,
|
|
37
|
+
}: ModalProps): React.ReactElement => {
|
|
38
|
+
const { width: screenWidth, height: screenHeight } = useWindowDimensions();
|
|
39
|
+
|
|
40
|
+
const isMounted = useRef(false);
|
|
41
|
+
const animatedOpacity = useRef(new Animated.Value(0));
|
|
42
|
+
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
isMounted.current = true;
|
|
45
|
+
if (isVisible) {
|
|
46
|
+
show();
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return () => {
|
|
50
|
+
isMounted.current = false;
|
|
51
|
+
};
|
|
52
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
53
|
+
}, []);
|
|
54
|
+
|
|
55
|
+
const backdropAnimatedStyle = {
|
|
56
|
+
opacity: animatedOpacity.current.interpolate({
|
|
57
|
+
inputRange: [0, 1],
|
|
58
|
+
outputRange: [0, overlayOpacity],
|
|
59
|
+
}),
|
|
60
|
+
};
|
|
61
|
+
const contentAnimatedStyle = {
|
|
62
|
+
transform: [
|
|
63
|
+
{
|
|
64
|
+
translateY: animatedOpacity.current.interpolate({
|
|
65
|
+
inputRange: [0, 1],
|
|
66
|
+
outputRange: [screenHeight, 0],
|
|
67
|
+
extrapolate: "clamp",
|
|
68
|
+
}),
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const show = useCallback(() => {
|
|
74
|
+
Animated.timing(animatedOpacity.current, {
|
|
75
|
+
easing: Easing.inOut(Easing.quad),
|
|
76
|
+
// Using native driver in the modal makes the content flash
|
|
77
|
+
useNativeDriver: true,
|
|
78
|
+
duration: animationDuration,
|
|
79
|
+
toValue: 1,
|
|
80
|
+
}).start();
|
|
81
|
+
}, [animationDuration]);
|
|
82
|
+
|
|
83
|
+
const hide = useCallback(() => {
|
|
84
|
+
Animated.timing(animatedOpacity.current, {
|
|
85
|
+
easing: Easing.inOut(Easing.quad),
|
|
86
|
+
// Using native driver in the modal makes the content flash
|
|
87
|
+
useNativeDriver: true,
|
|
88
|
+
duration: animationDuration,
|
|
89
|
+
toValue: 0,
|
|
90
|
+
}).start(() => {
|
|
91
|
+
if (isMounted.current) {
|
|
92
|
+
onHide?.();
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}, [animationDuration, onHide]);
|
|
96
|
+
|
|
97
|
+
useEffect(() => {
|
|
98
|
+
if (isVisible) {
|
|
99
|
+
show();
|
|
100
|
+
} else {
|
|
101
|
+
hide();
|
|
102
|
+
}
|
|
103
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
104
|
+
}, [isVisible]);
|
|
105
|
+
|
|
106
|
+
return (
|
|
107
|
+
<ReactNativeModal
|
|
108
|
+
transparent
|
|
109
|
+
animationType="fade"
|
|
110
|
+
visible={isVisible}
|
|
111
|
+
{...modalProps}
|
|
112
|
+
testID={testID ?? "modal"}>
|
|
113
|
+
<TouchableWithoutFeedback
|
|
114
|
+
onPress={onOverlayPress}
|
|
115
|
+
testID="modal-backdrop">
|
|
116
|
+
<Animated.View
|
|
117
|
+
style={[
|
|
118
|
+
styles.backdrop,
|
|
119
|
+
backdropAnimatedStyle,
|
|
120
|
+
{ width: screenWidth, height: screenHeight },
|
|
121
|
+
overlayStyle,
|
|
122
|
+
]}
|
|
123
|
+
/>
|
|
124
|
+
</TouchableWithoutFeedback>
|
|
125
|
+
<Animated.View
|
|
126
|
+
style={[styles.content, contentAnimatedStyle, contentStyle]}
|
|
127
|
+
pointerEvents="box-none">
|
|
128
|
+
{children}
|
|
129
|
+
</Animated.View>
|
|
130
|
+
</ReactNativeModal>
|
|
131
|
+
);
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
export default React.memo(Modal);
|