react-native-timer-picker 1.6.0 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +74 -25
- package/dist/commonjs/assets/select_click.mp3 +0 -0
- package/dist/commonjs/components/{TimerPicker/DurationScroll.js → DurationScroll/index.js} +113 -63
- package/dist/commonjs/components/DurationScroll/index.js.map +1 -0
- package/dist/commonjs/components/DurationScroll/types.js +6 -0
- package/dist/commonjs/components/DurationScroll/types.js.map +1 -0
- package/dist/commonjs/components/Modal/index.js +21 -20
- package/dist/commonjs/components/Modal/index.js.map +1 -1
- package/dist/commonjs/components/Modal/{Modal.styles.js → styles.js} +1 -1
- package/dist/commonjs/components/Modal/styles.js.map +1 -0
- package/dist/commonjs/components/Modal/types.js +6 -0
- package/dist/commonjs/components/Modal/types.js.map +1 -0
- package/dist/commonjs/components/TimerPicker/index.js +68 -79
- package/dist/commonjs/components/TimerPicker/index.js.map +1 -1
- package/dist/commonjs/components/TimerPicker/{TimerPicker.styles.js → styles.js} +1 -3
- package/dist/commonjs/components/TimerPicker/styles.js.map +1 -0
- package/dist/commonjs/components/TimerPicker/types.js +6 -0
- package/dist/commonjs/components/TimerPicker/types.js.map +1 -0
- package/dist/commonjs/components/{index.js → TimerPickerModal/index.js} +42 -99
- package/dist/commonjs/components/TimerPickerModal/index.js.map +1 -0
- package/dist/commonjs/components/{TimerPickerModal.styles.js → TimerPickerModal/styles.js} +1 -3
- package/dist/commonjs/components/TimerPickerModal/styles.js.map +1 -0
- package/dist/commonjs/components/TimerPickerModal/types.js +6 -0
- package/dist/commonjs/components/TimerPickerModal/types.js.map +1 -0
- package/dist/commonjs/index.js +14 -13
- package/dist/commonjs/index.js.map +1 -1
- package/dist/commonjs/tests/DurationScroll.test.js +1 -1
- package/dist/commonjs/tests/DurationScroll.test.js.map +1 -1
- package/dist/commonjs/tests/Modal.test.js +7 -7
- package/dist/commonjs/tests/Modal.test.js.map +1 -1
- package/dist/commonjs/tests/TimerPicker.test.js.map +1 -1
- package/dist/commonjs/tests/TimerPickerModal.test.js +2 -2
- package/dist/commonjs/tests/TimerPickerModal.test.js.map +1 -1
- package/dist/commonjs/utils/generateNumbers.js.map +1 -1
- package/dist/commonjs/utils/getAdjustedLimit.js.map +1 -1
- package/dist/commonjs/utils/getScrollIndex.js +2 -2
- package/dist/commonjs/utils/getScrollIndex.js.map +1 -1
- package/dist/module/assets/select_click.mp3 +0 -0
- package/dist/module/components/{TimerPicker/DurationScroll.js → DurationScroll/index.js} +114 -64
- package/dist/module/components/DurationScroll/index.js.map +1 -0
- package/dist/module/components/DurationScroll/types.js +2 -0
- package/dist/module/components/DurationScroll/types.js.map +1 -0
- package/dist/module/components/Modal/index.js +19 -19
- package/dist/module/components/Modal/index.js.map +1 -1
- package/dist/module/components/Modal/{Modal.styles.js → styles.js} +1 -1
- package/dist/module/components/Modal/styles.js.map +1 -0
- package/dist/module/components/Modal/types.js +2 -0
- package/dist/module/components/Modal/types.js.map +1 -0
- package/dist/module/components/TimerPicker/index.js +67 -78
- package/dist/module/components/TimerPicker/index.js.map +1 -1
- package/dist/module/components/TimerPicker/{TimerPicker.styles.js → styles.js} +1 -2
- package/dist/module/components/TimerPicker/styles.js.map +1 -0
- package/dist/module/components/TimerPicker/types.js +2 -0
- package/dist/module/components/TimerPicker/types.js.map +1 -0
- package/dist/module/components/{index.js → TimerPickerModal/index.js} +41 -98
- package/dist/module/components/TimerPickerModal/index.js.map +1 -0
- package/dist/module/components/{TimerPickerModal.styles.js → TimerPickerModal/styles.js} +1 -2
- package/dist/module/components/TimerPickerModal/styles.js.map +1 -0
- package/dist/module/components/TimerPickerModal/types.js +2 -0
- package/dist/module/components/TimerPickerModal/types.js.map +1 -0
- package/dist/module/index.js +6 -4
- package/dist/module/index.js.map +1 -1
- package/dist/module/tests/DurationScroll.test.js +1 -1
- package/dist/module/tests/DurationScroll.test.js.map +1 -1
- package/dist/module/tests/Modal.test.js +1 -1
- package/dist/module/tests/Modal.test.js.map +1 -1
- package/dist/module/tests/TimerPicker.test.js.map +1 -1
- package/dist/module/tests/TimerPickerModal.test.js +2 -2
- package/dist/module/tests/TimerPickerModal.test.js.map +1 -1
- package/dist/module/utils/generateNumbers.js.map +1 -1
- package/dist/module/utils/getAdjustedLimit.js.map +1 -1
- package/dist/module/utils/getScrollIndex.js +2 -2
- package/dist/module/utils/getScrollIndex.js.map +1 -1
- package/dist/typescript/components/DurationScroll/index.d.ts +4 -0
- package/dist/typescript/components/{TimerPicker/DurationScroll.d.ts → DurationScroll/types.d.ts} +36 -29
- package/dist/typescript/components/Modal/index.d.ts +3 -14
- package/dist/typescript/components/Modal/types.d.ts +15 -0
- package/dist/typescript/components/TimerPicker/index.d.ts +2 -57
- package/dist/typescript/components/TimerPicker/styles.d.ts +1022 -0
- package/dist/typescript/components/TimerPicker/types.d.ts +61 -0
- package/dist/typescript/components/TimerPickerModal/index.d.ts +4 -0
- package/dist/typescript/components/TimerPickerModal/styles.d.ts +738 -0
- package/dist/typescript/components/{index.d.ts → TimerPickerModal/types.d.ts} +24 -26
- package/dist/typescript/index.d.ts +6 -4
- package/dist/typescript/utils/generateNumbers.d.ts +4 -4
- package/dist/typescript/utils/getAdjustedLimit.d.ts +1 -1
- package/dist/typescript/utils/getScrollIndex.d.ts +2 -2
- package/package.json +14 -11
- package/src/assets/select_click.mp3 +0 -0
- package/src/components/{TimerPicker/DurationScroll.tsx → DurationScroll/index.tsx} +126 -110
- package/src/components/DurationScroll/types.ts +63 -0
- package/src/components/Modal/index.tsx +20 -30
- package/src/components/Modal/types.ts +17 -0
- package/src/components/TimerPicker/index.tsx +70 -138
- package/src/components/TimerPicker/{TimerPicker.styles.ts → styles.ts} +13 -13
- package/src/components/TimerPicker/types.ts +72 -0
- package/src/components/{index.tsx → TimerPickerModal/index.tsx} +44 -147
- package/src/components/{TimerPickerModal.styles.ts → TimerPickerModal/styles.ts} +9 -9
- package/src/components/TimerPickerModal/types.ts +52 -0
- package/src/index.ts +6 -7
- package/src/tests/DurationScroll.test.tsx +3 -1
- package/src/tests/Modal.test.tsx +3 -1
- package/src/tests/TimerPicker.test.tsx +2 -0
- package/src/tests/TimerPickerModal.test.tsx +3 -1
- package/src/utils/generateNumbers.ts +4 -4
- package/src/utils/getAdjustedLimit.ts +1 -1
- package/src/utils/getScrollIndex.ts +3 -3
- package/dist/commonjs/components/Modal/Modal.styles.js.map +0 -1
- package/dist/commonjs/components/TimerPicker/DurationScroll.js.map +0 -1
- package/dist/commonjs/components/TimerPicker/TimerPicker.styles.js.map +0 -1
- package/dist/commonjs/components/TimerPickerModal.styles.js.map +0 -1
- package/dist/commonjs/components/index.js.map +0 -1
- package/dist/module/components/Modal/Modal.styles.js.map +0 -1
- package/dist/module/components/TimerPicker/DurationScroll.js.map +0 -1
- package/dist/module/components/TimerPicker/TimerPicker.styles.js.map +0 -1
- package/dist/module/components/TimerPickerModal.styles.js.map +0 -1
- package/dist/module/components/index.js.map +0 -1
- package/dist/typescript/components/TimerPicker/TimerPicker.styles.d.ts +0 -29
- package/dist/typescript/components/TimerPickerModal.styles.d.ts +0 -19
- /package/dist/typescript/components/Modal/{Modal.styles.d.ts → styles.d.ts} +0 -0
- /package/src/components/Modal/{Modal.styles.ts → styles.ts} +0 -0
package/README.md
CHANGED
|
@@ -9,10 +9,15 @@ A simple, flexible, performant duration picker component for React Native apps
|
|
|
9
9
|
|
|
10
10
|
Great for timers, alarms and duration inputs.
|
|
11
11
|
|
|
12
|
-
Works with Expo and bare React Native apps
|
|
12
|
+
Works with Expo and bare React Native apps ✅
|
|
13
|
+
|
|
14
|
+
Includes iOS-style haptic and audio feedback 🍏
|
|
13
15
|
|
|
14
16
|
- [Demos 📱](#demos-)
|
|
15
17
|
- [Peer Dependencies 👶](#peer-dependencies-)
|
|
18
|
+
- [Linear Gradient](#linear-gradient)
|
|
19
|
+
- [Haptic Feedback](#haptic-feedback)
|
|
20
|
+
- [Audio Feedback (Click Sound)](#audio-feedback-click-sound)
|
|
16
21
|
- [Installation 🚀](#installation-)
|
|
17
22
|
- [Examples 😎](#examples-)
|
|
18
23
|
- [Timer Picker Modal (Dark Mode) 🌚](#timer-picker-modal-dark-mode-)
|
|
@@ -30,6 +35,7 @@ Works with Expo and bare React Native apps.
|
|
|
30
35
|
- [Contributing 🧑🤝🧑](#contributing-)
|
|
31
36
|
- [Dev Setup](#dev-setup)
|
|
32
37
|
- [GitHub Guidelines](#github-guidelines)
|
|
38
|
+
- [Limitations ⚠](#limitations-)
|
|
33
39
|
- [License 📝](#license-)
|
|
34
40
|
|
|
35
41
|
<br>
|
|
@@ -53,6 +59,8 @@ Works with Expo and bare React Native apps.
|
|
|
53
59
|
|
|
54
60
|
This component will work in your React Native Project **without any peer dependencies**.
|
|
55
61
|
|
|
62
|
+
### Linear Gradient
|
|
63
|
+
|
|
56
64
|
If you want the numbers to fade in/out at the top and bottom of the picker, you will need to install either:
|
|
57
65
|
|
|
58
66
|
- [expo-linear-gradient](https://www.npmjs.com/package/expo-linear-gradient) (if using Expo)
|
|
@@ -60,6 +68,22 @@ If you want the numbers to fade in/out at the top and bottom of the picker, you
|
|
|
60
68
|
|
|
61
69
|
**To enable the linear gradient, you need to supply the component as a prop to either TimerPickerModal or TimerPicker.**
|
|
62
70
|
|
|
71
|
+
### Haptic Feedback
|
|
72
|
+
|
|
73
|
+
This is currently only supported on Expo with the [expo-haptics](https://www.npmjs.com/package/expo-haptics) module:
|
|
74
|
+
|
|
75
|
+
`import * as Haptics from "expo-haptics";`
|
|
76
|
+
|
|
77
|
+
**To enable the haptic feedback, you need to supply the imported `Haptics` as a prop to either TimerPickerModal or TimerPicker.**
|
|
78
|
+
|
|
79
|
+
### Audio Feedback (Click Sound)
|
|
80
|
+
|
|
81
|
+
This is currently only supported on Expo with the [expo-av](https://www.npmjs.com/package/expo-av) module:
|
|
82
|
+
|
|
83
|
+
`import { Audio } from "expo-av";`
|
|
84
|
+
|
|
85
|
+
**To enable the audio feedback, you need to supply the imported `Audio` as a prop to either TimerPickerModal or TimerPicker.**
|
|
86
|
+
|
|
63
87
|
<br>
|
|
64
88
|
|
|
65
89
|
## Installation 🚀
|
|
@@ -87,6 +111,8 @@ yarn add react-native-timer-picker
|
|
|
87
111
|
```jsx
|
|
88
112
|
import { TimerPickerModal } from "react-native-timer-picker";
|
|
89
113
|
import { LinearGradient } from "expo-linear-gradient"; // or `import LinearGradient from "react-native-linear-gradient"`
|
|
114
|
+
import { Audio } from "expo-av"; // for audio feedback (click sound as you scroll)
|
|
115
|
+
import * as Haptics from "expo-haptics"; // for haptic feedback
|
|
90
116
|
|
|
91
117
|
....
|
|
92
118
|
const [showPicker, setShowPicker] = useState(false);
|
|
@@ -141,7 +167,9 @@ return (
|
|
|
141
167
|
modalTitle="Set Alarm"
|
|
142
168
|
onCancel={() => setShowPicker(false)}
|
|
143
169
|
closeOnOverlayPress
|
|
170
|
+
Audio={Audio}
|
|
144
171
|
LinearGradient={LinearGradient}
|
|
172
|
+
Haptics={Haptics}
|
|
145
173
|
styles={{
|
|
146
174
|
theme: "dark",
|
|
147
175
|
}}
|
|
@@ -161,6 +189,8 @@ return (
|
|
|
161
189
|
```jsx
|
|
162
190
|
import { TimerPickerModal } from "react-native-timer-picker";
|
|
163
191
|
import { LinearGradient } from "expo-linear-gradient"; // or `import LinearGradient from "react-native-linear-gradient"`
|
|
192
|
+
import { Audio } from "expo-av"; // for audio feedback (click sound as you scroll)
|
|
193
|
+
import * as Haptics from "expo-haptics"; // for haptic feedback
|
|
164
194
|
|
|
165
195
|
....
|
|
166
196
|
const [showPicker, setShowPicker] = useState(false);
|
|
@@ -215,7 +245,10 @@ return (
|
|
|
215
245
|
onCancel={() => setShowPicker(false)}
|
|
216
246
|
closeOnOverlayPress
|
|
217
247
|
use12HourPicker
|
|
248
|
+
Audio={Audio}
|
|
249
|
+
clickSoundAsset={require("./assets/custom_click.mp3")}
|
|
218
250
|
LinearGradient={LinearGradient}
|
|
251
|
+
Haptics={Haptics}
|
|
219
252
|
styles={{
|
|
220
253
|
theme: "light",
|
|
221
254
|
}}
|
|
@@ -232,6 +265,8 @@ return (
|
|
|
232
265
|
```jsx
|
|
233
266
|
import { TimerPicker } from "react-native-timer-picker";
|
|
234
267
|
import { LinearGradient } from "expo-linear-gradient"; // or `import LinearGradient from "react-native-linear-gradient"`
|
|
268
|
+
import { Audio } from "expo-av"; // for audio feedback (click sound as you scroll)
|
|
269
|
+
import * as Haptics from "expo-haptics"; // for haptic feedback
|
|
235
270
|
|
|
236
271
|
....
|
|
237
272
|
const [showPicker, setShowPicker] = useState(false);
|
|
@@ -246,7 +281,9 @@ return (
|
|
|
246
281
|
hourLabel=":"
|
|
247
282
|
minuteLabel=":"
|
|
248
283
|
secondLabel=""
|
|
284
|
+
Audio={Audio}
|
|
249
285
|
LinearGradient={LinearGradient}
|
|
286
|
+
Haptics={Haptics}
|
|
250
287
|
styles={{
|
|
251
288
|
theme: "dark",
|
|
252
289
|
backgroundColor: "#202020",
|
|
@@ -284,6 +321,8 @@ return (
|
|
|
284
321
|
```jsx
|
|
285
322
|
import { TimerPicker } from "react-native-timer-picker";
|
|
286
323
|
import { LinearGradient } from "expo-linear-gradient"; // or `import LinearGradient from "react-native-linear-gradient"`
|
|
324
|
+
import { Audio } from "expo-av"; // for audio feedback (click sound as you scroll)
|
|
325
|
+
import * as Haptics from "expo-haptics"; // for haptic feedback
|
|
287
326
|
|
|
288
327
|
....
|
|
289
328
|
const [showPicker, setShowPicker] = useState(false);
|
|
@@ -298,7 +337,9 @@ return (
|
|
|
298
337
|
hideHours
|
|
299
338
|
minuteLabel="min"
|
|
300
339
|
secondLabel="sec"
|
|
340
|
+
Audio={Audio}
|
|
301
341
|
LinearGradient={LinearGradient}
|
|
342
|
+
Haptics={Haptics}
|
|
302
343
|
styles={{
|
|
303
344
|
theme: "light",
|
|
304
345
|
pickerItem: {
|
|
@@ -332,18 +373,16 @@ return (
|
|
|
332
373
|
| Prop | Description | Type | Default | Required |
|
|
333
374
|
| :------------------------------: | :------------------------------------------------------------------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----: | :------: |
|
|
334
375
|
| onDurationChange | Callback when the duration changes | `(duration: { hours: number, minutes: number, seconds: number }) => void` | - | false |
|
|
335
|
-
|
|
|
336
|
-
| initialMinutes | Initial value for minutes | Number | - | false |
|
|
337
|
-
| initialSeconds | Initial value for seconds | Number | - | false |
|
|
376
|
+
| initialValue | Initial value for the picker | `{ hours?: number, minutes?: number, seconds?: number }` | - | false |
|
|
338
377
|
| hideHours | Hide the hours picker | Boolean | false | false |
|
|
339
378
|
| hideMinutes | Hide the minutes picker | Boolean | false | false |
|
|
340
379
|
| hideSeconds | Hide the seconds picker | Boolean | false | false |
|
|
341
380
|
| hoursPickerIsDisabled | Disable the hours picker picker | Boolean | false | false |
|
|
342
381
|
| minutesPickerIsDisabled | Disable the minutes picker picker | Boolean | false | false |
|
|
343
382
|
| secondsPickerIsDisabled | Disable the seconds picker picker | Boolean | false | false |
|
|
344
|
-
| hourLimit | Limit on the hours it is possible to select |
|
|
345
|
-
| minuteLimit | Limit on the minutes it is possible to select |
|
|
346
|
-
| secondLimit | Limit on the seconds it is possible to select |
|
|
383
|
+
| hourLimit | Limit on the hours it is possible to select | `{ max?: Number, min?: Number }` | - | false |
|
|
384
|
+
| minuteLimit | Limit on the minutes it is possible to select | `{ max?: Number, min?: Number }` | - | false |
|
|
385
|
+
| secondLimit | Limit on the seconds it is possible to select | `{ max?: Number, min?: Number }` | - | false |
|
|
347
386
|
| hourLabel | Label for the hours picker | String \| React.ReactElement | h | false |
|
|
348
387
|
| minuteLabel | Label for the minutes picker | String \| React.ReactElement | m | false |
|
|
349
388
|
| secondLabel | Label for the seconds picker | String \| React.ReactElement | s | false |
|
|
@@ -355,6 +394,8 @@ return (
|
|
|
355
394
|
| pmLabel | Set the PM label if using the 12-hour picker | String | pm | false |
|
|
356
395
|
| disableInfiniteScroll | Disable the infinite scroll feature | Boolean | false | false |
|
|
357
396
|
| LinearGradient | Linear Gradient Component | [expo-linear-gradient](https://www.npmjs.com/package/expo-linear-gradient).LinearGradient or [react-native-linear-gradient](https://www.npmjs.com/package/react-native-linear-gradient).default | - | false |
|
|
397
|
+
| Audio | Audio Class | [expo-av](https://www.npmjs.com/package/expo-av).Audio | - | false |
|
|
398
|
+
| Haptics | Haptics Namespace | [expo-haptics](https://www.npmjs.com/package/expo-haptics) | - | false |
|
|
358
399
|
| pickerContainerProps | Props for the picker container | `React.ComponentProps<typeof View>` | - | false |
|
|
359
400
|
| pickerGradientOverlayProps | Props for both gradient overlays | `Partial<LinearGradientProps>` | - | false |
|
|
360
401
|
| topPickerGradientOverlayProps | Props for the top gradient overlay | `Partial<LinearGradientProps>` | - | false |
|
|
@@ -363,23 +404,25 @@ return (
|
|
|
363
404
|
|
|
364
405
|
#### Custom Styles 👗
|
|
365
406
|
|
|
366
|
-
The following custom styles can be supplied to re-style the component in any way. Various styles are applied by default - you can take a look at these [here](src/components/TimerPicker/
|
|
367
|
-
|
|
368
|
-
| Style Prop | Description |
|
|
369
|
-
| :---------------------: | :------------------------------------------- |
|
|
370
|
-
| theme | Theme of the component |
|
|
371
|
-
| backgroundColor | Main background color |
|
|
372
|
-
| text | Base text style |
|
|
373
|
-
| pickerContainer | Main container for the picker |
|
|
374
|
-
| pickerLabelContainer | Container for the picker's labels |
|
|
375
|
-
| pickerLabel | Style for the picker's labels |
|
|
376
|
-
| pickerAmPmContainer | Style for the picker's labels |
|
|
377
|
-
| pickerAmPmLabel | Style for the picker's labels |
|
|
378
|
-
| pickerItemContainer | Container for each number in the picker | ViewStyle
|
|
379
|
-
| pickerItem | Style for each individual picker number |
|
|
380
|
-
| disabledPickerItem | Style for any numbers outside any set limits |
|
|
381
|
-
| disabledPickerContainer | Style for disabled pickers |
|
|
382
|
-
| pickerGradientOverlay | Style for the gradient overlay (fade out) |
|
|
407
|
+
The following custom styles can be supplied to re-style the component in any way. Various styles are applied by default - you can take a look at these [here](src/components/TimerPicker/styles.ts).
|
|
408
|
+
|
|
409
|
+
| Style Prop | Description | Type |
|
|
410
|
+
| :---------------------: | :------------------------------------------- | :--------------------------------------: |
|
|
411
|
+
| theme | Theme of the component | "light" \| "dark" |
|
|
412
|
+
| backgroundColor | Main background color | string |
|
|
413
|
+
| text | Base text style | TextStyle |
|
|
414
|
+
| pickerContainer | Main container for the picker | ViewStyle & { backgroundColor?: string } |
|
|
415
|
+
| pickerLabelContainer | Container for the picker's labels | ViewStyle |
|
|
416
|
+
| pickerLabel | Style for the picker's labels | TextStyle |
|
|
417
|
+
| pickerAmPmContainer | Style for the picker's labels | ViewStyle |
|
|
418
|
+
| pickerAmPmLabel | Style for the picker's labels | TextStyle |
|
|
419
|
+
| pickerItemContainer | Container for each number in the picker | ViewStyle & { height?: number } |
|
|
420
|
+
| pickerItem | Style for each individual picker number | TextStyle |
|
|
421
|
+
| disabledPickerItem | Style for any numbers outside any set limits | TextStyle |
|
|
422
|
+
| disabledPickerContainer | Style for disabled pickers | ViewStyle |
|
|
423
|
+
| pickerGradientOverlay | Style for the gradient overlay (fade out) | ViewStyle |
|
|
424
|
+
|
|
425
|
+
Note the minor limitations to the allowed styles for `pickerContainer` and `pickerItemContainer`. These are made because these styles are used for internal calculations and all possible `backgroundColor`/`height` types are not supported.
|
|
383
426
|
|
|
384
427
|
### TimerPickerModal ⏰
|
|
385
428
|
|
|
@@ -406,7 +449,7 @@ The TimerPickerModal component accepts all [TimerPicker props](#timerpicker-️)
|
|
|
406
449
|
|
|
407
450
|
#### Custom Styles 👕
|
|
408
451
|
|
|
409
|
-
The following custom styles can be supplied to re-style the component in any way. You can also supply all of the styles specified in [CustomTimerPickerStyles](#custom-styles-). Various styles are applied by default - you can take a look at these [here](src/components/TimerPickerModal
|
|
452
|
+
The following custom styles can be supplied to re-style the component in any way. You can also supply all of the styles specified in [CustomTimerPickerStyles](#custom-styles-). Various styles are applied by default - you can take a look at these [here](src/components/TimerPickerModal/styles.ts).
|
|
410
453
|
|
|
411
454
|
| Style Prop | Description | Type |
|
|
412
455
|
| :--------------: | :----------------------------------------- | :-------: |
|
|
@@ -486,6 +529,12 @@ There are two permenant branches: `main` and `develop`. You should never work di
|
|
|
486
529
|
|
|
487
530
|
<br>
|
|
488
531
|
|
|
532
|
+
## Limitations ⚠
|
|
533
|
+
|
|
534
|
+
Nesting the `TimerPicker` component inside a vertical ScrollView is not supported. React Native will throw an error and the picker will not be scrollable. The modal component works fine in this scenario however.
|
|
535
|
+
|
|
536
|
+
<br>
|
|
537
|
+
|
|
489
538
|
## License 📝
|
|
490
539
|
|
|
491
540
|
This project is licensed under the [MIT License](LICENSE).
|
|
Binary file
|
|
@@ -6,37 +6,39 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
var _react = _interopRequireWildcard(require("react"));
|
|
8
8
|
var _reactNative = require("react-native");
|
|
9
|
-
var _generateNumbers = require("../../utils/generateNumbers");
|
|
10
9
|
var _colorToRgba = require("../../utils/colorToRgba");
|
|
10
|
+
var _generateNumbers = require("../../utils/generateNumbers");
|
|
11
11
|
var _getAdjustedLimit = require("../../utils/getAdjustedLimit");
|
|
12
12
|
var _getScrollIndex = require("../../utils/getScrollIndex");
|
|
13
13
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
14
14
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
15
15
|
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); }
|
|
16
|
-
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
16
|
+
const DurationScroll = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
|
|
17
|
+
const {
|
|
18
|
+
aggressivelyGetLatestDuration,
|
|
19
|
+
allowFontScaling = false,
|
|
20
|
+
amLabel,
|
|
21
|
+
Audio,
|
|
22
|
+
bottomPickerGradientOverlayProps,
|
|
23
|
+
clickSoundAsset,
|
|
24
|
+
disableInfiniteScroll = false,
|
|
25
|
+
Haptics,
|
|
26
|
+
initialValue = 0,
|
|
27
|
+
is12HourPicker,
|
|
28
|
+
isDisabled,
|
|
29
|
+
label,
|
|
30
|
+
limit,
|
|
31
|
+
LinearGradient,
|
|
32
|
+
numberOfItems,
|
|
33
|
+
onDurationChange,
|
|
34
|
+
padNumbersWithZero = false,
|
|
35
|
+
padWithNItems,
|
|
36
|
+
pickerGradientOverlayProps,
|
|
37
|
+
pmLabel,
|
|
38
|
+
styles,
|
|
39
|
+
testID,
|
|
40
|
+
topPickerGradientOverlayProps
|
|
41
|
+
} = props;
|
|
40
42
|
const data = !is12HourPicker ? (0, _generateNumbers.generateNumbers)(numberOfItems, {
|
|
41
43
|
padNumbersWithZero,
|
|
42
44
|
repeatNTimes: 3,
|
|
@@ -56,8 +58,34 @@ const DurationScroll = /*#__PURE__*/(0, _react.forwardRef)(({
|
|
|
56
58
|
padWithNItems,
|
|
57
59
|
disableInfiniteScroll
|
|
58
60
|
});
|
|
61
|
+
|
|
62
|
+
// keep track of the latest duration as it scrolls
|
|
59
63
|
const latestDuration = (0, _react.useRef)(0);
|
|
64
|
+
// keep track of the last index scrolled past for haptic/audio feedback
|
|
65
|
+
const lastFeedbackIndex = (0, _react.useRef)(0);
|
|
60
66
|
const flatListRef = (0, _react.useRef)(null);
|
|
67
|
+
const [clickSound, setClickSound] = (0, _react.useState)();
|
|
68
|
+
|
|
69
|
+
// Preload the sound when the component mounts
|
|
70
|
+
(0, _react.useEffect)(() => {
|
|
71
|
+
const loadSound = async () => {
|
|
72
|
+
if (Audio) {
|
|
73
|
+
const {
|
|
74
|
+
sound
|
|
75
|
+
} = await Audio.Sound.createAsync(clickSoundAsset ?? require("../../assets/select_click.mp3"), {
|
|
76
|
+
shouldPlay: false
|
|
77
|
+
});
|
|
78
|
+
setClickSound(sound);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
loadSound();
|
|
82
|
+
|
|
83
|
+
// Unload sound when component unmounts
|
|
84
|
+
return () => {
|
|
85
|
+
clickSound === null || clickSound === void 0 || clickSound.unloadAsync();
|
|
86
|
+
};
|
|
87
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
88
|
+
}, [Audio]);
|
|
61
89
|
(0, _react.useImperativeHandle)(ref, () => ({
|
|
62
90
|
reset: options => {
|
|
63
91
|
var _flatListRef$current;
|
|
@@ -101,28 +129,50 @@ const DurationScroll = /*#__PURE__*/(0, _react.forwardRef)(({
|
|
|
101
129
|
allowFontScaling: allowFontScaling,
|
|
102
130
|
style: [styles.pickerItem, intItem > adjustedLimited.max || intItem < adjustedLimited.min ? styles.disabledPickerItem : {}]
|
|
103
131
|
}, stringItem), is12HourPicker ? /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
104
|
-
|
|
105
|
-
|
|
132
|
+
pointerEvents: "none",
|
|
133
|
+
style: styles.pickerAmPmContainer
|
|
106
134
|
}, /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
|
|
107
|
-
|
|
108
|
-
|
|
135
|
+
allowFontScaling: allowFontScaling,
|
|
136
|
+
style: [styles.pickerAmPmLabel]
|
|
109
137
|
}, isAm ? amLabel : pmLabel)) : null);
|
|
110
138
|
}, [adjustedLimited.max, adjustedLimited.min, allowFontScaling, amLabel, is12HourPicker, pmLabel, styles.disabledPickerItem, styles.pickerAmPmContainer, styles.pickerAmPmLabel, styles.pickerItem, styles.pickerItemContainer]);
|
|
111
139
|
const onScroll = (0, _react.useCallback)(e => {
|
|
112
|
-
// this function is only used when the picker is in a modal
|
|
140
|
+
// this function is only used when the picker is in a modal and/or has Haptic/Audio feedback
|
|
113
141
|
// it is used to ensure that the modal gets the latest duration on clicking
|
|
114
142
|
// the confirm button, even if the scrollview is still scrolling
|
|
115
|
-
|
|
116
|
-
|
|
143
|
+
if (!aggressivelyGetLatestDuration && !Haptics && !Audio) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
if (aggressivelyGetLatestDuration) {
|
|
147
|
+
const newIndex = Math.round(e.nativeEvent.contentOffset.y / styles.pickerItemContainer.height);
|
|
148
|
+
let newDuration = (disableInfiniteScroll ? newIndex : newIndex + padWithNItems) % (numberOfItems + 1);
|
|
149
|
+
if (newDuration !== latestDuration.current) {
|
|
150
|
+
// check limits
|
|
151
|
+
if (newDuration > adjustedLimited.max) {
|
|
152
|
+
newDuration = adjustedLimited.max;
|
|
153
|
+
} else if (newDuration < adjustedLimited.min) {
|
|
154
|
+
newDuration = adjustedLimited.min;
|
|
155
|
+
}
|
|
156
|
+
latestDuration.current = newDuration;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (Haptics || Audio) {
|
|
160
|
+
const feedbackIndex = Math.round((e.nativeEvent.contentOffset.y + styles.pickerItemContainer.height / 2) / styles.pickerItemContainer.height);
|
|
161
|
+
if (feedbackIndex !== lastFeedbackIndex.current) {
|
|
162
|
+
// this check stops the feedback firing when the component mounts
|
|
163
|
+
if (lastFeedbackIndex.current) {
|
|
164
|
+
// fire haptic feedback if available
|
|
165
|
+
Haptics === null || Haptics === void 0 || Haptics.selectionAsync();
|
|
117
166
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
167
|
+
// play click sound if available
|
|
168
|
+
clickSound === null || clickSound === void 0 || clickSound.replayAsync();
|
|
169
|
+
}
|
|
170
|
+
lastFeedbackIndex.current = feedbackIndex;
|
|
171
|
+
}
|
|
123
172
|
}
|
|
124
|
-
|
|
125
|
-
|
|
173
|
+
},
|
|
174
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
175
|
+
[adjustedLimited.max, adjustedLimited.min, aggressivelyGetLatestDuration, clickSound, disableInfiniteScroll, numberOfItems, padWithNItems, styles.pickerItemContainer.height]);
|
|
126
176
|
const onMomentumScrollEnd = (0, _react.useCallback)(e => {
|
|
127
177
|
const newIndex = Math.round(e.nativeEvent.contentOffset.y / styles.pickerItemContainer.height);
|
|
128
178
|
let newDuration = (disableInfiniteScroll ? newIndex : newIndex + padWithNItems) % (numberOfItems + 1);
|
|
@@ -181,35 +231,35 @@ const DurationScroll = /*#__PURE__*/(0, _react.forwardRef)(({
|
|
|
181
231
|
onViewableItemsChanged: onViewableItemsChanged
|
|
182
232
|
}]);
|
|
183
233
|
return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
184
|
-
testID: testID,
|
|
185
234
|
pointerEvents: isDisabled ? "none" : undefined,
|
|
186
235
|
style: [{
|
|
187
236
|
height: styles.pickerItemContainer.height * numberOfItemsToShow,
|
|
188
237
|
overflow: "visible"
|
|
189
|
-
}, isDisabled && styles.disabledPickerContainer]
|
|
238
|
+
}, isDisabled && styles.disabledPickerContainer],
|
|
239
|
+
testID: testID
|
|
190
240
|
}, /*#__PURE__*/_react.default.createElement(_reactNative.FlatList, {
|
|
191
241
|
ref: flatListRef,
|
|
192
242
|
data: data,
|
|
243
|
+
decelerationRate: 0.88,
|
|
193
244
|
getItemLayout: getItemLayout,
|
|
194
245
|
initialScrollIndex: initialScrollIndex,
|
|
195
|
-
|
|
246
|
+
keyExtractor: (_, index) => index.toString(),
|
|
247
|
+
onMomentumScrollEnd: onMomentumScrollEnd,
|
|
248
|
+
onScroll: onScroll,
|
|
196
249
|
renderItem: renderItem,
|
|
197
|
-
|
|
198
|
-
showsVerticalScrollIndicator: false,
|
|
199
|
-
decelerationRate: 0.88,
|
|
250
|
+
scrollEnabled: !isDisabled,
|
|
200
251
|
scrollEventThrottle: 16,
|
|
201
|
-
|
|
202
|
-
|
|
252
|
+
showsVerticalScrollIndicator: false,
|
|
253
|
+
snapToAlignment: "start"
|
|
203
254
|
// used in place of snapToOffset due to bug on Android
|
|
204
255
|
,
|
|
205
256
|
snapToOffsets: [...Array(data.length)].map((_, i) => i * styles.pickerItemContainer.height),
|
|
257
|
+
testID: "duration-scroll-flatlist",
|
|
206
258
|
viewabilityConfigCallbackPairs: !disableInfiniteScroll ? viewabilityConfigCallbackPairs === null || viewabilityConfigCallbackPairs === void 0 ? void 0 : viewabilityConfigCallbackPairs.current : undefined,
|
|
207
|
-
|
|
208
|
-
onScroll: aggressivelyGetLatestDuration ? onScroll : undefined,
|
|
209
|
-
testID: "duration-scroll-flatlist"
|
|
259
|
+
windowSize: numberOfItemsToShow
|
|
210
260
|
}), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
|
|
211
|
-
|
|
212
|
-
|
|
261
|
+
pointerEvents: "none",
|
|
262
|
+
style: styles.pickerLabelContainer
|
|
213
263
|
}, typeof label === "string" ? /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
|
|
214
264
|
allowFontScaling: allowFontScaling,
|
|
215
265
|
style: styles.pickerLabel
|
|
@@ -218,15 +268,15 @@ const DurationScroll = /*#__PURE__*/(0, _react.forwardRef)(({
|
|
|
218
268
|
color: styles.pickerContainer.backgroundColor ?? "white",
|
|
219
269
|
opacity: 0
|
|
220
270
|
})],
|
|
221
|
-
start: {
|
|
222
|
-
x: 1,
|
|
223
|
-
y: 0.3
|
|
224
|
-
},
|
|
225
271
|
end: {
|
|
226
272
|
x: 1,
|
|
227
273
|
y: 1
|
|
228
274
|
},
|
|
229
|
-
pointerEvents: "none"
|
|
275
|
+
pointerEvents: "none",
|
|
276
|
+
start: {
|
|
277
|
+
x: 1,
|
|
278
|
+
y: 0.3
|
|
279
|
+
}
|
|
230
280
|
}, pickerGradientOverlayProps, topPickerGradientOverlayProps, {
|
|
231
281
|
style: [styles.pickerGradientOverlay, {
|
|
232
282
|
top: 0
|
|
@@ -236,15 +286,15 @@ const DurationScroll = /*#__PURE__*/(0, _react.forwardRef)(({
|
|
|
236
286
|
color: styles.pickerContainer.backgroundColor ?? "white",
|
|
237
287
|
opacity: 0
|
|
238
288
|
}), styles.pickerContainer.backgroundColor ?? "white"],
|
|
239
|
-
start: {
|
|
240
|
-
x: 1,
|
|
241
|
-
y: 0
|
|
242
|
-
},
|
|
243
289
|
end: {
|
|
244
290
|
x: 1,
|
|
245
291
|
y: 0.7
|
|
246
292
|
},
|
|
247
|
-
pointerEvents: "none"
|
|
293
|
+
pointerEvents: "none",
|
|
294
|
+
start: {
|
|
295
|
+
x: 1,
|
|
296
|
+
y: 0
|
|
297
|
+
}
|
|
248
298
|
}, pickerGradientOverlayProps, bottomPickerGradientOverlayProps, {
|
|
249
299
|
style: [styles.pickerGradientOverlay, {
|
|
250
300
|
bottom: -1
|
|
@@ -252,4 +302,4 @@ const DurationScroll = /*#__PURE__*/(0, _react.forwardRef)(({
|
|
|
252
302
|
}))) : null);
|
|
253
303
|
});
|
|
254
304
|
var _default = exports.default = /*#__PURE__*/_react.default.memo(DurationScroll);
|
|
255
|
-
//# sourceMappingURL=
|
|
305
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_colorToRgba","_generateNumbers","_getAdjustedLimit","_getScrollIndex","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","_extends","assign","bind","target","arguments","length","source","key","apply","DurationScroll","forwardRef","props","ref","aggressivelyGetLatestDuration","allowFontScaling","amLabel","Audio","bottomPickerGradientOverlayProps","clickSoundAsset","disableInfiniteScroll","Haptics","initialValue","is12HourPicker","isDisabled","label","limit","LinearGradient","numberOfItems","onDurationChange","padNumbersWithZero","padWithNItems","pickerGradientOverlayProps","pmLabel","styles","testID","topPickerGradientOverlayProps","data","generateNumbers","repeatNTimes","generate12HourNumbers","numberOfItemsToShow","adjustedLimited","getAdjustedLimit","initialScrollIndex","getScrollIndex","value","latestDuration","useRef","lastFeedbackIndex","flatListRef","clickSound","setClickSound","useState","useEffect","loadSound","sound","Sound","createAsync","shouldPlay","unloadAsync","useImperativeHandle","reset","options","_flatListRef$current","current","scrollToIndex","animated","index","setValue","_flatListRef$current2","renderItem","useCallback","item","stringItem","intItem","isAm","parseInt","includes","replace","createElement","View","style","pickerItemContainer","Text","pickerItem","max","min","disabledPickerItem","pointerEvents","pickerAmPmContainer","pickerAmPmLabel","onScroll","newIndex","Math","round","nativeEvent","contentOffset","y","height","newDuration","feedbackIndex","selectionAsync","replayAsync","onMomentumScrollEnd","_flatListRef$current3","targetScrollIndex","_flatListRef$current4","onViewableItemsChanged","viewableItems","_viewableItems$","_viewableItems$2","_flatListRef$current5","_flatListRef$current6","getItemLayout","_","offset","viewabilityConfigCallbackPairs","viewabilityConfig","viewAreaCoveragePercentThreshold","undefined","overflow","disabledPickerContainer","FlatList","decelerationRate","keyExtractor","toString","scrollEnabled","scrollEventThrottle","showsVerticalScrollIndicator","snapToAlignment","snapToOffsets","Array","map","windowSize","pickerLabelContainer","pickerLabel","Fragment","colors","pickerContainer","backgroundColor","colorToRgba","color","opacity","end","x","start","pickerGradientOverlay","top","bottom","_default","exports","React","memo"],"sources":["index.tsx"],"sourcesContent":["import React, {\n useRef,\n useCallback,\n forwardRef,\n useImperativeHandle,\n useState,\n useEffect,\n} from \"react\";\n\nimport { View, Text, FlatList } from \"react-native\";\nimport type {\n ViewabilityConfigCallbackPairs,\n ViewToken,\n NativeSyntheticEvent,\n NativeScrollEvent,\n} from \"react-native\";\n\nimport { colorToRgba } from \"../../utils/colorToRgba\";\nimport {\n generate12HourNumbers,\n generateNumbers,\n} from \"../../utils/generateNumbers\";\nimport { getAdjustedLimit } from \"../../utils/getAdjustedLimit\";\nimport { getScrollIndex } from \"../../utils/getScrollIndex\";\n\nimport type { DurationScrollProps, DurationScrollRef } from \"./types\";\n\nconst DurationScroll = forwardRef<DurationScrollRef, DurationScrollProps>(\n (props, ref) => {\n const {\n aggressivelyGetLatestDuration,\n allowFontScaling = false,\n amLabel,\n Audio,\n bottomPickerGradientOverlayProps,\n clickSoundAsset,\n disableInfiniteScroll = false,\n Haptics,\n initialValue = 0,\n is12HourPicker,\n isDisabled,\n label,\n limit,\n LinearGradient,\n numberOfItems,\n onDurationChange,\n padNumbersWithZero = false,\n padWithNItems,\n pickerGradientOverlayProps,\n pmLabel,\n styles,\n testID,\n topPickerGradientOverlayProps,\n } = props;\n\n const data = !is12HourPicker\n ? generateNumbers(numberOfItems, {\n padNumbersWithZero,\n repeatNTimes: 3,\n disableInfiniteScroll,\n padWithNItems,\n })\n : generate12HourNumbers({\n padNumbersWithZero,\n repeatNTimes: 3,\n disableInfiniteScroll,\n padWithNItems,\n });\n\n const numberOfItemsToShow = 1 + padWithNItems * 2;\n\n const adjustedLimited = getAdjustedLimit(limit, numberOfItems);\n\n const initialScrollIndex = getScrollIndex({\n value: initialValue,\n numberOfItems,\n padWithNItems,\n disableInfiniteScroll,\n });\n\n // keep track of the latest duration as it scrolls\n const latestDuration = useRef(0);\n // keep track of the last index scrolled past for haptic/audio feedback\n const lastFeedbackIndex = useRef(0);\n\n const flatListRef = useRef<FlatList | null>(null);\n\n const [clickSound, setClickSound] = useState<\n | {\n replayAsync: () => Promise<void>;\n unloadAsync: () => Promise<void>;\n }\n | undefined\n >();\n\n // Preload the sound when the component mounts\n useEffect(() => {\n const loadSound = async () => {\n if (Audio) {\n const { sound } = await Audio.Sound.createAsync(\n clickSoundAsset ??\n require(\"../../assets/select_click.mp3\"),\n { shouldPlay: false }\n );\n setClickSound(sound);\n }\n };\n loadSound();\n\n // Unload sound when component unmounts\n return () => {\n clickSound?.unloadAsync();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [Audio]);\n\n useImperativeHandle(ref, () => ({\n reset: (options) => {\n flatListRef.current?.scrollToIndex({\n animated: options?.animated ?? false,\n index: initialScrollIndex,\n });\n },\n setValue: (value, options) => {\n flatListRef.current?.scrollToIndex({\n animated: options?.animated ?? false,\n index: getScrollIndex({\n value: value,\n numberOfItems,\n padWithNItems,\n disableInfiniteScroll,\n }),\n });\n },\n latestDuration: latestDuration,\n }));\n\n const renderItem = useCallback(\n ({ item }: { item: string }) => {\n let stringItem = item;\n let intItem: number;\n let isAm: boolean | undefined;\n\n if (!is12HourPicker) {\n intItem = parseInt(item);\n } else {\n isAm = item.includes(\"AM\");\n stringItem = item.replace(/\\s[AP]M/g, \"\");\n intItem = parseInt(stringItem);\n }\n\n return (\n <View\n key={item}\n style={styles.pickerItemContainer}\n testID=\"picker-item\">\n <Text\n allowFontScaling={allowFontScaling}\n style={[\n styles.pickerItem,\n intItem > adjustedLimited.max ||\n intItem < adjustedLimited.min\n ? styles.disabledPickerItem\n : {},\n ]}>\n {stringItem}\n </Text>\n {is12HourPicker ? (\n <View\n pointerEvents=\"none\"\n style={styles.pickerAmPmContainer}>\n <Text\n allowFontScaling={allowFontScaling}\n style={[styles.pickerAmPmLabel]}>\n {isAm ? amLabel : pmLabel}\n </Text>\n </View>\n ) : null}\n </View>\n );\n },\n [\n adjustedLimited.max,\n adjustedLimited.min,\n allowFontScaling,\n amLabel,\n is12HourPicker,\n pmLabel,\n styles.disabledPickerItem,\n styles.pickerAmPmContainer,\n styles.pickerAmPmLabel,\n styles.pickerItem,\n styles.pickerItemContainer,\n ]\n );\n\n const onScroll = useCallback(\n (e: NativeSyntheticEvent<NativeScrollEvent>) => {\n // this function is only used when the picker is in a modal and/or has Haptic/Audio feedback\n // it is used to ensure that the modal gets the latest duration on clicking\n // the confirm button, even if the scrollview is still scrolling\n if (!aggressivelyGetLatestDuration && !Haptics && !Audio) {\n return;\n }\n\n if (aggressivelyGetLatestDuration) {\n const newIndex = Math.round(\n e.nativeEvent.contentOffset.y /\n styles.pickerItemContainer.height\n );\n let newDuration =\n (disableInfiniteScroll\n ? newIndex\n : newIndex + padWithNItems) %\n (numberOfItems + 1);\n\n if (newDuration !== latestDuration.current) {\n // check limits\n if (newDuration > adjustedLimited.max) {\n newDuration = adjustedLimited.max;\n } else if (newDuration < adjustedLimited.min) {\n newDuration = adjustedLimited.min;\n }\n\n latestDuration.current = newDuration;\n }\n }\n\n if (Haptics || Audio) {\n const feedbackIndex = Math.round(\n (e.nativeEvent.contentOffset.y +\n styles.pickerItemContainer.height / 2) /\n styles.pickerItemContainer.height\n );\n\n if (feedbackIndex !== lastFeedbackIndex.current) {\n // this check stops the feedback firing when the component mounts\n if (lastFeedbackIndex.current) {\n // fire haptic feedback if available\n Haptics?.selectionAsync();\n\n // play click sound if available\n clickSound?.replayAsync();\n }\n\n lastFeedbackIndex.current = feedbackIndex;\n }\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n adjustedLimited.max,\n adjustedLimited.min,\n aggressivelyGetLatestDuration,\n clickSound,\n disableInfiniteScroll,\n numberOfItems,\n padWithNItems,\n styles.pickerItemContainer.height,\n ]\n );\n\n const onMomentumScrollEnd = useCallback(\n (e: NativeSyntheticEvent<NativeScrollEvent>) => {\n const newIndex = Math.round(\n e.nativeEvent.contentOffset.y /\n styles.pickerItemContainer.height\n );\n let newDuration =\n (disableInfiniteScroll\n ? newIndex\n : newIndex + padWithNItems) %\n (numberOfItems + 1);\n\n // check limits\n if (newDuration > adjustedLimited.max) {\n const targetScrollIndex =\n newIndex - (newDuration - adjustedLimited.max);\n flatListRef.current?.scrollToIndex({\n animated: true,\n index:\n // guard against scrolling beyond end of list\n targetScrollIndex >= 0\n ? targetScrollIndex\n : adjustedLimited.max - 1,\n }); // scroll down to max\n newDuration = adjustedLimited.max;\n } else if (newDuration < adjustedLimited.min) {\n const targetScrollIndex =\n newIndex + (adjustedLimited.min - newDuration);\n flatListRef.current?.scrollToIndex({\n animated: true,\n index:\n // guard against scrolling beyond end of list\n targetScrollIndex <= data.length - 1\n ? targetScrollIndex\n : adjustedLimited.min,\n }); // scroll up to min\n newDuration = adjustedLimited.min;\n }\n\n onDurationChange(newDuration);\n },\n [\n adjustedLimited.max,\n adjustedLimited.min,\n data.length,\n disableInfiniteScroll,\n numberOfItems,\n onDurationChange,\n padWithNItems,\n styles.pickerItemContainer.height,\n ]\n );\n\n const onViewableItemsChanged = useCallback(\n ({ viewableItems }: { viewableItems: ViewToken[] }) => {\n if (\n viewableItems[0]?.index &&\n viewableItems[0].index < numberOfItems * 0.5\n ) {\n flatListRef.current?.scrollToIndex({\n animated: false,\n index: viewableItems[0].index + numberOfItems,\n });\n } else if (\n viewableItems[0]?.index &&\n viewableItems[0].index >= numberOfItems * 2.5\n ) {\n flatListRef.current?.scrollToIndex({\n animated: false,\n index: viewableItems[0].index - numberOfItems,\n });\n }\n },\n [numberOfItems]\n );\n\n const getItemLayout = useCallback(\n (_: ArrayLike<string> | null | undefined, index: number) => ({\n length: styles.pickerItemContainer.height,\n offset: styles.pickerItemContainer.height * index,\n index,\n }),\n [styles.pickerItemContainer.height]\n );\n\n const viewabilityConfigCallbackPairs =\n useRef<ViewabilityConfigCallbackPairs>([\n {\n viewabilityConfig: { viewAreaCoveragePercentThreshold: 25 },\n onViewableItemsChanged: onViewableItemsChanged,\n },\n ]);\n\n return (\n <View\n pointerEvents={isDisabled ? \"none\" : undefined}\n style={[\n {\n height:\n styles.pickerItemContainer.height *\n numberOfItemsToShow,\n overflow: \"visible\",\n },\n isDisabled && styles.disabledPickerContainer,\n ]}\n testID={testID}>\n <FlatList\n ref={flatListRef}\n data={data}\n decelerationRate={0.88}\n getItemLayout={getItemLayout}\n initialScrollIndex={initialScrollIndex}\n keyExtractor={(_, index) => index.toString()}\n onMomentumScrollEnd={onMomentumScrollEnd}\n onScroll={onScroll}\n renderItem={renderItem}\n scrollEnabled={!isDisabled}\n scrollEventThrottle={16}\n showsVerticalScrollIndicator={false}\n snapToAlignment=\"start\"\n // used in place of snapToOffset due to bug on Android\n snapToOffsets={[...Array(data.length)].map(\n (_, i) => i * styles.pickerItemContainer.height\n )}\n testID=\"duration-scroll-flatlist\"\n viewabilityConfigCallbackPairs={\n !disableInfiniteScroll\n ? viewabilityConfigCallbackPairs?.current\n : undefined\n }\n windowSize={numberOfItemsToShow}\n />\n <View pointerEvents=\"none\" style={styles.pickerLabelContainer}>\n {typeof label === \"string\" ? (\n <Text\n allowFontScaling={allowFontScaling}\n style={styles.pickerLabel}>\n {label}\n </Text>\n ) : (\n label ?? null\n )}\n </View>\n {LinearGradient ? (\n <>\n <LinearGradient\n colors={[\n styles.pickerContainer.backgroundColor ??\n \"white\",\n colorToRgba({\n color:\n styles.pickerContainer\n .backgroundColor ?? \"white\",\n opacity: 0,\n }),\n ]}\n end={{ x: 1, y: 1 }}\n pointerEvents=\"none\"\n start={{ x: 1, y: 0.3 }}\n {...pickerGradientOverlayProps}\n {...topPickerGradientOverlayProps}\n style={[styles.pickerGradientOverlay, { top: 0 }]}\n />\n <LinearGradient\n colors={[\n colorToRgba({\n color:\n styles.pickerContainer\n .backgroundColor ?? \"white\",\n opacity: 0,\n }),\n styles.pickerContainer.backgroundColor ??\n \"white\",\n ]}\n end={{ x: 1, y: 0.7 }}\n pointerEvents=\"none\"\n start={{ x: 1, y: 0 }}\n {...pickerGradientOverlayProps}\n {...bottomPickerGradientOverlayProps}\n style={[\n styles.pickerGradientOverlay,\n { bottom: -1 },\n ]}\n />\n </>\n ) : null}\n </View>\n );\n }\n);\n\nexport default React.memo(DurationScroll);\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { MutableRefObject } from \"react\";\n\nimport type { View } from \"react-native\";\n\nimport type { generateStyles } from \"../TimerPicker/styles\";\n\nexport interface DurationScrollProps {\n Audio?: any;\n Haptics?: any;\n LinearGradient?: any;\n aggressivelyGetLatestDuration: boolean;\n allowFontScaling?: boolean;\n amLabel?: string;\n bottomPickerGradientOverlayProps?: Partial<LinearGradientProps>;\n clickSoundAsset?: SoundAssetType;\n disableInfiniteScroll?: boolean;\n initialValue?: number;\n is12HourPicker?: boolean;\n isDisabled?: boolean;\n label?: string | React.ReactElement;\n limit?: LimitType;\n numberOfItems: number;\n onDurationChange: (duration: number) => void;\n padNumbersWithZero?: boolean;\n padWithNItems: number;\n pickerGradientOverlayProps?: Partial<LinearGradientProps>;\n pmLabel?: string;\n styles: ReturnType<typeof generateStyles>;\n testID?: string;\n topPickerGradientOverlayProps?: Partial<LinearGradientProps>;\n}\n\nexport interface DurationScrollRef {\n latestDuration: MutableRefObject<number>;\n reset: (options?: { animated?: boolean }) => void;\n setValue: (value: number, options?: { animated?: boolean }) => void;\n}\n\ntype LinearGradientPoint = {\n x: number;\n y: number;\n};\n\nexport type LinearGradientProps = React.ComponentProps<typeof View> & {\n colors: string[];\n end?: LinearGradientPoint | null;\n locations?: number[] | null;\n start?: LinearGradientPoint | null;\n};\n\nexport type LimitType = {\n max?: number;\n min?: number;\n};\n\nexport type SoundAssetType =\n | number\n | {\n headers?: Record<string, string>;\n overrideFileExtensionAndroid?: string;\n uri: string;\n };\n"],"mappings":""}
|