react-native-timer-picker 2.1.0 → 2.2.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.
Files changed (101) hide show
  1. package/README.md +227 -152
  2. package/dist/commonjs/components/DurationScroll/DurationScroll.js +417 -0
  3. package/dist/commonjs/components/DurationScroll/DurationScroll.js.map +1 -0
  4. package/dist/commonjs/components/DurationScroll/index.js +20 -392
  5. package/dist/commonjs/components/DurationScroll/index.js.map +1 -1
  6. package/dist/commonjs/components/DurationScroll/types.js.map +1 -1
  7. package/dist/commonjs/components/Modal/Modal.js +107 -0
  8. package/dist/commonjs/components/Modal/Modal.js.map +1 -0
  9. package/dist/commonjs/components/Modal/index.js +20 -101
  10. package/dist/commonjs/components/Modal/index.js.map +1 -1
  11. package/dist/commonjs/components/TimerPicker/TimerPicker.js +225 -0
  12. package/dist/commonjs/components/TimerPicker/TimerPicker.js.map +1 -0
  13. package/dist/commonjs/components/TimerPicker/index.js +29 -166
  14. package/dist/commonjs/components/TimerPicker/index.js.map +1 -1
  15. package/dist/commonjs/components/TimerPicker/styles.js +1 -1
  16. package/dist/commonjs/components/TimerPicker/styles.js.map +1 -1
  17. package/dist/commonjs/components/TimerPicker/types.js.map +1 -1
  18. package/dist/commonjs/components/TimerPickerModal/TimerPickerModal.js +143 -0
  19. package/dist/commonjs/components/TimerPickerModal/TimerPickerModal.js.map +1 -0
  20. package/dist/commonjs/components/TimerPickerModal/index.js +30 -131
  21. package/dist/commonjs/components/TimerPickerModal/index.js.map +1 -1
  22. package/dist/commonjs/components/TimerPickerModal/types.js.map +1 -1
  23. package/dist/commonjs/index.js +9 -13
  24. package/dist/commonjs/index.js.map +1 -1
  25. package/dist/commonjs/tests/TimerPicker.test.js +4 -1
  26. package/dist/commonjs/tests/TimerPicker.test.js.map +1 -1
  27. package/dist/commonjs/utils/colorToRgba.js +35 -4
  28. package/dist/commonjs/utils/colorToRgba.js.map +1 -1
  29. package/dist/commonjs/utils/generateNumbers.js +67 -0
  30. package/dist/commonjs/utils/generateNumbers.js.map +1 -1
  31. package/dist/commonjs/utils/getAdjustedLimit.js +25 -0
  32. package/dist/commonjs/utils/getAdjustedLimit.js.map +1 -1
  33. package/dist/commonjs/utils/getDurationAndIndexFromScrollOffset.js +38 -0
  34. package/dist/commonjs/utils/getDurationAndIndexFromScrollOffset.js.map +1 -1
  35. package/dist/commonjs/utils/getInitialScrollIndex.js +38 -0
  36. package/dist/commonjs/utils/getInitialScrollIndex.js.map +1 -1
  37. package/dist/commonjs/utils/getSafeInitialValue.js +28 -0
  38. package/dist/commonjs/utils/getSafeInitialValue.js.map +1 -1
  39. package/dist/commonjs/utils/padNumber.js +25 -0
  40. package/dist/commonjs/utils/padNumber.js.map +1 -1
  41. package/dist/module/components/DurationScroll/DurationScroll.js +410 -0
  42. package/dist/module/components/DurationScroll/DurationScroll.js.map +1 -0
  43. package/dist/module/components/DurationScroll/index.js +2 -390
  44. package/dist/module/components/DurationScroll/index.js.map +1 -1
  45. package/dist/module/components/DurationScroll/types.js.map +1 -1
  46. package/dist/module/components/Modal/Modal.js +99 -0
  47. package/dist/module/components/Modal/Modal.js.map +1 -0
  48. package/dist/module/components/Modal/index.js +2 -98
  49. package/dist/module/components/Modal/index.js.map +1 -1
  50. package/dist/module/components/TimerPicker/TimerPicker.js +217 -0
  51. package/dist/module/components/TimerPicker/TimerPicker.js.map +1 -0
  52. package/dist/module/components/TimerPicker/index.js +3 -166
  53. package/dist/module/components/TimerPicker/index.js.map +1 -1
  54. package/dist/module/components/TimerPicker/styles.js +1 -1
  55. package/dist/module/components/TimerPicker/styles.js.map +1 -1
  56. package/dist/module/components/TimerPicker/types.js.map +1 -1
  57. package/dist/module/components/TimerPickerModal/TimerPickerModal.js +135 -0
  58. package/dist/module/components/TimerPickerModal/TimerPickerModal.js.map +1 -0
  59. package/dist/module/components/TimerPickerModal/index.js +3 -130
  60. package/dist/module/components/TimerPickerModal/index.js.map +1 -1
  61. package/dist/module/components/TimerPickerModal/types.js.map +1 -1
  62. package/dist/module/index.js +2 -6
  63. package/dist/module/index.js.map +1 -1
  64. package/dist/module/tests/TimerPicker.test.js +4 -1
  65. package/dist/module/tests/TimerPicker.test.js.map +1 -1
  66. package/dist/module/utils/colorToRgba.js +35 -4
  67. package/dist/module/utils/colorToRgba.js.map +1 -1
  68. package/dist/module/utils/generateNumbers.js +68 -0
  69. package/dist/module/utils/generateNumbers.js.map +1 -1
  70. package/dist/module/utils/getAdjustedLimit.js +25 -0
  71. package/dist/module/utils/getAdjustedLimit.js.map +1 -1
  72. package/dist/module/utils/getDurationAndIndexFromScrollOffset.js +38 -0
  73. package/dist/module/utils/getDurationAndIndexFromScrollOffset.js.map +1 -1
  74. package/dist/module/utils/getInitialScrollIndex.js +38 -0
  75. package/dist/module/utils/getInitialScrollIndex.js.map +1 -1
  76. package/dist/module/utils/getSafeInitialValue.js +28 -0
  77. package/dist/module/utils/getSafeInitialValue.js.map +1 -1
  78. package/dist/module/utils/padNumber.js +25 -0
  79. package/dist/module/utils/padNumber.js.map +1 -1
  80. package/dist/typescript/components/DurationScroll/DurationScroll.d.ts +4 -0
  81. package/dist/typescript/components/DurationScroll/index.d.ts +2 -4
  82. package/dist/typescript/components/DurationScroll/types.d.ts +13 -9
  83. package/dist/typescript/components/Modal/Modal.d.ts +5 -0
  84. package/dist/typescript/components/Modal/index.d.ts +2 -5
  85. package/dist/typescript/components/TimerPicker/TimerPicker.d.ts +4 -0
  86. package/dist/typescript/components/TimerPicker/index.d.ts +3 -4
  87. package/dist/typescript/components/TimerPicker/styles.d.ts +1169 -771
  88. package/dist/typescript/components/TimerPicker/types.d.ts +26 -10
  89. package/dist/typescript/components/TimerPickerModal/TimerPickerModal.d.ts +4 -0
  90. package/dist/typescript/components/TimerPickerModal/index.d.ts +3 -4
  91. package/dist/typescript/components/TimerPickerModal/styles.d.ts +722 -474
  92. package/dist/typescript/components/TimerPickerModal/types.d.ts +8 -5
  93. package/dist/typescript/index.d.ts +2 -6
  94. package/dist/typescript/utils/colorToRgba.d.ts +34 -0
  95. package/dist/typescript/utils/generateNumbers.d.ts +66 -0
  96. package/dist/typescript/utils/getAdjustedLimit.d.ts +27 -2
  97. package/dist/typescript/utils/getDurationAndIndexFromScrollOffset.d.ts +38 -0
  98. package/dist/typescript/utils/getInitialScrollIndex.d.ts +38 -0
  99. package/dist/typescript/utils/getSafeInitialValue.d.ts +29 -0
  100. package/dist/typescript/utils/padNumber.d.ts +25 -0
  101. package/package.json +10 -27
@@ -1 +1 @@
1
- {"version":3,"names":["React","forwardRef","useCallback","useEffect","useImperativeHandle","useRef","useState","View","Text","TouchableOpacity","getSafeInitialValue","Modal","TimerPicker","generateStyles","TimerPickerModal","props","ref","buttonContainerProps","buttonTouchableOpacityProps","cancelButtonText","closeOnOverlayPress","confirmButtonText","containerProps","contentContainerProps","hideCancelButton","initialValue","modalProps","modalTitle","modalTitleProps","onCancel","onConfirm","onDurationChange","setIsVisible","styles","customStyles","visible","otherProps","hasModalTitle","Boolean","timerPickerRef","safeInitialValue","hours","minutes","seconds","selectedDuration","setSelectedDuration","confirmedDuration","setConfirmedDuration","reset","options","_timerPickerRef$curre","current","hideModalHandler","confirmHandler","_timerPickerRef$curre2","_latestDuration$hours","_latestDuration$minut","_latestDuration$secon","latestDuration","newDuration","cancelHandler","durationChangeHandler","duration","_timerPickerRef$curre4","_timerPickerRef$curre5","_timerPickerRef$curre6","setValue","value","_timerPickerRef$curre3","createElement","_extends","isVisible","onOverlayPress","undefined","testID","style","container","contentContainer","aggressivelyGetLatestDuration","timerPickerStyles","buttonContainer","onPress","button","cancelButton","confirmButton","memo"],"sources":["index.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\n\nimport { View, Text, TouchableOpacity } from \"react-native\";\n\nimport { getSafeInitialValue } from \"../../utils/getSafeInitialValue\";\nimport Modal from \"../Modal\";\nimport TimerPicker from \"../TimerPicker\";\nimport type { TimerPickerRef } from \"../TimerPicker/types\";\n\nimport { generateStyles } from \"./styles\";\nimport type { TimerPickerModalRef, TimerPickerModalProps } from \"./types\";\n\nconst TimerPickerModal = forwardRef<TimerPickerModalRef, TimerPickerModalProps>(\n (props, ref) => {\n const {\n buttonContainerProps,\n buttonTouchableOpacityProps,\n cancelButtonText = \"Cancel\",\n closeOnOverlayPress,\n confirmButtonText = \"Confirm\",\n containerProps,\n contentContainerProps,\n hideCancelButton = false,\n initialValue,\n modalProps,\n modalTitle,\n modalTitleProps,\n onCancel,\n onConfirm,\n onDurationChange,\n setIsVisible,\n styles: customStyles,\n visible,\n ...otherProps\n } = props;\n\n const styles = generateStyles(customStyles, {\n hasModalTitle: Boolean(modalTitle),\n });\n\n const timerPickerRef = useRef<TimerPickerRef>(null);\n\n const safeInitialValue = getSafeInitialValue({\n hours: initialValue?.hours,\n minutes: initialValue?.minutes,\n seconds: initialValue?.seconds,\n });\n\n const [selectedDuration, setSelectedDuration] =\n useState(safeInitialValue);\n const [confirmedDuration, setConfirmedDuration] =\n useState(safeInitialValue);\n\n const reset = (options?: { animated?: boolean }) => {\n setSelectedDuration(safeInitialValue);\n setConfirmedDuration(safeInitialValue);\n timerPickerRef.current?.reset(options);\n };\n\n // reset state if the initial value changes\n useEffect(() => {\n reset();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n safeInitialValue.hours,\n safeInitialValue.minutes,\n safeInitialValue.seconds,\n ]);\n\n const hideModalHandler = () => {\n setSelectedDuration({\n hours: confirmedDuration.hours,\n minutes: confirmedDuration.minutes,\n seconds: confirmedDuration.seconds,\n });\n setIsVisible(false);\n };\n\n const confirmHandler = () => {\n const latestDuration = timerPickerRef.current?.latestDuration;\n\n const newDuration = {\n hours: latestDuration?.hours?.current ?? selectedDuration.hours,\n minutes:\n latestDuration?.minutes?.current ??\n selectedDuration.minutes,\n seconds:\n latestDuration?.seconds?.current ??\n selectedDuration.seconds,\n };\n setConfirmedDuration(newDuration);\n onConfirm(newDuration);\n };\n\n const cancelHandler = () => {\n setIsVisible(false);\n setSelectedDuration(confirmedDuration);\n onCancel?.();\n };\n\n // wrapped in useCallback to avoid unnecessary re-renders of TimerPicker\n const durationChangeHandler = useCallback(\n (duration: { hours: number; minutes: number; seconds: number }) => {\n setSelectedDuration(duration);\n onDurationChange?.(duration);\n },\n [onDurationChange]\n );\n\n useImperativeHandle(ref, () => ({\n reset,\n setValue: (value, options) => {\n setSelectedDuration(value);\n setConfirmedDuration(value);\n timerPickerRef.current?.setValue(value, options);\n },\n latestDuration: {\n hours: timerPickerRef.current?.latestDuration?.hours,\n minutes: timerPickerRef.current?.latestDuration?.minutes,\n seconds: timerPickerRef.current?.latestDuration?.seconds,\n },\n }));\n\n return (\n <Modal\n isVisible={visible}\n onOverlayPress={\n closeOnOverlayPress ? hideModalHandler : undefined\n }\n {...modalProps}\n testID=\"timer-picker-modal\">\n <View {...containerProps} style={styles.container}>\n <View\n {...contentContainerProps}\n style={styles.contentContainer}>\n {modalTitle ? (\n <Text\n {...modalTitleProps}\n style={styles.modalTitle}>\n {modalTitle}\n </Text>\n ) : null}\n <TimerPicker\n ref={timerPickerRef}\n initialValue={confirmedDuration}\n {...otherProps}\n aggressivelyGetLatestDuration\n onDurationChange={durationChangeHandler}\n styles={styles.timerPickerStyles}\n />\n <View\n {...buttonContainerProps}\n style={styles.buttonContainer}>\n {!hideCancelButton ? (\n <TouchableOpacity\n {...buttonTouchableOpacityProps}\n onPress={cancelHandler}>\n <Text\n style={[\n styles.button,\n styles.cancelButton,\n ]}>\n {cancelButtonText}\n </Text>\n </TouchableOpacity>\n ) : null}\n <TouchableOpacity\n {...buttonTouchableOpacityProps}\n onPress={confirmHandler}>\n <Text\n style={[\n styles.button,\n styles.confirmButton,\n ]}>\n {confirmButtonText}\n </Text>\n </TouchableOpacity>\n </View>\n </View>\n </View>\n </Modal>\n );\n }\n);\n\nexport default React.memo(TimerPickerModal);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["default"],"sources":["index.ts"],"sourcesContent":["export { default } from \"./TimerPickerModal\";\n\nexport * from \"./types\";\n\nexport * from \"./styles\";\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,oBAAoB;AAE5C,cAAc,SAAS;AAEvB,cAAc,UAAU","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type { MutableRefObject } from \"react\";\n\nimport type { View, TouchableOpacity, Text } from \"react-native\";\n\nimport type Modal from \"../Modal\";\nimport type { TimerPickerProps } from \"../TimerPicker/types\";\n\nimport type { CustomTimerPickerModalStyles } from \"./styles\";\n\nexport interface TimerPickerModalRef {\n latestDuration: {\n hours: MutableRefObject<number> | undefined;\n minutes: MutableRefObject<number> | undefined;\n seconds: MutableRefObject<number> | undefined;\n };\n reset: (options?: { animated?: boolean }) => void;\n setValue: (\n value: {\n hours: number;\n minutes: number;\n seconds: number;\n },\n options?: { animated?: boolean }\n ) => void;\n}\n\nexport interface TimerPickerModalProps extends TimerPickerProps {\n buttonContainerProps?: React.ComponentProps<typeof View>;\n buttonTouchableOpacityProps?: React.ComponentProps<typeof TouchableOpacity>;\n cancelButtonText?: string;\n closeOnOverlayPress?: boolean;\n confirmButtonText?: string;\n containerProps?: React.ComponentProps<typeof View>;\n contentContainerProps?: React.ComponentProps<typeof View>;\n hideCancelButton?: boolean;\n modalProps?: React.ComponentProps<typeof Modal>;\n modalTitle?: string;\n modalTitleProps?: React.ComponentProps<typeof Text>;\n onCancel?: () => void;\n onConfirm: ({\n hours,\n minutes,\n seconds,\n }: {\n hours: number;\n minutes: number;\n seconds: number;\n }) => void;\n setIsVisible: (isVisible: boolean) => void;\n styles?: CustomTimerPickerModalStyles;\n visible: boolean;\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type { RefObject } from \"react\";\n\nimport type { View, TouchableOpacity, Text } from \"react-native\";\n\nimport type Modal from \"../Modal\";\nimport type { TimerPickerProps } from \"../TimerPicker/types\";\n\nimport type { CustomTimerPickerModalStyles } from \"./styles\";\n\nexport interface TimerPickerModalRef {\n latestDuration: {\n days: RefObject<number> | undefined;\n hours: RefObject<number> | undefined;\n minutes: RefObject<number> | undefined;\n seconds: RefObject<number> | undefined;\n };\n reset: (options?: { animated?: boolean }) => void;\n setValue: (\n value: {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n },\n options?: { animated?: boolean }\n ) => void;\n}\n\nexport interface TimerPickerModalProps extends TimerPickerProps {\n buttonContainerProps?: React.ComponentProps<typeof View>;\n buttonTouchableOpacityProps?: React.ComponentProps<typeof TouchableOpacity>;\n cancelButtonText?: string;\n closeOnOverlayPress?: boolean;\n confirmButtonText?: string;\n containerProps?: React.ComponentProps<typeof View>;\n contentContainerProps?: React.ComponentProps<typeof View>;\n hideCancelButton?: boolean;\n modalProps?: React.ComponentProps<typeof Modal>;\n modalTitle?: string;\n modalTitleProps?: React.ComponentProps<typeof Text>;\n onCancel?: () => void;\n onConfirm: ({\n days,\n hours,\n minutes,\n seconds,\n }: {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n }) => void;\n setIsVisible: (isVisible: boolean) => void;\n styles?: CustomTimerPickerModalStyles;\n visible: boolean;\n}\n"],"mappings":"","ignoreList":[]}
@@ -1,7 +1,3 @@
1
- export { default as TimerPickerModal } from "./components/TimerPickerModal";
2
- export { TimerPickerModalProps, TimerPickerModalRef } from "./components/TimerPickerModal/types";
3
- export { CustomTimerPickerModalStyles } from "./components/TimerPickerModal/styles";
4
- export { default as TimerPicker } from "./components/TimerPicker";
5
- export { TimerPickerProps, TimerPickerRef } from "./components/TimerPicker/types";
6
- export { CustomTimerPickerStyles } from "./components/TimerPicker/styles";
1
+ export { default as TimerPickerModal, TimerPickerModalProps, TimerPickerModalRef, CustomTimerPickerModalStyles } from "./components/TimerPickerModal";
2
+ export { default as TimerPicker, TimerPickerProps, TimerPickerRef, CustomTimerPickerStyles } from "./components/TimerPicker";
7
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["default","TimerPickerModal","TimerPickerModalProps","TimerPickerModalRef","CustomTimerPickerModalStyles","TimerPicker","TimerPickerProps","TimerPickerRef","CustomTimerPickerStyles"],"sources":["index.ts"],"sourcesContent":["export { default as TimerPickerModal } from \"./components/TimerPickerModal\";\nexport {\n TimerPickerModalProps,\n TimerPickerModalRef,\n} from \"./components/TimerPickerModal/types\";\nexport { CustomTimerPickerModalStyles } from \"./components/TimerPickerModal/styles\";\n\nexport { default as TimerPicker } from \"./components/TimerPicker\";\nexport {\n TimerPickerProps,\n TimerPickerRef,\n} from \"./components/TimerPicker/types\";\nexport { CustomTimerPickerStyles } from \"./components/TimerPicker/styles\";\n"],"mappings":"AAAA,SAASA,OAAO,IAAIC,gBAAgB,QAAQ,+BAA+B;AAC3E,SACIC,qBAAqB,EACrBC,mBAAmB,QAChB,qCAAqC;AAC5C,SAASC,4BAA4B,QAAQ,sCAAsC;AAEnF,SAASJ,OAAO,IAAIK,WAAW,QAAQ,0BAA0B;AACjE,SACIC,gBAAgB,EAChBC,cAAc,QACX,gCAAgC;AACvC,SAASC,uBAAuB,QAAQ,iCAAiC","ignoreList":[]}
1
+ {"version":3,"names":["default","TimerPickerModal","TimerPickerModalProps","TimerPickerModalRef","CustomTimerPickerModalStyles","TimerPicker","TimerPickerProps","TimerPickerRef","CustomTimerPickerStyles"],"sources":["index.ts"],"sourcesContent":["export {\n default as TimerPickerModal,\n TimerPickerModalProps,\n TimerPickerModalRef,\n CustomTimerPickerModalStyles,\n} from \"./components/TimerPickerModal\";\n\nexport {\n default as TimerPicker,\n TimerPickerProps,\n TimerPickerRef,\n CustomTimerPickerStyles,\n} from \"./components/TimerPicker\";\n"],"mappings":"AAAA,SACIA,OAAO,IAAIC,gBAAgB,EAC3BC,qBAAqB,EACrBC,mBAAmB,EACnBC,4BAA4B,QACzB,+BAA+B;AAEtC,SACIJ,OAAO,IAAIK,WAAW,EACtBC,gBAAgB,EAChBC,cAAc,EACdC,uBAAuB,QACpB,0BAA0B","ignoreList":[]}
@@ -20,15 +20,18 @@ describe("TimerPicker", () => {
20
20
  const component = getByTestId("timer-picker");
21
21
  expect(component).toBeDefined();
22
22
  });
23
- it("hides minutes and seconds when respective hide props are provided", () => {
23
+ it("hides days, minutes and seconds when respective hide props are provided", () => {
24
24
  const {
25
25
  queryByTestId
26
26
  } = render(/*#__PURE__*/React.createElement(TimerPicker, {
27
+ hideDays: true,
27
28
  hideMinutes: true,
28
29
  hideSeconds: true
29
30
  }));
31
+ const dayPicker = queryByTestId("duration-scroll-day");
30
32
  const minutePicker = queryByTestId("duration-scroll-minute");
31
33
  const secondPicker = queryByTestId("duration-scroll-second");
34
+ expect(dayPicker).toBeNull();
32
35
  expect(minutePicker).toBeNull();
33
36
  expect(secondPicker).toBeNull();
34
37
  });
@@ -1 +1 @@
1
- {"version":3,"names":["React","render","FlatList","TimerPicker","describe","it","getByTestId","createElement","component","expect","toBeDefined","padWithNItems","queryByTestId","hideMinutes","hideSeconds","minutePicker","secondPicker","toBeNull","CustomFlatList","props","_extends","testID","queryAllByTestId","customFlatList","toHaveLength"],"sources":["TimerPicker.test.tsx"],"sourcesContent":["import React from \"react\";\n\nimport { render } from \"@testing-library/react-native\";\nimport { FlatList } from \"react-native\";\n\nimport TimerPicker from \"../components/TimerPicker\";\n\ndescribe(\"TimerPicker\", () => {\n it(\"renders without crashing\", () => {\n const { getByTestId } = render(<TimerPicker />);\n const component = getByTestId(\"timer-picker\");\n expect(component).toBeDefined();\n });\n\n it(\"renders without crashing with negative padWithNItems\", () => {\n const { getByTestId } = render(<TimerPicker padWithNItems={-1} />);\n const component = getByTestId(\"timer-picker\");\n expect(component).toBeDefined();\n });\n\n it(\"hides minutes and seconds when respective hide props are provided\", () => {\n const { queryByTestId } = render(\n <TimerPicker hideMinutes hideSeconds />\n );\n const minutePicker = queryByTestId(\"duration-scroll-minute\");\n const secondPicker = queryByTestId(\"duration-scroll-second\");\n expect(minutePicker).toBeNull();\n expect(secondPicker).toBeNull();\n });\n\n it(\"uses the custom FlatList component when provided\", () => {\n const CustomFlatList = (props) => (\n <FlatList {...props} testID=\"custom-flat-list\" />\n );\n const { queryAllByTestId } = render(\n <TimerPicker FlatList={CustomFlatList} />\n );\n const customFlatList = queryAllByTestId(\"custom-flat-list\");\n expect(customFlatList).toHaveLength(3);\n });\n});\n"],"mappings":";AAAA,OAAOA,KAAK,MAAM,OAAO;AAEzB,SAASC,MAAM,QAAQ,+BAA+B;AACtD,SAASC,QAAQ,QAAQ,cAAc;AAEvC,OAAOC,WAAW,MAAM,2BAA2B;AAEnDC,QAAQ,CAAC,aAAa,EAAE,MAAM;EAC1BC,EAAE,CAAC,0BAA0B,EAAE,MAAM;IACjC,MAAM;MAAEC;IAAY,CAAC,GAAGL,MAAM,cAACD,KAAA,CAAAO,aAAA,CAACJ,WAAW,MAAE,CAAC,CAAC;IAC/C,MAAMK,SAAS,GAAGF,WAAW,CAAC,cAAc,CAAC;IAC7CG,MAAM,CAACD,SAAS,CAAC,CAACE,WAAW,CAAC,CAAC;EACnC,CAAC,CAAC;EAEFL,EAAE,CAAC,sDAAsD,EAAE,MAAM;IAC7D,MAAM;MAAEC;IAAY,CAAC,GAAGL,MAAM,cAACD,KAAA,CAAAO,aAAA,CAACJ,WAAW;MAACQ,aAAa,EAAE,CAAC;IAAE,CAAE,CAAC,CAAC;IAClE,MAAMH,SAAS,GAAGF,WAAW,CAAC,cAAc,CAAC;IAC7CG,MAAM,CAACD,SAAS,CAAC,CAACE,WAAW,CAAC,CAAC;EACnC,CAAC,CAAC;EAEFL,EAAE,CAAC,mEAAmE,EAAE,MAAM;IAC1E,MAAM;MAAEO;IAAc,CAAC,GAAGX,MAAM,cAC5BD,KAAA,CAAAO,aAAA,CAACJ,WAAW;MAACU,WAAW;MAACC,WAAW;IAAA,CAAE,CAC1C,CAAC;IACD,MAAMC,YAAY,GAAGH,aAAa,CAAC,wBAAwB,CAAC;IAC5D,MAAMI,YAAY,GAAGJ,aAAa,CAAC,wBAAwB,CAAC;IAC5DH,MAAM,CAACM,YAAY,CAAC,CAACE,QAAQ,CAAC,CAAC;IAC/BR,MAAM,CAACO,YAAY,CAAC,CAACC,QAAQ,CAAC,CAAC;EACnC,CAAC,CAAC;EAEFZ,EAAE,CAAC,kDAAkD,EAAE,MAAM;IACzD,MAAMa,cAAc,GAAIC,KAAK,iBACzBnB,KAAA,CAAAO,aAAA,CAACL,QAAQ,EAAAkB,QAAA,KAAKD,KAAK;MAAEE,MAAM,EAAC;IAAkB,EAAE,CACnD;IACD,MAAM;MAAEC;IAAiB,CAAC,GAAGrB,MAAM,cAC/BD,KAAA,CAAAO,aAAA,CAACJ,WAAW;MAACD,QAAQ,EAAEgB;IAAe,CAAE,CAC5C,CAAC;IACD,MAAMK,cAAc,GAAGD,gBAAgB,CAAC,kBAAkB,CAAC;IAC3Db,MAAM,CAACc,cAAc,CAAC,CAACC,YAAY,CAAC,CAAC,CAAC;EAC1C,CAAC,CAAC;AACN,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","render","FlatList","TimerPicker","describe","it","getByTestId","createElement","component","expect","toBeDefined","padWithNItems","queryByTestId","hideDays","hideMinutes","hideSeconds","dayPicker","minutePicker","secondPicker","toBeNull","CustomFlatList","props","_extends","testID","queryAllByTestId","customFlatList","toHaveLength"],"sources":["TimerPicker.test.tsx"],"sourcesContent":["import React from \"react\";\n\nimport { render } from \"@testing-library/react-native\";\nimport { FlatList } from \"react-native\";\n\nimport TimerPicker from \"../components/TimerPicker\";\n\ndescribe(\"TimerPicker\", () => {\n it(\"renders without crashing\", () => {\n const { getByTestId } = render(<TimerPicker />);\n const component = getByTestId(\"timer-picker\");\n expect(component).toBeDefined();\n });\n\n it(\"renders without crashing with negative padWithNItems\", () => {\n const { getByTestId } = render(<TimerPicker padWithNItems={-1} />);\n const component = getByTestId(\"timer-picker\");\n expect(component).toBeDefined();\n });\n\n it(\"hides days, minutes and seconds when respective hide props are provided\", () => {\n const { queryByTestId } = render(\n <TimerPicker hideDays hideMinutes hideSeconds />\n );\n const dayPicker = queryByTestId(\"duration-scroll-day\");\n const minutePicker = queryByTestId(\"duration-scroll-minute\");\n const secondPicker = queryByTestId(\"duration-scroll-second\");\n expect(dayPicker).toBeNull();\n expect(minutePicker).toBeNull();\n expect(secondPicker).toBeNull();\n });\n\n it(\"uses the custom FlatList component when provided\", () => {\n const CustomFlatList = (props) => (\n <FlatList {...props} testID=\"custom-flat-list\" />\n );\n const { queryAllByTestId } = render(\n <TimerPicker FlatList={CustomFlatList} />\n );\n const customFlatList = queryAllByTestId(\"custom-flat-list\");\n expect(customFlatList).toHaveLength(3);\n });\n});\n"],"mappings":";AAAA,OAAOA,KAAK,MAAM,OAAO;AAEzB,SAASC,MAAM,QAAQ,+BAA+B;AACtD,SAASC,QAAQ,QAAQ,cAAc;AAEvC,OAAOC,WAAW,MAAM,2BAA2B;AAEnDC,QAAQ,CAAC,aAAa,EAAE,MAAM;EAC1BC,EAAE,CAAC,0BAA0B,EAAE,MAAM;IACjC,MAAM;MAAEC;IAAY,CAAC,GAAGL,MAAM,cAACD,KAAA,CAAAO,aAAA,CAACJ,WAAW,MAAE,CAAC,CAAC;IAC/C,MAAMK,SAAS,GAAGF,WAAW,CAAC,cAAc,CAAC;IAC7CG,MAAM,CAACD,SAAS,CAAC,CAACE,WAAW,CAAC,CAAC;EACnC,CAAC,CAAC;EAEFL,EAAE,CAAC,sDAAsD,EAAE,MAAM;IAC7D,MAAM;MAAEC;IAAY,CAAC,GAAGL,MAAM,cAACD,KAAA,CAAAO,aAAA,CAACJ,WAAW;MAACQ,aAAa,EAAE,CAAC;IAAE,CAAE,CAAC,CAAC;IAClE,MAAMH,SAAS,GAAGF,WAAW,CAAC,cAAc,CAAC;IAC7CG,MAAM,CAACD,SAAS,CAAC,CAACE,WAAW,CAAC,CAAC;EACnC,CAAC,CAAC;EAEFL,EAAE,CAAC,yEAAyE,EAAE,MAAM;IAChF,MAAM;MAAEO;IAAc,CAAC,GAAGX,MAAM,cAC5BD,KAAA,CAAAO,aAAA,CAACJ,WAAW;MAACU,QAAQ;MAACC,WAAW;MAACC,WAAW;IAAA,CAAE,CACnD,CAAC;IACD,MAAMC,SAAS,GAAGJ,aAAa,CAAC,qBAAqB,CAAC;IACtD,MAAMK,YAAY,GAAGL,aAAa,CAAC,wBAAwB,CAAC;IAC5D,MAAMM,YAAY,GAAGN,aAAa,CAAC,wBAAwB,CAAC;IAC5DH,MAAM,CAACO,SAAS,CAAC,CAACG,QAAQ,CAAC,CAAC;IAC5BV,MAAM,CAACQ,YAAY,CAAC,CAACE,QAAQ,CAAC,CAAC;IAC/BV,MAAM,CAACS,YAAY,CAAC,CAACC,QAAQ,CAAC,CAAC;EACnC,CAAC,CAAC;EAEFd,EAAE,CAAC,kDAAkD,EAAE,MAAM;IACzD,MAAMe,cAAc,GAAIC,KAAK,iBACzBrB,KAAA,CAAAO,aAAA,CAACL,QAAQ,EAAAoB,QAAA,KAAKD,KAAK;MAAEE,MAAM,EAAC;IAAkB,EAAE,CACnD;IACD,MAAM;MAAEC;IAAiB,CAAC,GAAGvB,MAAM,cAC/BD,KAAA,CAAAO,aAAA,CAACJ,WAAW;MAACD,QAAQ,EAAEkB;IAAe,CAAE,CAC5C,CAAC;IACD,MAAMK,cAAc,GAAGD,gBAAgB,CAAC,kBAAkB,CAAC;IAC3Df,MAAM,CAACgB,cAAc,CAAC,CAACC,YAAY,CAAC,CAAC,CAAC;EAC1C,CAAC,CAAC;AACN,CAAC,CAAC","ignoreList":[]}
@@ -1,12 +1,43 @@
1
+ /**
2
+ * Converts various color formats to RGBA string representation.
3
+ * This function is specifically required for expo-linear-gradient on iOS to handle transparent colors correctly.
4
+ * It supports named colors, RGB, and hex color formats.
5
+ *
6
+ * @param {Object} variables - The input variables object
7
+ * @param {string} variables.color - The color to convert. Can be:
8
+ * - Named color (e.g., 'transparent', 'black', 'white', 'blue', 'green', 'gray', 'red')
9
+ * - RGB format (e.g., 'rgb(255, 0, 0)')
10
+ * - Hex format (e.g., '#FF0000' or '#F00')
11
+ * @param {number} [variables.opacity=1] - The opacity value between 0 and 1
12
+ *
13
+ * @returns {string} The color in RGBA format (e.g., 'rgba(255, 0, 0, 0.5)')
14
+ *
15
+ * @example
16
+ * // Using named color
17
+ * colorToRgba({ color: 'transparent' })
18
+ * // Returns: 'rgba(0, 0, 0, 0)'
19
+ *
20
+ * @example
21
+ * // Using RGB with custom opacity
22
+ * colorToRgba({ color: 'rgb(255, 0, 0)', opacity: 0.5 })
23
+ * // Returns: 'rgba(255, 0, 0, 0.5)'
24
+ *
25
+ * @example
26
+ * // Using hex color
27
+ * colorToRgba({ color: '#FF0000' })
28
+ * // Returns: 'rgba(255, 0, 0, 1)'
29
+ *
30
+ * @example
31
+ * // Using short hex color
32
+ * colorToRgba({ color: '#F00' })
33
+ * // Returns: 'rgba(255, 0, 0, 1)'
34
+ */
1
35
  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
36
  const {
7
37
  color,
8
38
  opacity = 1
9
39
  } = variables;
40
+
10
41
  // Handle named colors
11
42
  const namedColors = {
12
43
  transparent: "rgba(0, 0, 0, 0)",
@@ -1 +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,OAAO,QAAQO,CAAC,KAAKC,CAAC,KAAKC,CAAC,KAAKnB,OAAO,GAAG;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,OAAO,QAAQJ,CAAC,KAAKC,CAAC,KAAKC,CAAC,KAAKnB,OAAO,GAAG;EAC/C;EAEA,OAAOD,KAAK,CAAC,CAAC;AAClB,CAAC","ignoreList":[]}
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":["/**\n * Converts various color formats to RGBA string representation.\n * This function is specifically required for expo-linear-gradient on iOS to handle transparent colors correctly.\n * It supports named colors, RGB, and hex color formats.\n *\n * @param {Object} variables - The input variables object\n * @param {string} variables.color - The color to convert. Can be:\n * - Named color (e.g., 'transparent', 'black', 'white', 'blue', 'green', 'gray', 'red')\n * - RGB format (e.g., 'rgb(255, 0, 0)')\n * - Hex format (e.g., '#FF0000' or '#F00')\n * @param {number} [variables.opacity=1] - The opacity value between 0 and 1\n *\n * @returns {string} The color in RGBA format (e.g., 'rgba(255, 0, 0, 0.5)')\n *\n * @example\n * // Using named color\n * colorToRgba({ color: 'transparent' })\n * // Returns: 'rgba(0, 0, 0, 0)'\n *\n * @example\n * // Using RGB with custom opacity\n * colorToRgba({ color: 'rgb(255, 0, 0)', opacity: 0.5 })\n * // Returns: 'rgba(255, 0, 0, 0.5)'\n *\n * @example\n * // Using hex color\n * colorToRgba({ color: '#FF0000' })\n * // Returns: 'rgba(255, 0, 0, 1)'\n *\n * @example\n * // Using short hex color\n * colorToRgba({ color: '#F00' })\n * // Returns: 'rgba(255, 0, 0, 1)'\n */\nexport const colorToRgba = (variables: {\n color: string;\n opacity?: number;\n}): string => {\n const { color, opacity = 1 } = variables;\n\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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,WAAW,GAAIC,SAG3B,IAAa;EACV,MAAM;IAAEC,KAAK;IAAEC,OAAO,GAAG;EAAE,CAAC,GAAGF,SAAS;;EAExC;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,OAAO,QAAQO,CAAC,KAAKC,CAAC,KAAKC,CAAC,KAAKnB,OAAO,GAAG;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,OAAO,QAAQJ,CAAC,KAAKC,CAAC,KAAKC,CAAC,KAAKnB,OAAO,GAAG;EAC/C;EAEA,OAAOD,KAAK,CAAC,CAAC;AAClB,CAAC","ignoreList":[]}
@@ -1,4 +1,39 @@
1
1
  import { padNumber } from "./padNumber";
2
+
3
+ /**
4
+ * Generates an array of formatted numbers for a number picker, with support for infinite scroll,
5
+ * padding, and number repetition.
6
+ *
7
+ * @param {number} numberOfItems - Total number of items to generate
8
+ * @param {Object} options - Configuration options for number generation
9
+ * @param {boolean} [options.disableInfiniteScroll] - Whether to disable infinite scroll
10
+ * @param {number} options.interval - The interval between consecutive numbers
11
+ * @param {boolean} [options.padNumbersWithZero] - Whether to pad single-digit numbers with leading zeros
12
+ * @param {number} options.padWithNItems - Number of empty items to pad with
13
+ * @param {number} options.repeatNTimes - How many times to repeat the number sequence
14
+ *
15
+ * @returns {string[]} Array of formatted number strings
16
+ *
17
+ * @example
18
+ * // Generate numbers 0-9 with padding
19
+ * generateNumbers(10, {
20
+ * interval: 1,
21
+ * padWithNItems: 2,
22
+ * repeatNTimes: 1,
23
+ * padNumbersWithZero: true
24
+ * })
25
+ * // Returns: ['', '', '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '', '']
26
+ *
27
+ * @example
28
+ * // Generate even numbers with infinite scroll
29
+ * generateNumbers(5, {
30
+ * interval: 2,
31
+ * padWithNItems: 2,
32
+ * repeatNTimes: 3,
33
+ * disableInfiniteScroll: false
34
+ * })
35
+ * // Returns: ['0', '2', '4', '6', '8', '0', '2', '4', '6', '8', '0', '2', '4', '6', '8']
36
+ */
2
37
  export const generateNumbers = (numberOfItems, options) => {
3
38
  if (numberOfItems <= 0) {
4
39
  return [];
@@ -19,6 +54,39 @@ export const generateNumbers = (numberOfItems, options) => {
19
54
  }
20
55
  return numbers;
21
56
  };
57
+
58
+ /**
59
+ * Generates an array of formatted 12-hour time strings (AM/PM) for a time picker.
60
+ * Supports infinite scroll, padding, and number repetition.
61
+ *
62
+ * @param {Object} options - Configuration options for time generation
63
+ * @param {boolean} [options.disableInfiniteScroll] - Whether to disable infinite scroll
64
+ * @param {number} options.interval - The interval between hours (must be a divisor of 12)
65
+ * @param {boolean} [options.padNumbersWithZero] - Whether to pad single-digit hours with leading zeros
66
+ * @param {number} options.padWithNItems - Number of empty items to pad with
67
+ * @param {number} [options.repeatNTimes] - How many times to repeat the time sequence (defaults to 1)
68
+ *
69
+ * @returns {string[]} Array of formatted 12-hour time strings
70
+ *
71
+ * @example
72
+ * // Generate hours with 1-hour interval
73
+ * generate12HourNumbers({
74
+ * interval: 1,
75
+ * padWithNItems: 2,
76
+ * padNumbersWithZero: true
77
+ * })
78
+ * // Returns: ['', '', '12 AM', '01 AM', '02 AM', ..., '11 PM', '', '']
79
+ *
80
+ * @example
81
+ * // Generate hours with 2-hour interval and infinite scroll
82
+ * generate12HourNumbers({
83
+ * interval: 2,
84
+ * padWithNItems: 2,
85
+ * repeatNTimes: 2,
86
+ * disableInfiniteScroll: false
87
+ * })
88
+ * // Returns: ['12 AM', '2 AM', '4 AM', ..., '10 PM', '12 AM', '2 AM', ...]
89
+ */
22
90
  export const generate12HourNumbers = options => {
23
91
  let numbers = [];
24
92
 
@@ -1 +1 @@
1
- {"version":3,"names":["padNumber","generateNumbers","numberOfItems","options","numbers","i","value","interval","push","padWithZero","padNumbersWithZero","repeatNTimes","Array","fill","flat","disableInfiniteScroll","padWithNItems","unshift","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,SAASA,SAAS,QAAQ,aAAa;AAEvC,OAAO,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,CACRR,SAAS,CAACM,KAAK,EAAE;MAAEG,WAAW,EAAEN,OAAO,CAACO;IAAmB,CAAC,CAChE,CAAC;EACL;EAEA,IAAIP,OAAO,CAACQ,YAAY,GAAG,CAAC,EAAE;IAC1BP,OAAO,GAAGQ,KAAK,CAACT,OAAO,CAACQ,YAAY,CAAC,CAACE,IAAI,CAACT,OAAO,CAAC,CAACU,IAAI,CAAC,CAAC;EAC9D;EACA,IAAIX,OAAO,CAACY,qBAAqB,IAAIZ,OAAO,CAACQ,YAAY,KAAK,CAAC,EAAE;IAC7DP,OAAO,CAACI,IAAI,CAAC,GAAGI,KAAK,CAACT,OAAO,CAACa,aAAa,CAAC,CAACH,IAAI,CAAC,EAAE,CAAC,CAAC;IACtDT,OAAO,CAACa,OAAO,CAAC,GAAGL,KAAK,CAACT,OAAO,CAACa,aAAa,CAAC,CAACH,IAAI,CAAC,EAAE,CAAC,CAAC;EAC7D;EACA,OAAOT,OAAO;AAClB,CAAC;AAED,OAAO,MAAMc,qBAAqB,GAAIf,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,GAAGR,SAAS,CAACK,CAAC,EAAE;MAAEI,WAAW,EAAEN,OAAO,CAACO;IAAmB,CAAC,CAAC,KAChE,CAAC;EACL;;EAEA;EACA,KAAK,IAAIL,CAAC,GAAG,EAAE,EAAEA,CAAC,GAAG,EAAE,EAAEA,CAAC,IAAIF,OAAO,CAACI,QAAQ,EAAE;IAC5C,MAAMY,IAAI,GAAGd,CAAC,GAAG,EAAE,GAAGA,CAAC,GAAG,EAAE,GAAGA,CAAC;IAChCD,OAAO,CAACI,IAAI,CACR,GAAGR,SAAS,CAACmB,IAAI,EAAE;MAAEV,WAAW,EAAEN,OAAO,CAACO;IAAmB,CAAC,CAAC,KACnE,CAAC;EACL;EAEA,IAAI,CAACP,OAAO,CAACQ,YAAY,IAAI,CAAC,IAAI,CAAC,EAAE;IACjCP,OAAO,GAAGQ,KAAK,CAACT,OAAO,CAACQ,YAAY,CAAC,CAACE,IAAI,CAACT,OAAO,CAAC,CAACU,IAAI,CAAC,CAAC;EAC9D;EAEA,IAAIX,OAAO,CAACY,qBAAqB,EAAE;IAC/BX,OAAO,CAACI,IAAI,CAAC,GAAGI,KAAK,CAACT,OAAO,CAACa,aAAa,CAAC,CAACH,IAAI,CAAC,EAAE,CAAC,CAAC;IACtDT,OAAO,CAACa,OAAO,CAAC,GAAGL,KAAK,CAACT,OAAO,CAACa,aAAa,CAAC,CAACH,IAAI,CAAC,EAAE,CAAC,CAAC;EAC7D;EAEA,OAAOT,OAAO;AAClB,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["padNumber","generateNumbers","numberOfItems","options","numbers","i","value","interval","push","padWithZero","padNumbersWithZero","repeatNTimes","Array","fill","flat","disableInfiniteScroll","padWithNItems","unshift","generate12HourNumbers","hour"],"sources":["generateNumbers.ts"],"sourcesContent":["import { padNumber } from \"./padNumber\";\n\n/**\n * Generates an array of formatted numbers for a number picker, with support for infinite scroll,\n * padding, and number repetition.\n *\n * @param {number} numberOfItems - Total number of items to generate\n * @param {Object} options - Configuration options for number generation\n * @param {boolean} [options.disableInfiniteScroll] - Whether to disable infinite scroll\n * @param {number} options.interval - The interval between consecutive numbers\n * @param {boolean} [options.padNumbersWithZero] - Whether to pad single-digit numbers with leading zeros\n * @param {number} options.padWithNItems - Number of empty items to pad with\n * @param {number} options.repeatNTimes - How many times to repeat the number sequence\n *\n * @returns {string[]} Array of formatted number strings\n *\n * @example\n * // Generate numbers 0-9 with padding\n * generateNumbers(10, {\n * interval: 1,\n * padWithNItems: 2,\n * repeatNTimes: 1,\n * padNumbersWithZero: true\n * })\n * // Returns: ['', '', '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '', '']\n *\n * @example\n * // Generate even numbers with infinite scroll\n * generateNumbers(5, {\n * interval: 2,\n * padWithNItems: 2,\n * repeatNTimes: 3,\n * disableInfiniteScroll: false\n * })\n * // Returns: ['0', '2', '4', '6', '8', '0', '2', '4', '6', '8', '0', '2', '4', '6', '8']\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\n/**\n * Generates an array of formatted 12-hour time strings (AM/PM) for a time picker.\n * Supports infinite scroll, padding, and number repetition.\n *\n * @param {Object} options - Configuration options for time generation\n * @param {boolean} [options.disableInfiniteScroll] - Whether to disable infinite scroll\n * @param {number} options.interval - The interval between hours (must be a divisor of 12)\n * @param {boolean} [options.padNumbersWithZero] - Whether to pad single-digit hours with leading zeros\n * @param {number} options.padWithNItems - Number of empty items to pad with\n * @param {number} [options.repeatNTimes] - How many times to repeat the time sequence (defaults to 1)\n *\n * @returns {string[]} Array of formatted 12-hour time strings\n *\n * @example\n * // Generate hours with 1-hour interval\n * generate12HourNumbers({\n * interval: 1,\n * padWithNItems: 2,\n * padNumbersWithZero: true\n * })\n * // Returns: ['', '', '12 AM', '01 AM', '02 AM', ..., '11 PM', '', '']\n *\n * @example\n * // Generate hours with 2-hour interval and infinite scroll\n * generate12HourNumbers({\n * interval: 2,\n * padWithNItems: 2,\n * repeatNTimes: 2,\n * disableInfiniteScroll: false\n * })\n * // Returns: ['12 AM', '2 AM', '4 AM', ..., '10 PM', '12 AM', '2 AM', ...]\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":"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","ignoreList":[]}
@@ -1,3 +1,28 @@
1
+ /**
2
+ * Adjusts and validates the min/max limits for a scrollable number picker.
3
+ * Ensures limits are within valid bounds and handles edge cases.
4
+ *
5
+ * @param {Limit | undefined} limit - The input limit object containing optional min and max values
6
+ * @param {number} numberOfItems - Total number of items in the picker
7
+ * @param {number} interval - The interval between consecutive numbers
8
+ *
9
+ * @returns {{ max: number; min: number }} An object containing the adjusted min and max limits
10
+ *
11
+ * @example
12
+ * // With valid limits
13
+ * getAdjustedLimit({ min: 5, max: 15 }, 20, 1)
14
+ * // Returns: { max: 15, min: 5 }
15
+ *
16
+ * @example
17
+ * // With out-of-bounds limits
18
+ * getAdjustedLimit({ min: -5, max: 25 }, 20, 1)
19
+ * // Returns: { max: 19, min: 0 }
20
+ *
21
+ * @example
22
+ * // With invalid limits (max < min)
23
+ * getAdjustedLimit({ min: 15, max: 5 }, 20, 1)
24
+ * // Returns: { max: 19, min: 0 }
25
+ */
1
26
  export const getAdjustedLimit = (limit, numberOfItems, interval) => {
2
27
  const maxValue = (numberOfItems - 1) * interval;
3
28
  if (!limit || !limit.max && !limit.min) {
@@ -1 +1 @@
1
- {"version":3,"names":["getAdjustedLimit","limit","numberOfItems","interval","maxValue","max","min","adjustedMaxLimit","Math","adjustedMinLimit"],"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":"AAEA,OAAO,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","ignoreList":[]}
1
+ {"version":3,"names":["getAdjustedLimit","limit","numberOfItems","interval","maxValue","max","min","adjustedMaxLimit","Math","adjustedMinLimit"],"sources":["getAdjustedLimit.ts"],"sourcesContent":["import type { Limit } from \"../components/DurationScroll/types\";\n\n/**\n * Adjusts and validates the min/max limits for a scrollable number picker.\n * Ensures limits are within valid bounds and handles edge cases.\n *\n * @param {Limit | undefined} limit - The input limit object containing optional min and max values\n * @param {number} numberOfItems - Total number of items in the picker\n * @param {number} interval - The interval between consecutive numbers\n *\n * @returns {{ max: number; min: number }} An object containing the adjusted min and max limits\n *\n * @example\n * // With valid limits\n * getAdjustedLimit({ min: 5, max: 15 }, 20, 1)\n * // Returns: { max: 15, min: 5 }\n *\n * @example\n * // With out-of-bounds limits\n * getAdjustedLimit({ min: -5, max: 25 }, 20, 1)\n * // Returns: { max: 19, min: 0 }\n *\n * @example\n * // With invalid limits (max < min)\n * getAdjustedLimit({ min: 15, max: 5 }, 20, 1)\n * // Returns: { max: 19, min: 0 }\n */\nexport const getAdjustedLimit = (\n limit: Limit | 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":"AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,gBAAgB,GAAGA,CAC5BC,KAAwB,EACxBC,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","ignoreList":[]}
@@ -1,3 +1,41 @@
1
+ /**
2
+ * Calculates the duration value and index from a scroll offset in a number picker.
3
+ * Handles both infinite and non-infinite scroll modes, taking into account padding and item height.
4
+ *
5
+ * @param {Object} variables - Configuration object for scroll offset calculation
6
+ * @param {boolean} variables.disableInfiniteScroll - Whether infinite scroll is disabled
7
+ * @param {number} variables.interval - The interval between consecutive numbers
8
+ * @param {number} variables.itemHeight - Height of each item in the picker
9
+ * @param {number} variables.numberOfItems - Total number of items in the picker
10
+ * @param {number} variables.padWithNItems - Number of empty items to pad with
11
+ * @param {number} variables.yContentOffset - The vertical scroll offset
12
+ *
13
+ * @returns {{ duration: number; index: number }} Object containing the calculated duration and index
14
+ *
15
+ * @example
16
+ * // With infinite scroll enabled
17
+ * getDurationAndIndexFromScrollOffset({
18
+ * disableInfiniteScroll: false,
19
+ * interval: 1,
20
+ * itemHeight: 50,
21
+ * numberOfItems: 24,
22
+ * padWithNItems: 2,
23
+ * yContentOffset: 100
24
+ * })
25
+ * // Returns: { duration: 2, index: 2 }
26
+ *
27
+ * @example
28
+ * // With infinite scroll disabled
29
+ * getDurationAndIndexFromScrollOffset({
30
+ * disableInfiniteScroll: true,
31
+ * interval: 1,
32
+ * itemHeight: 50,
33
+ * numberOfItems: 24,
34
+ * padWithNItems: 2,
35
+ * yContentOffset: 100
36
+ * })
37
+ * // Returns: { duration: 2, index: 2 }
38
+ */
1
39
  export const getDurationAndIndexFromScrollOffset = variables => {
2
40
  const {
3
41
  disableInfiniteScroll,
@@ -1 +1 @@
1
- {"version":3,"names":["getDurationAndIndexFromScrollOffset","variables","disableInfiniteScroll","interval","itemHeight","numberOfItems","padWithNItems","yContentOffset","index","Math","round","duration"],"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":"AAAA,OAAO,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","ignoreList":[]}
1
+ {"version":3,"names":["getDurationAndIndexFromScrollOffset","variables","disableInfiniteScroll","interval","itemHeight","numberOfItems","padWithNItems","yContentOffset","index","Math","round","duration"],"sources":["getDurationAndIndexFromScrollOffset.ts"],"sourcesContent":["/**\n * Calculates the duration value and index from a scroll offset in a number picker.\n * Handles both infinite and non-infinite scroll modes, taking into account padding and item height.\n *\n * @param {Object} variables - Configuration object for scroll offset calculation\n * @param {boolean} variables.disableInfiniteScroll - Whether infinite scroll is disabled\n * @param {number} variables.interval - The interval between consecutive numbers\n * @param {number} variables.itemHeight - Height of each item in the picker\n * @param {number} variables.numberOfItems - Total number of items in the picker\n * @param {number} variables.padWithNItems - Number of empty items to pad with\n * @param {number} variables.yContentOffset - The vertical scroll offset\n *\n * @returns {{ duration: number; index: number }} Object containing the calculated duration and index\n *\n * @example\n * // With infinite scroll enabled\n * getDurationAndIndexFromScrollOffset({\n * disableInfiniteScroll: false,\n * interval: 1,\n * itemHeight: 50,\n * numberOfItems: 24,\n * padWithNItems: 2,\n * yContentOffset: 100\n * })\n * // Returns: { duration: 2, index: 2 }\n *\n * @example\n * // With infinite scroll disabled\n * getDurationAndIndexFromScrollOffset({\n * disableInfiniteScroll: true,\n * interval: 1,\n * itemHeight: 50,\n * numberOfItems: 24,\n * padWithNItems: 2,\n * yContentOffset: 100\n * })\n * // Returns: { duration: 2, index: 2 }\n */\nexport 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":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,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","ignoreList":[]}
@@ -1,3 +1,41 @@
1
+ /**
2
+ * Calculates the initial scroll index for a number picker based on the desired value and configuration.
3
+ * Handles both infinite and non-infinite scroll modes, taking into account padding and repetition.
4
+ *
5
+ * @param {Object} variables - Configuration object for scroll index calculation
6
+ * @param {boolean} variables.disableInfiniteScroll - Whether infinite scroll is disabled
7
+ * @param {number} variables.interval - The interval between consecutive numbers
8
+ * @param {number} variables.numberOfItems - Total number of items in the picker
9
+ * @param {number} variables.padWithNItems - Number of empty items to pad with
10
+ * @param {number} variables.repeatNumbersNTimes - How many times to repeat the number sequence
11
+ * @param {number} variables.value - The desired initial value
12
+ *
13
+ * @returns {number} The calculated initial scroll index
14
+ *
15
+ * @example
16
+ * // With infinite scroll enabled
17
+ * getInitialScrollIndex({
18
+ * disableInfiniteScroll: false,
19
+ * interval: 1,
20
+ * numberOfItems: 24,
21
+ * padWithNItems: 2,
22
+ * repeatNumbersNTimes: 3,
23
+ * value: 12
24
+ * })
25
+ * // Returns: 38
26
+ *
27
+ * @example
28
+ * // With infinite scroll disabled
29
+ * getInitialScrollIndex({
30
+ * disableInfiniteScroll: true,
31
+ * interval: 1,
32
+ * numberOfItems: 24,
33
+ * padWithNItems: 2,
34
+ * repeatNumbersNTimes: 1,
35
+ * value: 12
36
+ * })
37
+ * // Returns: 12
38
+ */
1
39
  export const getInitialScrollIndex = variables => {
2
40
  const {
3
41
  disableInfiniteScroll,
@@ -1 +1 @@
1
- {"version":3,"names":["getInitialScrollIndex","variables","disableInfiniteScroll","interval","numberOfItems","padWithNItems","repeatNumbersNTimes","value","Math","max","floor"],"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":"AAAA,OAAO,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","ignoreList":[]}
1
+ {"version":3,"names":["getInitialScrollIndex","variables","disableInfiniteScroll","interval","numberOfItems","padWithNItems","repeatNumbersNTimes","value","Math","max","floor"],"sources":["getInitialScrollIndex.ts"],"sourcesContent":["/**\n * Calculates the initial scroll index for a number picker based on the desired value and configuration.\n * Handles both infinite and non-infinite scroll modes, taking into account padding and repetition.\n * \n * @param {Object} variables - Configuration object for scroll index calculation\n * @param {boolean} variables.disableInfiniteScroll - Whether infinite scroll is disabled\n * @param {number} variables.interval - The interval between consecutive numbers\n * @param {number} variables.numberOfItems - Total number of items in the picker\n * @param {number} variables.padWithNItems - Number of empty items to pad with\n * @param {number} variables.repeatNumbersNTimes - How many times to repeat the number sequence\n * @param {number} variables.value - The desired initial value\n * \n * @returns {number} The calculated initial scroll index\n * \n * @example\n * // With infinite scroll enabled\n * getInitialScrollIndex({\n * disableInfiniteScroll: false,\n * interval: 1,\n * numberOfItems: 24,\n * padWithNItems: 2,\n * repeatNumbersNTimes: 3,\n * value: 12\n * })\n * // Returns: 38\n * \n * @example\n * // With infinite scroll disabled\n * getInitialScrollIndex({\n * disableInfiniteScroll: true,\n * interval: 1,\n * numberOfItems: 24,\n * padWithNItems: 2,\n * repeatNumbersNTimes: 1,\n * value: 12\n * })\n * // Returns: 12\n */\nexport 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":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,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","ignoreList":[]}
@@ -1,4 +1,32 @@
1
+ /**
2
+ * Safely extracts and validates initial duration values, ensuring all values are valid numbers.
3
+ * Returns a duration object with safe default values (0) for any invalid or missing inputs.
4
+ *
5
+ * @param {Object} [initialValue] - Optional initial duration values
6
+ * @param {number} [initialValue.days] - Initial days value
7
+ * @param {number} [initialValue.hours] - Initial hours value
8
+ * @param {number} [initialValue.minutes] - Initial minutes value
9
+ * @param {number} [initialValue.seconds] - Initial seconds value
10
+ *
11
+ * @returns {{ days: number; hours: number; minutes: number; seconds: number }} An object containing safe duration values
12
+ *
13
+ * @example
14
+ * // With valid values
15
+ * getSafeInitialValue({ days: 1, hours: 2, minutes: 30, seconds: 45 })
16
+ * // Returns: { days: 1, hours: 2, minutes: 30, seconds: 45 }
17
+ *
18
+ * @example
19
+ * // With invalid values
20
+ * getSafeInitialValue({ days: NaN, hours: 'invalid', minutes: undefined })
21
+ * // Returns: { days: 0, hours: 0, minutes: 0, seconds: 0 }
22
+ *
23
+ * @example
24
+ * // With undefined input
25
+ * getSafeInitialValue(undefined)
26
+ * // Returns: { days: 0, hours: 0, minutes: 0, seconds: 0 }
27
+ */
1
28
  export const getSafeInitialValue = initialValue => ({
29
+ days: typeof (initialValue === null || initialValue === void 0 ? void 0 : initialValue.days) === "number" && !isNaN(initialValue === null || initialValue === void 0 ? void 0 : initialValue.days) ? initialValue.days : 0,
2
30
  hours: typeof (initialValue === null || initialValue === void 0 ? void 0 : initialValue.hours) === "number" && !isNaN(initialValue === null || initialValue === void 0 ? void 0 : initialValue.hours) ? initialValue.hours : 0,
3
31
  minutes: typeof (initialValue === null || initialValue === void 0 ? void 0 : initialValue.minutes) === "number" && !isNaN(initialValue === null || initialValue === void 0 ? void 0 : initialValue.minutes) ? initialValue.minutes : 0,
4
32
  seconds: typeof (initialValue === null || initialValue === void 0 ? void 0 : initialValue.seconds) === "number" && !isNaN(initialValue === null || initialValue === void 0 ? void 0 : initialValue.seconds) ? initialValue.seconds : 0
@@ -1 +1 @@
1
- {"version":3,"names":["getSafeInitialValue","initialValue","hours","isNaN","minutes","seconds"],"sources":["getSafeInitialValue.ts"],"sourcesContent":["export const getSafeInitialValue = (\n initialValue:\n | {\n hours?: number;\n minutes?: number;\n seconds?: number;\n }\n | undefined\n) => ({\n hours:\n typeof initialValue?.hours === \"number\" && !isNaN(initialValue?.hours)\n ? initialValue.hours\n : 0,\n minutes:\n typeof initialValue?.minutes === \"number\" &&\n !isNaN(initialValue?.minutes)\n ? initialValue.minutes\n : 0,\n seconds:\n typeof initialValue?.seconds === \"number\" &&\n !isNaN(initialValue?.seconds)\n ? initialValue.seconds\n : 0,\n});\n"],"mappings":"AAAA,OAAO,MAAMA,mBAAmB,GAC5BC,YAMe,KACb;EACFC,KAAK,EACD,QAAOD,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEC,KAAK,MAAK,QAAQ,IAAI,CAACC,KAAK,CAACF,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEC,KAAK,CAAC,GAChED,YAAY,CAACC,KAAK,GAClB,CAAC;EACXE,OAAO,EACH,QAAOH,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEG,OAAO,MAAK,QAAQ,IACzC,CAACD,KAAK,CAACF,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEG,OAAO,CAAC,GACvBH,YAAY,CAACG,OAAO,GACpB,CAAC;EACXC,OAAO,EACH,QAAOJ,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEI,OAAO,MAAK,QAAQ,IACzC,CAACF,KAAK,CAACF,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEI,OAAO,CAAC,GACvBJ,YAAY,CAACI,OAAO,GACpB;AACd,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["getSafeInitialValue","initialValue","days","isNaN","hours","minutes","seconds"],"sources":["getSafeInitialValue.ts"],"sourcesContent":["/**\n * Safely extracts and validates initial duration values, ensuring all values are valid numbers.\n * Returns a duration object with safe default values (0) for any invalid or missing inputs.\n * \n * @param {Object} [initialValue] - Optional initial duration values\n * @param {number} [initialValue.days] - Initial days value\n * @param {number} [initialValue.hours] - Initial hours value\n * @param {number} [initialValue.minutes] - Initial minutes value\n * @param {number} [initialValue.seconds] - Initial seconds value\n * \n * @returns {{ days: number; hours: number; minutes: number; seconds: number }} An object containing safe duration values\n * \n * @example\n * // With valid values\n * getSafeInitialValue({ days: 1, hours: 2, minutes: 30, seconds: 45 })\n * // Returns: { days: 1, hours: 2, minutes: 30, seconds: 45 }\n * \n * @example\n * // With invalid values\n * getSafeInitialValue({ days: NaN, hours: 'invalid', minutes: undefined })\n * // Returns: { days: 0, hours: 0, minutes: 0, seconds: 0 }\n * \n * @example\n * // With undefined input\n * getSafeInitialValue(undefined)\n * // Returns: { days: 0, hours: 0, minutes: 0, seconds: 0 }\n */\nexport const getSafeInitialValue = (\n initialValue:\n | {\n days?: number;\n hours?: number;\n minutes?: number;\n seconds?: number;\n }\n | undefined\n) => ({\n days:\n typeof initialValue?.days === \"number\" && !isNaN(initialValue?.days)\n ? initialValue.days\n : 0,\n hours:\n typeof initialValue?.hours === \"number\" && !isNaN(initialValue?.hours)\n ? initialValue.hours\n : 0,\n minutes:\n typeof initialValue?.minutes === \"number\" &&\n !isNaN(initialValue?.minutes)\n ? initialValue.minutes\n : 0,\n seconds:\n typeof initialValue?.seconds === \"number\" &&\n !isNaN(initialValue?.seconds)\n ? initialValue.seconds\n : 0,\n});\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,mBAAmB,GAC5BC,YAOe,KACb;EACFC,IAAI,EACA,QAAOD,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEC,IAAI,MAAK,QAAQ,IAAI,CAACC,KAAK,CAACF,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEC,IAAI,CAAC,GAC9DD,YAAY,CAACC,IAAI,GACjB,CAAC;EACXE,KAAK,EACD,QAAOH,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEG,KAAK,MAAK,QAAQ,IAAI,CAACD,KAAK,CAACF,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEG,KAAK,CAAC,GAChEH,YAAY,CAACG,KAAK,GAClB,CAAC;EACXC,OAAO,EACH,QAAOJ,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEI,OAAO,MAAK,QAAQ,IACzC,CAACF,KAAK,CAACF,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEI,OAAO,CAAC,GACvBJ,YAAY,CAACI,OAAO,GACpB,CAAC;EACXC,OAAO,EACH,QAAOL,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEK,OAAO,MAAK,QAAQ,IACzC,CAACH,KAAK,CAACF,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEK,OAAO,CAAC,GACvBL,YAAY,CAACK,OAAO,GACpB;AACd,CAAC,CAAC","ignoreList":[]}
@@ -1,3 +1,28 @@
1
+ /**
2
+ * Formats a number by optionally padding it with a leading zero or space.
3
+ * Numbers less than 10 are padded based on the options provided.
4
+ *
5
+ * @param {number} value - The number to format
6
+ * @param {Object} [options] - Optional formatting options
7
+ * @param {boolean} [options.padWithZero] - Whether to pad with zero (true) or space (false)
8
+ *
9
+ * @returns {string} The formatted number string
10
+ *
11
+ * @example
12
+ * // Pad with zero
13
+ * padNumber(5, { padWithZero: true })
14
+ * // Returns: '05'
15
+ *
16
+ * @example
17
+ * // Pad with space
18
+ * padNumber(5, { padWithZero: false })
19
+ * // Returns: ' 5'
20
+ *
21
+ * @example
22
+ * // No padding needed
23
+ * padNumber(15)
24
+ * // Returns: '15'
25
+ */
1
26
  export const padNumber = (value, options) => {
2
27
  if (value < 10) {
3
28
  return (options !== null && options !== void 0 && options.padWithZero ? "0" : " ") + value;
@@ -1 +1 @@
1
- {"version":3,"names":["padNumber","value","options","padWithZero","String"],"sources":["padNumber.ts"],"sourcesContent":["export const padNumber = (\n value: number,\n options?: { padWithZero?: boolean }\n): string => {\n if (value < 10) {\n return (options?.padWithZero ? \"0\" : \" \") + value;\n } else {\n return String(value);\n }\n};\n"],"mappings":"AAAA,OAAO,MAAMA,SAAS,GAAGA,CACrBC,KAAa,EACbC,OAAmC,KAC1B;EACT,IAAID,KAAK,GAAG,EAAE,EAAE;IACZ,OAAO,CAACC,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAEC,WAAW,GAAG,GAAG,GAAG,GAAG,IAAIF,KAAK;EACrD,CAAC,MAAM;IACH,OAAOG,MAAM,CAACH,KAAK,CAAC;EACxB;AACJ,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["padNumber","value","options","padWithZero","String"],"sources":["padNumber.ts"],"sourcesContent":["/**\n * Formats a number by optionally padding it with a leading zero or space.\n * Numbers less than 10 are padded based on the options provided.\n * \n * @param {number} value - The number to format\n * @param {Object} [options] - Optional formatting options\n * @param {boolean} [options.padWithZero] - Whether to pad with zero (true) or space (false)\n * \n * @returns {string} The formatted number string\n * \n * @example\n * // Pad with zero\n * padNumber(5, { padWithZero: true })\n * // Returns: '05'\n * \n * @example\n * // Pad with space\n * padNumber(5, { padWithZero: false })\n * // Returns: ' 5'\n * \n * @example\n * // No padding needed\n * padNumber(15)\n * // Returns: '15'\n */\nexport const padNumber = (\n value: number,\n options?: { padWithZero?: boolean }\n): string => {\n if (value < 10) {\n return (options?.padWithZero ? \"0\" : \" \") + value;\n } else {\n return String(value);\n }\n};\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,SAAS,GAAGA,CACrBC,KAAa,EACbC,OAAmC,KAC1B;EACT,IAAID,KAAK,GAAG,EAAE,EAAE;IACZ,OAAO,CAACC,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAEC,WAAW,GAAG,GAAG,GAAG,GAAG,IAAIF,KAAK;EACrD,CAAC,MAAM;IACH,OAAOG,MAAM,CAACH,KAAK,CAAC;EACxB;AACJ,CAAC","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import type { DurationScrollProps, DurationScrollRef } from "./types";
3
+ declare const _default: React.NamedExoticComponent<DurationScrollProps & React.RefAttributes<DurationScrollRef>>;
4
+ export default _default;
@@ -1,4 +1,2 @@
1
- import React from "react";
2
- import type { DurationScrollProps, DurationScrollRef } from "./types";
3
- declare const _default: React.MemoExoticComponent<React.ForwardRefExoticComponent<DurationScrollProps & React.RefAttributes<DurationScrollRef>>>;
4
- export default _default;
1
+ export { default } from "./DurationScroll";
2
+ export * from "./types";
@@ -1,24 +1,24 @@
1
- import type { MutableRefObject } from "react";
2
- import type { View, FlatList as RNFlatList, FlatListProps as RNFlatListProps } from "react-native";
1
+ import type { RefObject } from "react";
2
+ import type { View } from "react-native";
3
3
  import type { generateStyles } from "../TimerPicker/styles";
4
- export type CustomFlatList = <ItemT = any>(props: React.PropsWithChildren<RNFlatListProps<ItemT> & React.RefAttributes<RNFlatList<ItemT>>>, ref: React.ForwardedRef<RNFlatList<ItemT>>) => React.ReactElement | null;
5
4
  export interface DurationScrollProps {
6
5
  Audio?: any;
7
- FlatList?: CustomFlatList;
6
+ FlatList?: any;
8
7
  Haptics?: any;
9
8
  LinearGradient?: any;
10
9
  MaskedView?: any;
11
10
  aggressivelyGetLatestDuration: boolean;
12
11
  allowFontScaling?: boolean;
13
12
  amLabel?: string;
14
- clickSoundAsset?: SoundAssetType;
13
+ clickSoundAsset?: SoundAsset;
14
+ decelerationRate?: number | "normal" | "fast";
15
15
  disableInfiniteScroll?: boolean;
16
16
  initialValue?: number;
17
17
  interval: number;
18
18
  is12HourPicker?: boolean;
19
19
  isDisabled?: boolean;
20
20
  label?: string | React.ReactElement;
21
- limit?: LimitType;
21
+ limit?: Limit;
22
22
  maximumValue: number;
23
23
  onDurationChange: (duration: number) => void;
24
24
  padNumbersWithZero?: boolean;
@@ -32,7 +32,7 @@ export interface DurationScrollProps {
32
32
  testID?: string;
33
33
  }
34
34
  export interface DurationScrollRef {
35
- latestDuration: MutableRefObject<number>;
35
+ latestDuration: RefObject<number>;
36
36
  reset: (options?: {
37
37
  animated?: boolean;
38
38
  }) => void;
@@ -50,13 +50,17 @@ export type LinearGradientProps = React.ComponentProps<typeof View> & {
50
50
  locations?: number[] | null;
51
51
  start?: LinearGradientPoint | null;
52
52
  };
53
- export type LimitType = {
53
+ export type Limit = {
54
54
  max?: number;
55
55
  min?: number;
56
56
  };
57
- export type SoundAssetType = number | {
57
+ export type SoundAsset = number | {
58
58
  headers?: Record<string, string>;
59
59
  overrideFileExtensionAndroid?: string;
60
60
  uri: string;
61
61
  };
62
+ export type ExpoAvAudioInstance = {
63
+ replayAsync: () => Promise<void>;
64
+ unloadAsync: () => Promise<void>;
65
+ };
62
66
  export {};