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.
Files changed (110) hide show
  1. package/dist/commonjs/components/Modal/Modal.styles.js +32 -0
  2. package/dist/commonjs/components/Modal/Modal.styles.js.map +1 -0
  3. package/dist/commonjs/components/Modal/index.js +108 -0
  4. package/dist/commonjs/components/Modal/index.js.map +1 -0
  5. package/dist/commonjs/components/TimerPicker/DurationScroll.js +210 -0
  6. package/dist/commonjs/components/TimerPicker/DurationScroll.js.map +1 -0
  7. package/dist/commonjs/components/TimerPicker/TimerPicker.styles.js +67 -0
  8. package/dist/commonjs/components/TimerPicker/TimerPicker.styles.js.map +1 -0
  9. package/dist/commonjs/components/TimerPicker/index.js +130 -0
  10. package/dist/commonjs/components/TimerPicker/index.js.map +1 -0
  11. package/dist/commonjs/components/TimerPickerModal.styles.js +69 -0
  12. package/dist/commonjs/components/TimerPickerModal.styles.js.map +1 -0
  13. package/dist/commonjs/components/index.js +156 -0
  14. package/dist/commonjs/components/index.js.map +1 -0
  15. package/dist/commonjs/index.js +21 -0
  16. package/dist/commonjs/index.js.map +1 -0
  17. package/dist/commonjs/tests/DurationScroll.test.js +56 -0
  18. package/dist/commonjs/tests/DurationScroll.test.js.map +1 -0
  19. package/dist/commonjs/tests/Modal.test.js +40 -0
  20. package/dist/commonjs/tests/Modal.test.js.map +1 -0
  21. package/dist/commonjs/tests/TimerPicker.test.js +37 -0
  22. package/dist/commonjs/tests/TimerPicker.test.js.map +1 -0
  23. package/dist/commonjs/tests/TimerPickerModal.test.js +73 -0
  24. package/dist/commonjs/tests/TimerPickerModal.test.js.map +1 -0
  25. package/dist/commonjs/utils/colorToRgba.js +51 -0
  26. package/dist/commonjs/utils/colorToRgba.js.map +1 -0
  27. package/dist/commonjs/utils/generateNumbers.js +32 -0
  28. package/dist/commonjs/utils/generateNumbers.js.map +1 -0
  29. package/dist/commonjs/utils/getAdjustedLimit.js +32 -0
  30. package/dist/commonjs/utils/getAdjustedLimit.js.map +1 -0
  31. package/dist/commonjs/utils/getScrollIndex.js +17 -0
  32. package/dist/commonjs/utils/getScrollIndex.js.map +1 -0
  33. package/dist/commonjs/utils/padWithZero.js +15 -0
  34. package/dist/commonjs/utils/padWithZero.js.map +1 -0
  35. package/dist/module/components/Modal/Modal.styles.js +26 -0
  36. package/dist/module/components/Modal/Modal.styles.js.map +1 -0
  37. package/dist/module/components/Modal/index.js +100 -0
  38. package/dist/module/components/Modal/index.js.map +1 -0
  39. package/dist/module/components/TimerPicker/DurationScroll.js +202 -0
  40. package/dist/module/components/TimerPicker/DurationScroll.js.map +1 -0
  41. package/dist/module/components/TimerPicker/TimerPicker.styles.js +59 -0
  42. package/dist/module/components/TimerPicker/TimerPicker.styles.js.map +1 -0
  43. package/dist/module/components/TimerPicker/index.js +121 -0
  44. package/dist/module/components/TimerPicker/index.js.map +1 -0
  45. package/dist/module/components/TimerPickerModal.styles.js +61 -0
  46. package/dist/module/components/TimerPickerModal.styles.js.map +1 -0
  47. package/dist/module/components/index.js +147 -0
  48. package/dist/module/components/index.js.map +1 -0
  49. package/dist/module/index.js +3 -0
  50. package/dist/module/index.js.map +1 -0
  51. package/dist/module/tests/DurationScroll.test.js +53 -0
  52. package/dist/module/tests/DurationScroll.test.js.map +1 -0
  53. package/dist/module/tests/Modal.test.js +37 -0
  54. package/dist/module/tests/Modal.test.js.map +1 -0
  55. package/dist/module/tests/TimerPicker.test.js +34 -0
  56. package/dist/module/tests/TimerPicker.test.js.map +1 -0
  57. package/dist/module/tests/TimerPickerModal.test.js +70 -0
  58. package/dist/module/tests/TimerPickerModal.test.js.map +1 -0
  59. package/dist/module/utils/colorToRgba.js +44 -0
  60. package/dist/module/utils/colorToRgba.js.map +1 -0
  61. package/dist/module/utils/generateNumbers.js +25 -0
  62. package/dist/module/utils/generateNumbers.js.map +1 -0
  63. package/dist/module/utils/getAdjustedLimit.js +25 -0
  64. package/dist/module/utils/getAdjustedLimit.js.map +1 -0
  65. package/dist/module/utils/getScrollIndex.js +10 -0
  66. package/dist/module/utils/getScrollIndex.js.map +1 -0
  67. package/dist/module/utils/padWithZero.js +8 -0
  68. package/dist/module/utils/padWithZero.js.map +1 -0
  69. package/dist/typescript/index.d.ts +4 -0
  70. package/dist/{utils → typescript/utils}/colorToRgba.d.ts +1 -1
  71. package/dist/{utils → typescript/utils}/getScrollIndex.d.ts +1 -1
  72. package/package.json +29 -12
  73. package/{dist/components/Modal/Modal.styles.js → src/components/Modal/Modal.styles.ts} +4 -6
  74. package/src/components/Modal/index.tsx +134 -0
  75. package/src/components/TimerPicker/DurationScroll.tsx +337 -0
  76. package/src/components/TimerPicker/TimerPicker.styles.ts +87 -0
  77. package/src/components/TimerPicker/index.tsx +216 -0
  78. package/src/components/TimerPickerModal.styles.ts +87 -0
  79. package/src/components/index.tsx +243 -0
  80. package/src/index.ts +14 -0
  81. package/src/tests/DurationScroll.test.tsx +57 -0
  82. package/src/tests/Modal.test.tsx +34 -0
  83. package/src/tests/TimerPicker.test.tsx +27 -0
  84. package/src/tests/TimerPickerModal.test.tsx +70 -0
  85. package/{dist/utils/colorToRgba.js → src/utils/colorToRgba.ts} +18 -17
  86. package/src/utils/generateNumbers.ts +34 -0
  87. package/{dist/utils/getAdjustedLimit.js → src/utils/getAdjustedLimit.ts} +14 -7
  88. package/src/utils/getScrollIndex.ts +15 -0
  89. package/src/utils/padWithZero.ts +7 -0
  90. package/dist/components/Modal/index.js +0 -109
  91. package/dist/components/TimerPicker/DurationScroll.js +0 -211
  92. package/dist/components/TimerPicker/TimerPicker.styles.js +0 -41
  93. package/dist/components/TimerPicker/index.js +0 -81
  94. package/dist/components/TimerPickerModal.styles.js +0 -37
  95. package/dist/components/index.js +0 -118
  96. package/dist/index.d.ts +0 -4
  97. package/dist/index.js +0 -10
  98. package/dist/utils/generateNumbers.js +0 -30
  99. package/dist/utils/getScrollIndex.js +0 -10
  100. package/dist/utils/padWithZero.js +0 -12
  101. /package/dist/{components → typescript/components}/Modal/Modal.styles.d.ts +0 -0
  102. /package/dist/{components → typescript/components}/Modal/index.d.ts +0 -0
  103. /package/dist/{components → typescript/components}/TimerPicker/DurationScroll.d.ts +0 -0
  104. /package/dist/{components → typescript/components}/TimerPicker/TimerPicker.styles.d.ts +0 -0
  105. /package/dist/{components → typescript/components}/TimerPicker/index.d.ts +0 -0
  106. /package/dist/{components → typescript/components}/TimerPickerModal.styles.d.ts +0 -0
  107. /package/dist/{components → typescript/components}/index.d.ts +0 -0
  108. /package/dist/{utils → typescript/utils}/generateNumbers.d.ts +0 -0
  109. /package/dist/{utils → typescript/utils}/getAdjustedLimit.d.ts +0 -0
  110. /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,8 @@
1
+ export const padWithZero = value => {
2
+ if (value < 10) {
3
+ return "0" + value;
4
+ } else {
5
+ return String(value);
6
+ }
7
+ };
8
+ //# sourceMappingURL=padWithZero.js.map
@@ -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";
@@ -1,4 +1,4 @@
1
1
  export declare const colorToRgba: (variables: {
2
2
  color: string;
3
- opacity?: number | undefined;
3
+ opacity?: number;
4
4
  }) => string;
@@ -2,5 +2,5 @@ export declare const getScrollIndex: (variables: {
2
2
  value: number;
3
3
  numberOfItems: number;
4
4
  padWithNItems: number;
5
- disableInfiniteScroll?: boolean | undefined;
5
+ disableInfiniteScroll?: boolean;
6
6
  }) => number;
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.7",
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": "tsc",
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.9.4"
120
+ "typescript": ">=4.7.4"
118
121
  },
119
- "dependencies": {
120
- "react": "18.2.0"
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
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.styles = void 0;
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);