From 0a851835a621cd115605e247a7ca41fdef3d8113 Mon Sep 17 00:00:00 2001 From: Rodrigo Brechard Date: Mon, 22 Sep 2025 18:32:33 +0200 Subject: [PATCH 1/3] feat: add minuteInterval parameter for time picker intervals --- .changeset/hot-feet-roll.md | 5 ++++ package-lock.json | 10 +++---- packages/datetime-picker/README.md | 27 ++++++++++--------- .../datetimepicker/DatetimePicker.java | 15 +++++++---- .../datetimepicker/DatetimePickerPlugin.java | 10 ++++--- .../ios/Plugin/DatetimePicker.swift | 8 +++--- .../ios/Plugin/DatetimePickerPlugin.swift | 5 ++-- .../datetime-picker/ios/Plugin/RPicker.swift | 14 +++++++--- packages/datetime-picker/src/definitions.ts | 12 +++++++++ 9 files changed, 70 insertions(+), 36 deletions(-) create mode 100644 .changeset/hot-feet-roll.md diff --git a/.changeset/hot-feet-roll.md b/.changeset/hot-feet-roll.md new file mode 100644 index 00000000..b0f8d003 --- /dev/null +++ b/.changeset/hot-feet-roll.md @@ -0,0 +1,5 @@ +--- +'@capawesome-team/capacitor-datetime-picker': minor +--- + +Add minuteInterval parameter for time picker intervals on iOS diff --git a/package-lock.json b/package-lock.json index a648fc2c..10a597c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7651,7 +7651,7 @@ }, "packages/android-edge-to-edge-support": { "name": "@capawesome/capacitor-android-edge-to-edge-support", - "version": "7.2.2", + "version": "7.2.3", "funding": [ { "type": "github", @@ -7813,7 +7813,7 @@ }, "packages/asset-manager": { "name": "@capawesome/capacitor-asset-manager", - "version": "7.0.0", + "version": "7.0.1", "funding": [ { "type": "github", @@ -8085,7 +8085,7 @@ }, "packages/live-update": { "name": "@capawesome/capacitor-live-update", - "version": "7.2.1", + "version": "7.2.2", "funding": [ { "type": "github", @@ -8242,7 +8242,7 @@ }, "packages/realtimekit": { "name": "@capawesome/capacitor-realtimekit", - "version": "0.0.0", + "version": "0.1.0", "funding": [ { "type": "github", @@ -8276,7 +8276,7 @@ }, "packages/screen-orientation": { "name": "@capawesome/capacitor-screen-orientation", - "version": "7.0.1", + "version": "7.0.2", "funding": [ { "type": "github", diff --git a/packages/datetime-picker/README.md b/packages/datetime-picker/README.md index a1839012..7cf0abc0 100644 --- a/packages/datetime-picker/README.md +++ b/packages/datetime-picker/README.md @@ -115,19 +115,20 @@ Only available on Android and iOS. #### PresentOptions -| Prop | Type | Description | Default | Since | -| --------------------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------- | ----- | -| **`cancelButtonText`** | string | The cancel button text. | 'Cancel' | 0.0.1 | -| **`doneButtonText`** | string | The done button text. | 'Ok' | 0.0.1 | -| **`format`** | string | The format in which values are received and returned. | 'yyyy-MM-dd'T'HH:mm:ss.sss'Z'' | 0.0.1 | -| **`locale`** | string | BCP 47 language tag to define the language of the UI. | | 0.0.2 | -| **`max`** | string | The latest date and time to accept. The format of this value must match the value of the `format` parameter. This value must specify a date string later than or equal to the one specified by the `min` attribute. | | 0.0.1 | -| **`min`** | string | The earliest date and time to accept. The format of this value must match the value of the `format` parameter. This value must specify a date string earlier than or equal to the one specified by the `max` attribute. | | 0.0.1 | -| **`mode`** | 'date' \| 'time' \| 'datetime' | Whether you want a date or time or datetime picker. | 'datetime' | 0.0.1 | -| **`theme`** | 'auto' \| 'light' \| 'dark' | Choose the theme that the datetime picker should have. With `auto` the system theme is used. This value overwrites the `theme` configuration value. Only available on Android and iOS. Spinner options only available on Android | | 0.0.1 | -| **`value`** | string | The predefined value when opening the picker. The format of this value must match the value of the `format` parameter. | | 0.0.1 | -| **`androidTimePickerMode`** | 'clock' \| 'spinner' | Whether to use the spinner or clock mode for the time picker on Android. This value overwrites the `androidTimePickerMode` configuration value. Only available on Android. | | 5.1.0 | -| **`androidDatePickerMode`** | 'spinner' \| 'calendar' | Whether to use the calendar or spinner mode for the date picker on Android. This value overwrites the `androidDatePickerMode` configuration value. Only available on Android. | | 5.1.0 | +| Prop | Type | Description | Default | Since | +| --------------------------- | ------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------- | ----- | +| **`cancelButtonText`** | string | The cancel button text. | 'Cancel' | 0.0.1 | +| **`doneButtonText`** | string | The done button text. | 'Ok' | 0.0.1 | +| **`format`** | string | The format in which values are received and returned. | 'yyyy-MM-dd'T'HH:mm:ss.sss'Z'' | 0.0.1 | +| **`locale`** | string | BCP 47 language tag to define the language of the UI. | | 0.0.2 | +| **`max`** | string | The latest date and time to accept. The format of this value must match the value of the `format` parameter. This value must specify a date string later than or equal to the one specified by the `min` attribute. | | 0.0.1 | +| **`min`** | string | The earliest date and time to accept. The format of this value must match the value of the `format` parameter. This value must specify a date string earlier than or equal to the one specified by the `max` attribute. | | 0.0.1 | +| **`mode`** | 'date' \| 'time' \| 'datetime' | Whether you want a date or time or datetime picker. | 'datetime' | 0.0.1 | +| **`theme`** | 'auto' \| 'light' \| 'dark' | Choose the theme that the datetime picker should have. With `auto` the system theme is used. This value overwrites the `theme` configuration value. Only available on Android and iOS. Spinner options only available on Android | | 0.0.1 | +| **`value`** | string | The predefined value when opening the picker. The format of this value must match the value of the `format` parameter. | | 0.0.1 | +| **`androidTimePickerMode`** | 'clock' \| 'spinner' | Whether to use the spinner or clock mode for the time picker on Android. This value overwrites the `androidTimePickerMode` configuration value. Only available on Android. | | 5.1.0 | +| **`androidDatePickerMode`** | 'spinner' \| 'calendar' | Whether to use the calendar or spinner mode for the date picker on Android. This value overwrites the `androidDatePickerMode` configuration value. Only available on Android. | | 5.1.0 | +| **`minuteInterval`** | number | The minute interval of the time picker. This controls the granularity of the minute selector (e.g., 15 for 0, 15, 30, 45). The value must be evenly divisible into 60. Only available on iOS when using time or datetime modes. On Android, this parameter is ignored. | 1 | 6.1.0 | diff --git a/packages/datetime-picker/android/src/main/java/io/capawesome/capacitorjs/plugins/datetimepicker/DatetimePicker.java b/packages/datetime-picker/android/src/main/java/io/capawesome/capacitorjs/plugins/datetimepicker/DatetimePicker.java index 756b0fe9..30168787 100644 --- a/packages/datetime-picker/android/src/main/java/io/capawesome/capacitorjs/plugins/datetimepicker/DatetimePicker.java +++ b/packages/datetime-picker/android/src/main/java/io/capawesome/capacitorjs/plugins/datetimepicker/DatetimePicker.java @@ -33,7 +33,8 @@ public void presentDateTimePicker( @Nullable String theme, final PresentResultCallback resultCallback, @Nullable AndroidDatePickerMode androidDatePickerMode, - @Nullable AndroidTimePickerMode androidTimePickerMode + @Nullable AndroidTimePickerMode androidTimePickerMode, + Integer minuteInterval ) { PresentResultCallback dateResultCallback = new PresentResultCallback(); dateResultCallback.setSuccessListener(selectedDate -> { @@ -49,7 +50,8 @@ public void presentDateTimePicker( theme, timeResultCallback, androidDatePickerMode, - androidTimePickerMode + androidTimePickerMode, + minuteInterval ); }); dateResultCallback.setCancelListener(() -> resultCallback.cancel()); @@ -64,7 +66,8 @@ public void presentDateTimePicker( theme, dateResultCallback, androidDatePickerMode, - androidTimePickerMode + androidTimePickerMode, + minuteInterval ); } @@ -78,7 +81,8 @@ public void presentDatePicker( @Nullable String theme, final PresentResultCallback resultCallback, @Nullable AndroidDatePickerMode androidDatePickerMode, - @Nullable AndroidTimePickerMode androidTimePickerMode + @Nullable AndroidTimePickerMode androidTimePickerMode, + Integer minuteInterval ) { if (locale != null) { this.updateLocaleConfiguration(locale); @@ -129,7 +133,8 @@ public void presentTimePicker( @Nullable String theme, final PresentResultCallback resultCallback, @Nullable AndroidDatePickerMode androidDatePickerMode, - @Nullable AndroidTimePickerMode androidTimePickerMode + @Nullable AndroidTimePickerMode androidTimePickerMode, + Integer minuteInterval ) { if (locale != null) { this.updateLocaleConfiguration(locale); diff --git a/packages/datetime-picker/android/src/main/java/io/capawesome/capacitorjs/plugins/datetimepicker/DatetimePickerPlugin.java b/packages/datetime-picker/android/src/main/java/io/capawesome/capacitorjs/plugins/datetimepicker/DatetimePickerPlugin.java index 62a90e37..819a107f 100644 --- a/packages/datetime-picker/android/src/main/java/io/capawesome/capacitorjs/plugins/datetimepicker/DatetimePickerPlugin.java +++ b/packages/datetime-picker/android/src/main/java/io/capawesome/capacitorjs/plugins/datetimepicker/DatetimePickerPlugin.java @@ -41,6 +41,7 @@ public void present(PluginCall call) { String doneButtonText = call.getString("doneButtonText", "Ok"); String androidTimePickerModeText = call.getString("androidTimePickerMode", "clock"); String androidDatePickerModeText = call.getString("androidDatePickerMode", "calendar"); + Integer minuteInterval = call.getInt("minuteInterval", 1); AndroidDatePickerMode androidDatePickerMode = null; if (androidDatePickerModeText != null) { @@ -87,7 +88,8 @@ public void present(PluginCall call) { theme, resultCallback, androidDatePickerMode, - androidTimePickerMode + androidTimePickerMode, + minuteInterval ); } else if (mode.equals("date")) { implementation.presentDatePicker( @@ -100,7 +102,8 @@ public void present(PluginCall call) { theme, resultCallback, androidDatePickerMode, - androidTimePickerMode + androidTimePickerMode, + minuteInterval ); } else if (mode.equals("time")) { implementation.presentTimePicker( @@ -111,7 +114,8 @@ public void present(PluginCall call) { theme, resultCallback, androidDatePickerMode, - androidTimePickerMode + androidTimePickerMode, + minuteInterval ); } else { call.reject(ERROR_MODE_INVALID); diff --git a/packages/datetime-picker/ios/Plugin/DatetimePicker.swift b/packages/datetime-picker/ios/Plugin/DatetimePicker.swift index b5ad39d5..137d3027 100644 --- a/packages/datetime-picker/ios/Plugin/DatetimePicker.swift +++ b/packages/datetime-picker/ios/Plugin/DatetimePicker.swift @@ -11,11 +11,11 @@ import Foundation self.config = config } - @objc public func presentDatetimePicker(date: Date, minDate: Date?, maxDate: Date?, locale: Locale?, cancelButtonText: String, doneButtonText: String, theme: String?, completion: @escaping (Date?, ErrorCode) -> Void) { + @objc public func presentDatetimePicker(date: Date, minDate: Date?, maxDate: Date?, locale: Locale?, cancelButtonText: String, doneButtonText: String, theme: String?, minuteInterval: Int, completion: @escaping (Date?, ErrorCode) -> Void) { closeKeyboard() DispatchQueue.main.asyncAfter(deadline: .now() + waitForKeyboardCloseSeconds) { RPicker.selectDate(title: "", cancelText: cancelButtonText, doneText: doneButtonText, datePickerMode: .dateAndTime, selectedDate: date, - minDate: minDate, maxDate: maxDate, locale: locale, theme: self.getTheme(unconvertedTheme: theme), completion: { (date, errorCode) in + minDate: minDate, maxDate: maxDate, locale: locale, theme: self.getTheme(unconvertedTheme: theme), minuteInterval: minuteInterval, completion: { (date, errorCode) in completion(date, errorCode) }) } @@ -32,12 +32,12 @@ import Foundation } } - @objc public func presentTimePicker(date: Date, locale: Locale?, cancelButtonText: String, doneButtonText: String, theme: String?, completion: @escaping (Date?, ErrorCode) -> Void) { + @objc public func presentTimePicker(date: Date, locale: Locale?, cancelButtonText: String, doneButtonText: String, theme: String?, minuteInterval: Int, completion: @escaping (Date?, ErrorCode) -> Void) { closeKeyboard() DispatchQueue.main.asyncAfter(deadline: .now() + waitForKeyboardCloseSeconds) { RPicker.selectDate(title: "", cancelText: cancelButtonText, doneText: doneButtonText, datePickerMode: .time, selectedDate: date, locale: locale, style: DatetimePickerStyle.wheel, - theme: self.getTheme(unconvertedTheme: theme), completion: { (date, errorCode) in + theme: self.getTheme(unconvertedTheme: theme), minuteInterval: minuteInterval, completion: { (date, errorCode) in completion(date, errorCode) }) } diff --git a/packages/datetime-picker/ios/Plugin/DatetimePickerPlugin.swift b/packages/datetime-picker/ios/Plugin/DatetimePickerPlugin.swift index b12fb841..eae7eb41 100644 --- a/packages/datetime-picker/ios/Plugin/DatetimePickerPlugin.swift +++ b/packages/datetime-picker/ios/Plugin/DatetimePickerPlugin.swift @@ -35,6 +35,7 @@ public class DatetimePickerPlugin: CAPPlugin, CAPBridgedPlugin { let value = call.getString("value") let cancelButtonText = call.getString("cancelButtonText", "Cancel") let doneButtonText = call.getString("doneButtonText", "Ok") + let minuteInterval = call.getInt("minuteInterval", 1) var locale: Locale? if let localeString = localeString { @@ -74,13 +75,13 @@ public class DatetimePickerPlugin: CAPPlugin, CAPBridgedPlugin { if mode == "datetime" { implementation?.presentDatetimePicker(date: date, minDate: minDate, maxDate: maxDate, locale: locale, - cancelButtonText: cancelButtonText, doneButtonText: doneButtonText, theme: theme, completion: completion) + cancelButtonText: cancelButtonText, doneButtonText: doneButtonText, theme: theme, minuteInterval: minuteInterval, completion: completion) } else if mode == "date" { implementation?.presentDatePicker(date: date, minDate: minDate, maxDate: maxDate, locale: locale, cancelButtonText: cancelButtonText, doneButtonText: doneButtonText, theme: theme, completion: completion) } else if mode == "time" { implementation?.presentTimePicker(date: date, locale: locale, cancelButtonText: cancelButtonText, - doneButtonText: doneButtonText, theme: theme, completion: completion) + doneButtonText: doneButtonText, theme: theme, minuteInterval: minuteInterval, completion: completion) } else { call.reject(errorModeInvalid) } diff --git a/packages/datetime-picker/ios/Plugin/RPicker.swift b/packages/datetime-picker/ios/Plugin/RPicker.swift index e505d949..8d795ddc 100644 --- a/packages/datetime-picker/ios/Plugin/RPicker.swift +++ b/packages/datetime-picker/ios/Plugin/RPicker.swift @@ -45,10 +45,11 @@ import UIKit locale: Locale? = nil, style: DatetimePickerStyle = .inline, theme: Theme = .auto, + minuteInterval: Int = 1, completion: ((_ date: Date?, _ errorCode: ErrorCode) -> Void)?) { guard let vc = controller(title: title, cancelText: cancelText, doneText: doneText, datePickerMode: datePickerMode, - selectedDate: selectedDate, minDate: minDate, maxDate: maxDate, locale: locale, style: style, theme: theme) else { return } + selectedDate: selectedDate, minDate: minDate, maxDate: maxDate, locale: locale, style: style, theme: theme, minuteInterval: minuteInterval) else { return } vc.onDateSelected = { (selectedData) in completion?(selectedData, ErrorCode.none) @@ -70,14 +71,15 @@ import UIKit maxDate: Date? = nil, locale: Locale? = nil, style: DatetimePickerStyle = .inline, - theme: Theme = .auto) -> RPickerController? { + theme: Theme = .auto, + minuteInterval: Int = 1) -> RPickerController? { if let cc = UIWindow.currentController { if RPicker.sharedInstance.isPresented == false { RPicker.sharedInstance.isPresented = true let vc = RPickerController(title: title, cancelText: cancelText, doneText: doneText, datePickerMode: datePickerMode, - selectedDate: selectedDate, minDate: minDate, maxDate: maxDate, locale: locale, style: style, theme: theme) + selectedDate: selectedDate, minDate: minDate, maxDate: maxDate, locale: locale, style: style, theme: theme, minuteInterval: minuteInterval) vc.modalPresentationStyle = .overCurrentContext vc.modalTransitionStyle = .crossDissolve @@ -133,6 +135,7 @@ class RPickerController: UIViewController { var datePickerMode: UIDatePicker.Mode = .date var datePickerStyle: DatetimePickerStyle = .inline var theme: Theme = .auto + var minuteInterval: Int = 1 // MARK: - Private variables private let barViewHeight: CGFloat = 44 @@ -152,7 +155,8 @@ class RPickerController: UIViewController { maxDate: Date? = nil, locale: Locale? = nil, style: DatetimePickerStyle = .inline, - theme: Theme = .auto) { + theme: Theme = .auto, + minuteInterval: Int = 1) { self.titleText = title self.cancelText = cancelText @@ -164,6 +168,7 @@ class RPickerController: UIViewController { self.locale = locale self.datePickerStyle = style self.theme = theme + self.minuteInterval = minuteInterval super.init(nibName: nil, bundle: nil) @@ -312,6 +317,7 @@ class RPickerController: UIViewController { picker.maximumDate = maxDate picker.date = selectedDate picker.datePickerMode = datePickerMode + picker.minuteInterval = minuteInterval if let locale = locale { picker.locale = locale } diff --git a/packages/datetime-picker/src/definitions.ts b/packages/datetime-picker/src/definitions.ts index 1ec1ca33..2186595c 100644 --- a/packages/datetime-picker/src/definitions.ts +++ b/packages/datetime-picker/src/definitions.ts @@ -139,6 +139,18 @@ export interface PresentOptions { * @since 5.1.0 */ androidDatePickerMode?: 'calendar' | 'spinner'; + /** + * The minute interval of the time picker. + * This controls the granularity of the minute selector (e.g., 15 for 0, 15, 30, 45). + * The value must be evenly divisible into 60. + * + * Only available on iOS when using time or datetime modes. + * On Android, this parameter is ignored. + * + * @since 7.1.0 + * @default 1 + */ + minuteInterval?: number; } export interface PresentResult { From e89da5bd721372c34ac961f97ad67763176eaa62 Mon Sep 17 00:00:00 2001 From: Rodrigo Brechard Date: Fri, 17 Oct 2025 12:20:18 +0200 Subject: [PATCH 2/3] fix: remove Android changes for minuteInterval parameter --- .../plugins/datetimepicker/DatetimePicker.java | 15 +++++---------- .../datetimepicker/DatetimePickerPlugin.java | 10 +++------- 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/packages/datetime-picker/android/src/main/java/io/capawesome/capacitorjs/plugins/datetimepicker/DatetimePicker.java b/packages/datetime-picker/android/src/main/java/io/capawesome/capacitorjs/plugins/datetimepicker/DatetimePicker.java index 30168787..756b0fe9 100644 --- a/packages/datetime-picker/android/src/main/java/io/capawesome/capacitorjs/plugins/datetimepicker/DatetimePicker.java +++ b/packages/datetime-picker/android/src/main/java/io/capawesome/capacitorjs/plugins/datetimepicker/DatetimePicker.java @@ -33,8 +33,7 @@ public void presentDateTimePicker( @Nullable String theme, final PresentResultCallback resultCallback, @Nullable AndroidDatePickerMode androidDatePickerMode, - @Nullable AndroidTimePickerMode androidTimePickerMode, - Integer minuteInterval + @Nullable AndroidTimePickerMode androidTimePickerMode ) { PresentResultCallback dateResultCallback = new PresentResultCallback(); dateResultCallback.setSuccessListener(selectedDate -> { @@ -50,8 +49,7 @@ public void presentDateTimePicker( theme, timeResultCallback, androidDatePickerMode, - androidTimePickerMode, - minuteInterval + androidTimePickerMode ); }); dateResultCallback.setCancelListener(() -> resultCallback.cancel()); @@ -66,8 +64,7 @@ public void presentDateTimePicker( theme, dateResultCallback, androidDatePickerMode, - androidTimePickerMode, - minuteInterval + androidTimePickerMode ); } @@ -81,8 +78,7 @@ public void presentDatePicker( @Nullable String theme, final PresentResultCallback resultCallback, @Nullable AndroidDatePickerMode androidDatePickerMode, - @Nullable AndroidTimePickerMode androidTimePickerMode, - Integer minuteInterval + @Nullable AndroidTimePickerMode androidTimePickerMode ) { if (locale != null) { this.updateLocaleConfiguration(locale); @@ -133,8 +129,7 @@ public void presentTimePicker( @Nullable String theme, final PresentResultCallback resultCallback, @Nullable AndroidDatePickerMode androidDatePickerMode, - @Nullable AndroidTimePickerMode androidTimePickerMode, - Integer minuteInterval + @Nullable AndroidTimePickerMode androidTimePickerMode ) { if (locale != null) { this.updateLocaleConfiguration(locale); diff --git a/packages/datetime-picker/android/src/main/java/io/capawesome/capacitorjs/plugins/datetimepicker/DatetimePickerPlugin.java b/packages/datetime-picker/android/src/main/java/io/capawesome/capacitorjs/plugins/datetimepicker/DatetimePickerPlugin.java index 819a107f..62a90e37 100644 --- a/packages/datetime-picker/android/src/main/java/io/capawesome/capacitorjs/plugins/datetimepicker/DatetimePickerPlugin.java +++ b/packages/datetime-picker/android/src/main/java/io/capawesome/capacitorjs/plugins/datetimepicker/DatetimePickerPlugin.java @@ -41,7 +41,6 @@ public void present(PluginCall call) { String doneButtonText = call.getString("doneButtonText", "Ok"); String androidTimePickerModeText = call.getString("androidTimePickerMode", "clock"); String androidDatePickerModeText = call.getString("androidDatePickerMode", "calendar"); - Integer minuteInterval = call.getInt("minuteInterval", 1); AndroidDatePickerMode androidDatePickerMode = null; if (androidDatePickerModeText != null) { @@ -88,8 +87,7 @@ public void present(PluginCall call) { theme, resultCallback, androidDatePickerMode, - androidTimePickerMode, - minuteInterval + androidTimePickerMode ); } else if (mode.equals("date")) { implementation.presentDatePicker( @@ -102,8 +100,7 @@ public void present(PluginCall call) { theme, resultCallback, androidDatePickerMode, - androidTimePickerMode, - minuteInterval + androidTimePickerMode ); } else if (mode.equals("time")) { implementation.presentTimePicker( @@ -114,8 +111,7 @@ public void present(PluginCall call) { theme, resultCallback, androidDatePickerMode, - androidTimePickerMode, - minuteInterval + androidTimePickerMode ); } else { call.reject(ERROR_MODE_INVALID); From 8f0633adcf757ca9d24ea5cd6361c7914f244c26 Mon Sep 17 00:00:00 2001 From: Robin Genz Date: Sun, 19 Oct 2025 13:33:20 +0200 Subject: [PATCH 3/3] Update .changeset/hot-feet-roll.md --- .changeset/hot-feet-roll.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/hot-feet-roll.md b/.changeset/hot-feet-roll.md index b0f8d003..ee53b3df 100644 --- a/.changeset/hot-feet-roll.md +++ b/.changeset/hot-feet-roll.md @@ -2,4 +2,4 @@ '@capawesome-team/capacitor-datetime-picker': minor --- -Add minuteInterval parameter for time picker intervals on iOS +feat(ios): add `minuteInterval` option