react-native-platform-components 0.8.8 → 0.8.10
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 +15 -12
- package/ios/PCConstants.swift +39 -3
- package/ios/PCDatePicker.mm +8 -0
- package/ios/PCDatePickerView.swift +72 -57
- package/ios/PCSelectionMenu.swift +60 -14
- package/lib/commonjs/DatePicker.js +2 -1
- package/lib/commonjs/DatePicker.js.map +1 -1
- package/lib/commonjs/DatePickerNativeComponent.ts +2 -0
- package/lib/module/DatePicker.js +2 -1
- package/lib/module/DatePicker.js.map +1 -1
- package/lib/module/DatePickerNativeComponent.ts +2 -0
- package/lib/typescript/commonjs/src/DatePicker.d.ts +8 -0
- package/lib/typescript/commonjs/src/DatePicker.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/DatePickerNativeComponent.d.ts +2 -0
- package/lib/typescript/commonjs/src/DatePickerNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/DatePicker.d.ts +8 -0
- package/lib/typescript/module/src/DatePicker.d.ts.map +1 -1
- package/lib/typescript/module/src/DatePickerNativeComponent.d.ts +2 -0
- package/lib/typescript/module/src/DatePickerNativeComponent.d.ts.map +1 -1
- package/package.json +9 -8
- package/src/DatePicker.tsx +9 -0
- package/src/DatePickerNativeComponent.ts +2 -0
package/README.md
CHANGED
|
@@ -473,12 +473,13 @@ Native date & time picker using **platform system pickers**.
|
|
|
473
473
|
|
|
474
474
|
### iOS Props (`ios`)
|
|
475
475
|
|
|
476
|
-
| Prop | Type | Description
|
|
477
|
-
| -------------------------- | -------------------------------------------------- |
|
|
478
|
-
| `preferredStyle` | `'automatic' \| 'compact' \| 'inline' \| 'wheels'` | iOS date picker style
|
|
479
|
-
| `countDownDurationSeconds` | `number` | Duration for countdown timer mode
|
|
480
|
-
| `minuteInterval` | `number` | Minute interval (1-30)
|
|
481
|
-
| `roundsToMinuteInterval` | `'inherit' \| 'round' \| 'noRound'` | Rounding behavior
|
|
476
|
+
| Prop | Type | Description |
|
|
477
|
+
| -------------------------- | -------------------------------------------------- | ------------------------------------------------------------------------ |
|
|
478
|
+
| `preferredStyle` | `'automatic' \| 'compact' \| 'inline' \| 'wheels'` | iOS date picker style |
|
|
479
|
+
| `countDownDurationSeconds` | `number` | Duration for countdown timer mode |
|
|
480
|
+
| `minuteInterval` | `number` | Minute interval (1-30) |
|
|
481
|
+
| `roundsToMinuteInterval` | `'inherit' \| 'round' \| 'noRound'` | Rounding behavior |
|
|
482
|
+
| `showConfirmToolbar` | `boolean` | Modal only. Show Cancel/Done toolbar below the picker. Defaults to `true`. See below. |
|
|
482
483
|
|
|
483
484
|
### Android Props (`android`)
|
|
484
485
|
|
|
@@ -494,12 +495,14 @@ Native date & time picker using **platform system pickers**.
|
|
|
494
495
|
|
|
495
496
|
`onConfirm` fires on every date/time change, but the second argument (`confirmed`) lets you distinguish between browsing and deliberate selections:
|
|
496
497
|
|
|
497
|
-
| Platform / Mode | Every change
|
|
498
|
-
| -------------------- |
|
|
499
|
-
| **iOS modal** | `confirmed: false` (
|
|
500
|
-
| **iOS embedded** | `confirmed: true`
|
|
501
|
-
| **Android modal** | —
|
|
502
|
-
| **Android embedded** | `confirmed: true`
|
|
498
|
+
| Platform / Mode | Every change | Deliberate selection |
|
|
499
|
+
| -------------------- | ----------------------------------------- | ------------------------------------- |
|
|
500
|
+
| **iOS modal** | `confirmed: false` (user still adjusting) | `confirmed: true` (tapping **Done**) |
|
|
501
|
+
| **iOS embedded** | `confirmed: true` | — |
|
|
502
|
+
| **Android modal** | — | `confirmed: true` (pressing OK) |
|
|
503
|
+
| **Android embedded** | `confirmed: true` | — |
|
|
504
|
+
|
|
505
|
+
On iOS in modal presentation, the picker is shown in a popover with a Cancel/Done toolbar below it. Tapping **Done** emits `confirmed: true`; tapping **Cancel** or outside the popover calls `onClosed`. Set `ios.showConfirmToolbar: false` to hide the toolbar — in that mode `confirmed: true` never fires, and your app is expected to drive dismissal by flipping `visible` off (reading the current date from the stream of `confirmed: false` events). This only makes UX sense paired with `ios.preferredStyle: 'inline'`.
|
|
503
506
|
|
|
504
507
|
A common pattern is to close the modal only on a confirmed selection:
|
|
505
508
|
|
package/ios/PCConstants.swift
CHANGED
|
@@ -19,11 +19,47 @@ enum PCConstants {
|
|
|
19
19
|
/// Minimum row height in selection menu popover (used as baseline)
|
|
20
20
|
static let popoverRowHeightMin: CGFloat = 44
|
|
21
21
|
|
|
22
|
-
///
|
|
22
|
+
/// Horizontal inset applied to each side of a menu row's label
|
|
23
|
+
static let popoverRowHorizontalInset: CGFloat = 16
|
|
24
|
+
|
|
25
|
+
/// Vertical padding added to each menu row's text (top + bottom combined)
|
|
26
|
+
static let popoverRowVerticalPadding: CGFloat = 16
|
|
27
|
+
|
|
28
|
+
/// Estimated single-line row height that respects the user's preferred
|
|
29
|
+
/// content size. Used only as a table-view estimate; actual rows self-size.
|
|
23
30
|
static var popoverRowHeight: CGFloat {
|
|
24
31
|
let bodyFont = UIFont.preferredFont(forTextStyle: .body)
|
|
25
|
-
|
|
26
|
-
|
|
32
|
+
return max(popoverRowHeightMin, ceil(bodyFont.lineHeight) + popoverRowVerticalPadding)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/// Measured height of a single menu row for the given label and content
|
|
36
|
+
/// width, accounting for multi-line wrapping at the current Dynamic Type
|
|
37
|
+
/// size. Mirrors the Auto Layout sizing of `PCGlassMenuCell` so the popover
|
|
38
|
+
/// container can be sized to fit its content.
|
|
39
|
+
static func popoverRowHeight(forLabel label: String, width: CGFloat) -> CGFloat {
|
|
40
|
+
let bodyFont = UIFont.preferredFont(forTextStyle: .body)
|
|
41
|
+
let textWidth = max(1, width - popoverRowHorizontalInset * 2)
|
|
42
|
+
let bounding = (label as NSString).boundingRect(
|
|
43
|
+
with: CGSize(width: textWidth, height: .greatestFiniteMagnitude),
|
|
44
|
+
options: [.usesLineFragmentOrigin, .usesFontLeading],
|
|
45
|
+
attributes: [.font: bodyFont],
|
|
46
|
+
context: nil
|
|
47
|
+
)
|
|
48
|
+
return max(popoverRowHeightMin, ceil(bounding.height) + popoverRowVerticalPadding)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/// Adaptive popover width. Widens for accessibility content size categories
|
|
52
|
+
/// so long labels wrap less aggressively (mirrors system menu behavior).
|
|
53
|
+
/// The caller is responsible for clamping to the available screen width.
|
|
54
|
+
static func popoverWidth(forCategory category: UIContentSizeCategory) -> CGFloat {
|
|
55
|
+
guard category.isAccessibilityCategory else { return popoverWidth }
|
|
56
|
+
switch category {
|
|
57
|
+
case .accessibilityMedium: return 300
|
|
58
|
+
case .accessibilityLarge: return 320
|
|
59
|
+
case .accessibilityExtraLarge: return 340
|
|
60
|
+
case .accessibilityExtraExtraLarge: return 360
|
|
61
|
+
default: return 380 // accessibilityExtraExtraExtraLarge and beyond
|
|
62
|
+
}
|
|
27
63
|
}
|
|
28
64
|
|
|
29
65
|
/// Vertical padding in selection menu popover (top + bottom)
|
package/ios/PCDatePicker.mm
CHANGED
|
@@ -191,6 +191,14 @@ using namespace facebook::react;
|
|
|
191
191
|
}
|
|
192
192
|
}
|
|
193
193
|
|
|
194
|
+
// Expecting: "show" | "hide"
|
|
195
|
+
if (oldIos.confirmToolbar != newIos.confirmToolbar) {
|
|
196
|
+
_datePickerView.confirmToolbarMode =
|
|
197
|
+
(!newIos.confirmToolbar.empty())
|
|
198
|
+
? [NSString stringWithUTF8String:newIos.confirmToolbar.c_str()]
|
|
199
|
+
: @"show";
|
|
200
|
+
}
|
|
201
|
+
|
|
194
202
|
if (needsToUpdateMeasurements) {
|
|
195
203
|
[self updateMeasurements];
|
|
196
204
|
}
|
|
@@ -6,15 +6,19 @@ private let logger = Logger(subsystem: "com.platformcomponents", category: "Date
|
|
|
6
6
|
@objcMembers
|
|
7
7
|
public final class PCDatePickerView: UIControl,
|
|
8
8
|
UIPopoverPresentationControllerDelegate,
|
|
9
|
-
UIAdaptivePresentationControllerDelegate
|
|
10
|
-
UIGestureRecognizerDelegate
|
|
9
|
+
UIAdaptivePresentationControllerDelegate
|
|
11
10
|
{
|
|
12
11
|
// MARK: - UI
|
|
13
12
|
private let picker = UIDatePicker()
|
|
14
13
|
private var modalVC: UIViewController?
|
|
15
14
|
private var inlineConstraints: [NSLayoutConstraint] = []
|
|
16
|
-
|
|
17
|
-
private var
|
|
15
|
+
|
|
16
|
+
private var modalToolbarHeight: CGFloat {
|
|
17
|
+
// iOS 26 renders bar button items as oversized Liquid Glass pills;
|
|
18
|
+
// they overflow a standard 44pt toolbar and clip against the popover.
|
|
19
|
+
if #available(iOS 26.0, *) { return 60 }
|
|
20
|
+
return 44
|
|
21
|
+
}
|
|
18
22
|
|
|
19
23
|
// Suppress "programmatic" valueChanged events (apply props / initial present settle).
|
|
20
24
|
private var suppressChangeEvents = false
|
|
@@ -88,6 +92,11 @@ public final class PCDatePickerView: UIControl,
|
|
|
88
92
|
didSet { if oldValue != roundsToMinuteIntervalMode { applyRoundsMode() } }
|
|
89
93
|
}
|
|
90
94
|
|
|
95
|
+
/// "show" | "hide" — modal only. When "hide", the popover has no
|
|
96
|
+
/// Cancel/Done bar and the caller is responsible for driving dismissal
|
|
97
|
+
/// via the `visible` prop; valueChanged still emits confirmed=false.
|
|
98
|
+
public var confirmToolbarMode: String = "show"
|
|
99
|
+
|
|
91
100
|
// MARK: - Init
|
|
92
101
|
|
|
93
102
|
public override init(frame: CGRect) {
|
|
@@ -199,13 +208,15 @@ public final class PCDatePickerView: UIControl,
|
|
|
199
208
|
height: max(PCConstants.minTouchTargetHeight, fitted.height))
|
|
200
209
|
}
|
|
201
210
|
|
|
202
|
-
/// Separate sizing for popover content.
|
|
211
|
+
/// Separate sizing for popover content. Accounts for the Cancel/Done
|
|
212
|
+
/// toolbar that sits below the picker in modal presentation.
|
|
203
213
|
private func popoverContentSize() -> CGSize {
|
|
204
214
|
picker.setNeedsLayout()
|
|
205
215
|
picker.layoutIfNeeded()
|
|
206
216
|
|
|
207
217
|
let fitted = picker.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)
|
|
208
|
-
|
|
218
|
+
let extra = confirmToolbarMode == "hide" ? 0 : modalToolbarHeight
|
|
219
|
+
return CGSize(width: fitted.width, height: fitted.height + extra)
|
|
209
220
|
}
|
|
210
221
|
|
|
211
222
|
// MARK: - Presentation
|
|
@@ -286,18 +297,29 @@ public final class PCDatePickerView: UIControl,
|
|
|
286
297
|
// Prevent "settle" events right as we present.
|
|
287
298
|
suppressNextChangesBriefly()
|
|
288
299
|
|
|
289
|
-
// Set up tap-to-confirm gesture for modal mode
|
|
290
|
-
confirmWorkItem?.cancel()
|
|
291
|
-
let tap = UITapGestureRecognizer(target: self, action: #selector(handlePickerTap))
|
|
292
|
-
tap.cancelsTouchesInView = false
|
|
293
|
-
tap.delegate = self
|
|
294
|
-
picker.addGestureRecognizer(tap)
|
|
295
|
-
tapGesture = tap
|
|
296
|
-
|
|
297
300
|
let vc = UIViewController()
|
|
298
301
|
picker.translatesAutoresizingMaskIntoConstraints = false
|
|
299
302
|
vc.view.addSubview(picker)
|
|
300
303
|
|
|
304
|
+
// Cancel / Done toolbar below the picker — right-justified so both
|
|
305
|
+
// actions sit in the trailing corner, clear of the calendar header.
|
|
306
|
+
// Skipped entirely when confirmToolbarMode == "hide".
|
|
307
|
+
let toolbar: UIToolbar? = confirmToolbarMode == "hide" ? nil : {
|
|
308
|
+
let t = UIToolbar()
|
|
309
|
+
t.translatesAutoresizingMaskIntoConstraints = false
|
|
310
|
+
let flex = UIBarButtonItem(
|
|
311
|
+
barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
|
|
312
|
+
let cancelItem = UIBarButtonItem(
|
|
313
|
+
barButtonSystemItem: .cancel,
|
|
314
|
+
target: self, action: #selector(handleCancelTap))
|
|
315
|
+
let doneItem = UIBarButtonItem(
|
|
316
|
+
barButtonSystemItem: .done,
|
|
317
|
+
target: self, action: #selector(handleDoneTap))
|
|
318
|
+
t.items = [flex, cancelItem, doneItem]
|
|
319
|
+
vc.view.addSubview(t)
|
|
320
|
+
return t
|
|
321
|
+
}()
|
|
322
|
+
|
|
301
323
|
let useInlineFallback: Bool
|
|
302
324
|
if #available(iOS 26.0, *) {
|
|
303
325
|
useInlineFallback = false
|
|
@@ -310,21 +332,42 @@ public final class PCDatePickerView: UIControl,
|
|
|
310
332
|
vc.view.backgroundColor = .systemBackground
|
|
311
333
|
vc.view.isOpaque = true
|
|
312
334
|
|
|
313
|
-
NSLayoutConstraint
|
|
335
|
+
var constraints: [NSLayoutConstraint] = [
|
|
314
336
|
picker.topAnchor.constraint(equalTo: vc.view.topAnchor),
|
|
315
337
|
picker.leadingAnchor.constraint(equalTo: vc.view.leadingAnchor),
|
|
316
338
|
picker.trailingAnchor.constraint(equalTo: vc.view.trailingAnchor),
|
|
317
|
-
|
|
318
|
-
|
|
339
|
+
]
|
|
340
|
+
if let toolbar {
|
|
341
|
+
constraints += [
|
|
342
|
+
toolbar.topAnchor.constraint(equalTo: picker.bottomAnchor),
|
|
343
|
+
toolbar.leadingAnchor.constraint(equalTo: vc.view.leadingAnchor),
|
|
344
|
+
toolbar.trailingAnchor.constraint(equalTo: vc.view.trailingAnchor),
|
|
345
|
+
toolbar.bottomAnchor.constraint(equalTo: vc.view.bottomAnchor),
|
|
346
|
+
toolbar.heightAnchor.constraint(equalToConstant: modalToolbarHeight),
|
|
347
|
+
]
|
|
348
|
+
} else {
|
|
349
|
+
constraints.append(
|
|
350
|
+
picker.bottomAnchor.constraint(equalTo: vc.view.bottomAnchor))
|
|
351
|
+
}
|
|
352
|
+
NSLayoutConstraint.activate(constraints)
|
|
319
353
|
} else {
|
|
320
354
|
// Liquid Glass path
|
|
321
355
|
vc.view.backgroundColor = .clear
|
|
322
356
|
vc.view.isOpaque = false
|
|
323
357
|
|
|
324
|
-
NSLayoutConstraint
|
|
358
|
+
var constraints: [NSLayoutConstraint] = [
|
|
325
359
|
picker.topAnchor.constraint(equalTo: vc.view.topAnchor),
|
|
326
360
|
picker.leadingAnchor.constraint(equalTo: vc.view.leadingAnchor),
|
|
327
|
-
]
|
|
361
|
+
]
|
|
362
|
+
if let toolbar {
|
|
363
|
+
constraints += [
|
|
364
|
+
toolbar.topAnchor.constraint(equalTo: picker.bottomAnchor),
|
|
365
|
+
toolbar.leadingAnchor.constraint(equalTo: vc.view.leadingAnchor),
|
|
366
|
+
toolbar.trailingAnchor.constraint(equalTo: vc.view.trailingAnchor),
|
|
367
|
+
toolbar.heightAnchor.constraint(equalToConstant: modalToolbarHeight),
|
|
368
|
+
]
|
|
369
|
+
}
|
|
370
|
+
NSLayoutConstraint.activate(constraints)
|
|
328
371
|
}
|
|
329
372
|
|
|
330
373
|
let size = popoverContentSize()
|
|
@@ -354,11 +397,6 @@ public final class PCDatePickerView: UIControl,
|
|
|
354
397
|
guard let vc = modalVC else { return }
|
|
355
398
|
logger.debug("dismissIfNeeded: dismissing modal, emitCancel=\(emitCancel)")
|
|
356
399
|
modalVC = nil
|
|
357
|
-
confirmWorkItem?.cancel()
|
|
358
|
-
if let tap = tapGesture {
|
|
359
|
-
picker.removeGestureRecognizer(tap)
|
|
360
|
-
tapGesture = nil
|
|
361
|
-
}
|
|
362
400
|
vc.dismiss(animated: true) { [weak self] in
|
|
363
401
|
guard let self else { return }
|
|
364
402
|
if emitCancel { self.onCancelHandler?() }
|
|
@@ -376,11 +414,6 @@ public final class PCDatePickerView: UIControl,
|
|
|
376
414
|
public func presentationControllerDidDismiss(_ presentationController: UIPresentationController)
|
|
377
415
|
{
|
|
378
416
|
modalVC = nil
|
|
379
|
-
confirmWorkItem?.cancel()
|
|
380
|
-
if let tap = tapGesture {
|
|
381
|
-
picker.removeGestureRecognizer(tap)
|
|
382
|
-
tapGesture = nil
|
|
383
|
-
}
|
|
384
417
|
onCancelHandler?()
|
|
385
418
|
}
|
|
386
419
|
|
|
@@ -388,23 +421,9 @@ public final class PCDatePickerView: UIControl,
|
|
|
388
421
|
_ popoverPresentationController: UIPopoverPresentationController
|
|
389
422
|
) {
|
|
390
423
|
modalVC = nil
|
|
391
|
-
confirmWorkItem?.cancel()
|
|
392
|
-
if let tap = tapGesture {
|
|
393
|
-
picker.removeGestureRecognizer(tap)
|
|
394
|
-
tapGesture = nil
|
|
395
|
-
}
|
|
396
424
|
onCancelHandler?()
|
|
397
425
|
}
|
|
398
426
|
|
|
399
|
-
// MARK: - Gesture delegate
|
|
400
|
-
|
|
401
|
-
public func gestureRecognizer(
|
|
402
|
-
_ gestureRecognizer: UIGestureRecognizer,
|
|
403
|
-
shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer
|
|
404
|
-
) -> Bool {
|
|
405
|
-
return gestureRecognizer === tapGesture
|
|
406
|
-
}
|
|
407
|
-
|
|
408
427
|
// MARK: - Value changes
|
|
409
428
|
|
|
410
429
|
@objc private func handleValueChanged() {
|
|
@@ -412,26 +431,22 @@ public final class PCDatePickerView: UIControl,
|
|
|
412
431
|
if suppressChangeEvents { return }
|
|
413
432
|
|
|
414
433
|
let ms = picker.date.timeIntervalSince1970 * 1000.0
|
|
434
|
+
// In modal mode, valueChanged is "user is still adjusting" —
|
|
435
|
+
// confirmation only happens when the user taps Done. Embedded
|
|
436
|
+
// presentation always confirms (there's no Done button to gate on).
|
|
415
437
|
let isModal = presentation == "modal" && modalVC != nil
|
|
416
438
|
onChangeHandler?(NSNumber(value: ms), !isModal)
|
|
417
439
|
}
|
|
418
440
|
|
|
419
|
-
@objc private func
|
|
441
|
+
@objc private func handleDoneTap() {
|
|
420
442
|
guard presentation == "modal", modalVC != nil else { return }
|
|
443
|
+
let ms = picker.date.timeIntervalSince1970 * 1000.0
|
|
444
|
+
onChangeHandler?(NSNumber(value: ms), true)
|
|
445
|
+
dismissIfNeeded(emitCancel: false)
|
|
446
|
+
}
|
|
421
447
|
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
let dateAtTap = picker.date
|
|
425
|
-
let workItem = DispatchWorkItem { [weak self] in
|
|
426
|
-
guard let self, self.modalVC != nil else { return }
|
|
427
|
-
// If picker date is still the same, the tap was on the selected row → confirm
|
|
428
|
-
if self.picker.date == dateAtTap {
|
|
429
|
-
let ms = dateAtTap.timeIntervalSince1970 * 1000.0
|
|
430
|
-
self.onChangeHandler?(NSNumber(value: ms), true)
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
confirmWorkItem = workItem
|
|
434
|
-
DispatchQueue.main.asyncAfter(deadline: .now() + 0.15, execute: workItem)
|
|
448
|
+
@objc private func handleCancelTap() {
|
|
449
|
+
dismissIfNeeded(emitCancel: true)
|
|
435
450
|
}
|
|
436
451
|
|
|
437
452
|
// MARK: - Apply props (avoid firing valueChanged)
|
|
@@ -277,33 +277,53 @@ public final class PCSelectionMenuView: UIControl {
|
|
|
277
277
|
// Calculate menu position relative to source view
|
|
278
278
|
let sourceFrame = self.convert(self.bounds, to: vc.view)
|
|
279
279
|
let screenBounds = vc.view.bounds
|
|
280
|
-
let popoverHeight = min(
|
|
281
|
-
CGFloat(opts.count) * PCConstants.popoverRowHeight + PCConstants.popoverVerticalPadding,
|
|
282
|
-
PCConstants.popoverMaxHeight
|
|
283
|
-
)
|
|
284
280
|
let spacing: CGFloat = 8
|
|
285
281
|
|
|
282
|
+
// Adaptive width (wider at accessibility sizes), clamped to the screen.
|
|
283
|
+
let category = self.traitCollection.preferredContentSizeCategory
|
|
284
|
+
let menuWidth = min(
|
|
285
|
+
PCConstants.popoverWidth(forCategory: category),
|
|
286
|
+
screenBounds.width - 32
|
|
287
|
+
)
|
|
288
|
+
|
|
289
|
+
// Measure the real (possibly multi-line) content height so the
|
|
290
|
+
// container fits its rows instead of clipping or leaving gaps.
|
|
291
|
+
let contentHeight = opts.reduce(PCConstants.popoverVerticalPadding) { partial, opt in
|
|
292
|
+
partial + PCConstants.popoverRowHeight(forLabel: opt.label, width: menuWidth)
|
|
293
|
+
}
|
|
294
|
+
// Allow taller menus at accessibility sizes; otherwise keep them compact.
|
|
295
|
+
let maxHeight = category.isAccessibilityCategory
|
|
296
|
+
? max(PCConstants.popoverMaxHeight, screenBounds.height - 120)
|
|
297
|
+
: PCConstants.popoverMaxHeight
|
|
298
|
+
let popoverHeight = min(contentHeight, maxHeight)
|
|
299
|
+
|
|
286
300
|
// Check if menu fits below the source view
|
|
287
|
-
let
|
|
301
|
+
let firstRowHeight = PCConstants.popoverRowHeight(forLabel: opts[0].label, width: menuWidth)
|
|
288
302
|
let wouldExtendBeyondBottom = sourceFrame.maxY + spacing + popoverHeight > screenBounds.maxY - 20
|
|
289
303
|
|
|
290
|
-
|
|
304
|
+
var menuY: CGFloat
|
|
291
305
|
if wouldExtendBeyondBottom {
|
|
292
306
|
// Position above the source view (no overlap offset)
|
|
293
307
|
menuY = sourceFrame.minY - spacing - popoverHeight
|
|
294
308
|
} else {
|
|
295
309
|
// Position below, but shift up by one row to overlap trigger (like system menu)
|
|
296
|
-
menuY = sourceFrame.maxY + spacing -
|
|
310
|
+
menuY = sourceFrame.maxY + spacing - firstRowHeight
|
|
297
311
|
}
|
|
298
312
|
|
|
313
|
+
// Keep the menu fully on screen vertically (tall menus at large
|
|
314
|
+
// Dynamic Type sizes can otherwise run off the top or bottom).
|
|
315
|
+
let topMargin = vc.view.safeAreaInsets.top + spacing
|
|
316
|
+
let bottomLimit = screenBounds.maxY - vc.view.safeAreaInsets.bottom - spacing - popoverHeight
|
|
317
|
+
menuY = min(max(menuY, topMargin), max(topMargin, bottomLimit))
|
|
318
|
+
|
|
299
319
|
// Center horizontally, but keep within screen bounds
|
|
300
|
-
var menuX = sourceFrame.midX -
|
|
301
|
-
menuX = max(16, min(menuX, screenBounds.maxX -
|
|
320
|
+
var menuX = sourceFrame.midX - menuWidth / 2
|
|
321
|
+
menuX = max(16, min(menuX, screenBounds.maxX - menuWidth - 16))
|
|
302
322
|
|
|
303
323
|
let menuFrame = CGRect(
|
|
304
324
|
x: menuX,
|
|
305
325
|
y: menuY,
|
|
306
|
-
width:
|
|
326
|
+
width: menuWidth,
|
|
307
327
|
height: popoverHeight
|
|
308
328
|
)
|
|
309
329
|
|
|
@@ -365,6 +385,11 @@ public final class PCSelectionMenuView: UIControl {
|
|
|
365
385
|
private class PCGlassMenuCell: UITableViewCell {
|
|
366
386
|
static let reuseIdentifier = "PCGlassMenuCell"
|
|
367
387
|
|
|
388
|
+
/// Custom multi-line label. We avoid the legacy `textLabel` because it
|
|
389
|
+
/// defaults to a single line and does not drive self-sizing reliably, which
|
|
390
|
+
/// caused rows to overlap at large Dynamic Type sizes.
|
|
391
|
+
let menuLabel = UILabel()
|
|
392
|
+
|
|
368
393
|
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
|
|
369
394
|
super.init(style: style, reuseIdentifier: reuseIdentifier)
|
|
370
395
|
setupCell()
|
|
@@ -379,8 +404,26 @@ private class PCGlassMenuCell: UITableViewCell {
|
|
|
379
404
|
backgroundColor = .clear
|
|
380
405
|
contentView.backgroundColor = .clear
|
|
381
406
|
selectionStyle = .none
|
|
382
|
-
|
|
383
|
-
|
|
407
|
+
|
|
408
|
+
menuLabel.font = .preferredFont(forTextStyle: .body)
|
|
409
|
+
menuLabel.adjustsFontForContentSizeCategory = true
|
|
410
|
+
menuLabel.numberOfLines = 0
|
|
411
|
+
menuLabel.translatesAutoresizingMaskIntoConstraints = false
|
|
412
|
+
contentView.addSubview(menuLabel)
|
|
413
|
+
|
|
414
|
+
let v = PCConstants.popoverRowVerticalPadding / 2
|
|
415
|
+
let h = PCConstants.popoverRowHorizontalInset
|
|
416
|
+
// Center the label and let it grow the row vertically. The min-height
|
|
417
|
+
// constraint guarantees the 44pt touch target for short labels, while
|
|
418
|
+
// the >= top / <= bottom pair lets tall (wrapped) labels expand the row.
|
|
419
|
+
NSLayoutConstraint.activate([
|
|
420
|
+
menuLabel.topAnchor.constraint(greaterThanOrEqualTo: contentView.topAnchor, constant: v),
|
|
421
|
+
menuLabel.bottomAnchor.constraint(lessThanOrEqualTo: contentView.bottomAnchor, constant: -v),
|
|
422
|
+
menuLabel.centerYAnchor.constraint(equalTo: contentView.centerYAnchor),
|
|
423
|
+
menuLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: h),
|
|
424
|
+
menuLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -h),
|
|
425
|
+
contentView.heightAnchor.constraint(greaterThanOrEqualToConstant: PCConstants.popoverRowHeightMin),
|
|
426
|
+
])
|
|
384
427
|
}
|
|
385
428
|
}
|
|
386
429
|
|
|
@@ -451,7 +494,10 @@ private class PCMenuViewController: UIViewController, UITableViewDelegate, UITab
|
|
|
451
494
|
tableView.backgroundColor = .clear
|
|
452
495
|
tableView.separatorStyle = .none
|
|
453
496
|
tableView.isScrollEnabled = true
|
|
454
|
-
|
|
497
|
+
// Self-sizing rows so labels that wrap at large Dynamic Type sizes get
|
|
498
|
+
// the height they need instead of overlapping a fixed-height row.
|
|
499
|
+
tableView.rowHeight = UITableView.automaticDimension
|
|
500
|
+
tableView.estimatedRowHeight = PCConstants.popoverRowHeight
|
|
455
501
|
tableView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
|
|
456
502
|
let verticalPad = PCConstants.popoverVerticalPadding / 2
|
|
457
503
|
tableView.contentInset = UIEdgeInsets(top: verticalPad, left: 0, bottom: verticalPad, right: 0)
|
|
@@ -479,7 +525,7 @@ private class PCMenuViewController: UIViewController, UITableViewDelegate, UITab
|
|
|
479
525
|
|
|
480
526
|
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
|
481
527
|
let cell = tableView.dequeueReusableCell(withIdentifier: PCGlassMenuCell.reuseIdentifier, for: indexPath)
|
|
482
|
-
cell.
|
|
528
|
+
(cell as? PCGlassMenuCell)?.menuLabel.text = options[indexPath.row].label
|
|
483
529
|
return cell
|
|
484
530
|
}
|
|
485
531
|
|
|
@@ -65,7 +65,8 @@ function DatePicker(props) {
|
|
|
65
65
|
preferredStyle: ios.preferredStyle,
|
|
66
66
|
countDownDurationSeconds: ios.countDownDurationSeconds,
|
|
67
67
|
minuteInterval: ios.minuteInterval,
|
|
68
|
-
roundsToMinuteInterval: ios.roundsToMinuteInterval
|
|
68
|
+
roundsToMinuteInterval: ios.roundsToMinuteInterval,
|
|
69
|
+
confirmToolbar: ios.showConfirmToolbar === false ? 'hide' : 'show'
|
|
69
70
|
} : undefined,
|
|
70
71
|
android: android ? {
|
|
71
72
|
firstDayOfWeek: android.firstDayOfWeek,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_DatePickerNativeComponent","_interopRequireDefault","_jsxRuntime","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","NO_DATE_SENTINEL","Number","MIN_SAFE_INTEGER","dateToMsOrSentinel","d","ms","getTime","isFinite","normalizeVisible","presentation","visible","undefined","DatePicker","props","style","date","minDate","maxDate","locale","timeZoneName","mode","onConfirm","onClosed","ios","android","testID","isModal","handleConfirm","useCallback","Date","nativeEvent","timestampMs","confirmed","handleClosed","nativeProps","styles","picker","dateMs","minDateMs","maxDateMs","preferredStyle","countDownDurationSeconds","minuteInterval","roundsToMinuteInterval","firstDayOfWeek","material","dialogTitle","positiveButtonTitle","negativeButtonTitle","jsx","StyleSheet","create"],"sourceRoot":"../../src","sources":["DatePicker.tsx"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AAEA,IAAAC,YAAA,GAAAD,OAAA;AAEA,IAAAE,0BAAA,GAAAC,sBAAA,CAAAH,OAAA;AASqC,IAAAI,WAAA,GAAAJ,OAAA;AAAA,SAAAG,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,SAAAN,wBAAAM,CAAA,EAAAG,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAV,uBAAA,YAAAA,CAAAM,CAAA,EAAAG,CAAA,SAAAA,CAAA,IAAAH,CAAA,IAAAA,CAAA,CAAAC,UAAA,SAAAD,CAAA,MAAAO,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAR,OAAA,EAAAF,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAS,CAAA,MAAAF,CAAA,GAAAJ,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAE,CAAA,CAAAI,GAAA,CAAAX,CAAA,UAAAO,CAAA,CAAAK,GAAA,CAAAZ,CAAA,GAAAO,CAAA,CAAAM,GAAA,CAAAb,CAAA,EAAAS,CAAA,gBAAAN,CAAA,IAAAH,CAAA,gBAAAG,CAAA,OAAAW,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAG,CAAA,OAAAK,CAAA,IAAAD,CAAA,GAAAS,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAG,CAAA,OAAAK,CAAA,CAAAI,GAAA,IAAAJ,CAAA,CAAAK,GAAA,IAAAN,CAAA,CAAAE,CAAA,EAAAN,CAAA,EAAAK,CAAA,IAAAC,CAAA,CAAAN,CAAA,IAAAH,CAAA,CAAAG,CAAA,WAAAM,CAAA,KAAAT,CAAA,EAAAG,CAAA;AAdrC;;
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_DatePickerNativeComponent","_interopRequireDefault","_jsxRuntime","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","NO_DATE_SENTINEL","Number","MIN_SAFE_INTEGER","dateToMsOrSentinel","d","ms","getTime","isFinite","normalizeVisible","presentation","visible","undefined","DatePicker","props","style","date","minDate","maxDate","locale","timeZoneName","mode","onConfirm","onClosed","ios","android","testID","isModal","handleConfirm","useCallback","Date","nativeEvent","timestampMs","confirmed","handleClosed","nativeProps","styles","picker","dateMs","minDateMs","maxDateMs","preferredStyle","countDownDurationSeconds","minuteInterval","roundsToMinuteInterval","confirmToolbar","showConfirmToolbar","firstDayOfWeek","material","dialogTitle","positiveButtonTitle","negativeButtonTitle","jsx","StyleSheet","create"],"sourceRoot":"../../src","sources":["DatePicker.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,12 +14,14 @@ export type DatePickerPresentation = 'modal' | 'embedded';
|
|
|
14
14
|
|
|
15
15
|
export type IOSDatePickerStyle = 'automatic' | 'compact' | 'inline' | 'wheels';
|
|
16
16
|
export type IOSRoundsToMinuteInterval = 'inherit' | 'round' | 'noRound';
|
|
17
|
+
export type IOSConfirmToolbar = 'show' | 'hide';
|
|
17
18
|
|
|
18
19
|
export type IOSProps = {
|
|
19
20
|
preferredStyle?: string; // IOSDatePickerStyle
|
|
20
21
|
countDownDurationSeconds?: CodegenTypes.Double;
|
|
21
22
|
minuteInterval?: CodegenTypes.Int32;
|
|
22
23
|
roundsToMinuteInterval?: string; // IOSRoundsToMinuteInterval
|
|
24
|
+
confirmToolbar?: string; // IOSConfirmToolbar
|
|
23
25
|
};
|
|
24
26
|
|
|
25
27
|
export type AndroidProps = {
|
package/lib/module/DatePicker.js
CHANGED
|
@@ -58,7 +58,8 @@ export function DatePicker(props) {
|
|
|
58
58
|
preferredStyle: ios.preferredStyle,
|
|
59
59
|
countDownDurationSeconds: ios.countDownDurationSeconds,
|
|
60
60
|
minuteInterval: ios.minuteInterval,
|
|
61
|
-
roundsToMinuteInterval: ios.roundsToMinuteInterval
|
|
61
|
+
roundsToMinuteInterval: ios.roundsToMinuteInterval,
|
|
62
|
+
confirmToolbar: ios.showConfirmToolbar === false ? 'hide' : 'show'
|
|
62
63
|
} : undefined,
|
|
63
64
|
android: android ? {
|
|
64
65
|
firstDayOfWeek: android.firstDayOfWeek,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useCallback","StyleSheet","NativeDatePicker","jsx","_jsx","NO_DATE_SENTINEL","Number","MIN_SAFE_INTEGER","dateToMsOrSentinel","d","ms","getTime","isFinite","normalizeVisible","presentation","visible","undefined","DatePicker","props","style","date","minDate","maxDate","locale","timeZoneName","mode","onConfirm","onClosed","ios","android","testID","isModal","handleConfirm","e","Date","nativeEvent","timestampMs","confirmed","handleClosed","nativeProps","styles","picker","dateMs","minDateMs","maxDateMs","preferredStyle","countDownDurationSeconds","minuteInterval","roundsToMinuteInterval","firstDayOfWeek","material","dialogTitle","positiveButtonTitle","negativeButtonTitle","create"],"sourceRoot":"../../src","sources":["DatePicker.tsx"],"mappings":";;AAAA;AACA,OAAOA,KAAK,IAAIC,WAAW,QAAQ,OAAO;AAE1C,SAASC,UAAU,QAAQ,cAAc;AAEzC,OAAOC,gBAAgB,MAShB,6BAA6B;AAAC,SAAAC,GAAA,IAAAC,IAAA;
|
|
1
|
+
{"version":3,"names":["React","useCallback","StyleSheet","NativeDatePicker","jsx","_jsx","NO_DATE_SENTINEL","Number","MIN_SAFE_INTEGER","dateToMsOrSentinel","d","ms","getTime","isFinite","normalizeVisible","presentation","visible","undefined","DatePicker","props","style","date","minDate","maxDate","locale","timeZoneName","mode","onConfirm","onClosed","ios","android","testID","isModal","handleConfirm","e","Date","nativeEvent","timestampMs","confirmed","handleClosed","nativeProps","styles","picker","dateMs","minDateMs","maxDateMs","preferredStyle","countDownDurationSeconds","minuteInterval","roundsToMinuteInterval","confirmToolbar","showConfirmToolbar","firstDayOfWeek","material","dialogTitle","positiveButtonTitle","negativeButtonTitle","create"],"sourceRoot":"../../src","sources":["DatePicker.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,12 +14,14 @@ export type DatePickerPresentation = 'modal' | 'embedded';
|
|
|
14
14
|
|
|
15
15
|
export type IOSDatePickerStyle = 'automatic' | 'compact' | 'inline' | 'wheels';
|
|
16
16
|
export type IOSRoundsToMinuteInterval = 'inherit' | 'round' | 'noRound';
|
|
17
|
+
export type IOSConfirmToolbar = 'show' | 'hide';
|
|
17
18
|
|
|
18
19
|
export type IOSProps = {
|
|
19
20
|
preferredStyle?: string; // IOSDatePickerStyle
|
|
20
21
|
countDownDurationSeconds?: CodegenTypes.Double;
|
|
21
22
|
minuteInterval?: CodegenTypes.Int32;
|
|
22
23
|
roundsToMinuteInterval?: string; // IOSRoundsToMinuteInterval
|
|
24
|
+
confirmToolbar?: string; // IOSConfirmToolbar
|
|
23
25
|
};
|
|
24
26
|
|
|
25
27
|
export type AndroidProps = {
|
|
@@ -27,6 +27,14 @@ export type DatePickerProps = {
|
|
|
27
27
|
countDownDurationSeconds?: NativeIOSProps['countDownDurationSeconds'];
|
|
28
28
|
minuteInterval?: NativeIOSProps['minuteInterval'];
|
|
29
29
|
roundsToMinuteInterval?: IOSRoundsToMinuteInterval;
|
|
30
|
+
/**
|
|
31
|
+
* Modal only. Show a Cancel/Done toolbar below the picker. Defaults to
|
|
32
|
+
* true. When false, `onConfirm` never fires with `confirmed: true` —
|
|
33
|
+
* the caller is expected to drive dismissal themselves by flipping
|
|
34
|
+
* `visible` off (and can read the current date from the stream of
|
|
35
|
+
* `confirmed: false` events).
|
|
36
|
+
*/
|
|
37
|
+
showConfirmToolbar?: boolean;
|
|
30
38
|
};
|
|
31
39
|
android?: {
|
|
32
40
|
firstDayOfWeek?: NativeAndroidProps['firstDayOfWeek'];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePicker.d.ts","sourceRoot":"","sources":["../../../../src/DatePicker.tsx"],"names":[],"mappings":"AACA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAwB,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG/E,OAAyB,EAGvB,KAAK,QAAQ,IAAI,cAAc,EAC/B,KAAK,YAAY,IAAI,kBAAkB,EACvC,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,EACxB,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,mBAAmB,EAAW,MAAM,eAAe,CAAC;AAElE,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAE7B,2DAA2D;IAC3D,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAElB,mDAAmD;IACnD,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAEtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,YAAY,CAAC,EAAE,sBAAsB,CAAC;IAEtC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IACzD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAEtB,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,GAAG,CAAC,EAAE;QACJ,cAAc,CAAC,EAAE,kBAAkB,CAAC;QACpC,wBAAwB,CAAC,EAAE,cAAc,CAAC,0BAA0B,CAAC,CAAC;QACtE,cAAc,CAAC,EAAE,cAAc,CAAC,gBAAgB,CAAC,CAAC;QAClD,sBAAsB,CAAC,EAAE,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"DatePicker.d.ts","sourceRoot":"","sources":["../../../../src/DatePicker.tsx"],"names":[],"mappings":"AACA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAwB,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG/E,OAAyB,EAGvB,KAAK,QAAQ,IAAI,cAAc,EAC/B,KAAK,YAAY,IAAI,kBAAkB,EACvC,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,EACxB,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,mBAAmB,EAAW,MAAM,eAAe,CAAC;AAElE,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAE7B,2DAA2D;IAC3D,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAElB,mDAAmD;IACnD,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAEtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,YAAY,CAAC,EAAE,sBAAsB,CAAC;IAEtC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IACzD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAEtB,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,GAAG,CAAC,EAAE;QACJ,cAAc,CAAC,EAAE,kBAAkB,CAAC;QACpC,wBAAwB,CAAC,EAAE,cAAc,CAAC,0BAA0B,CAAC,CAAC;QACtE,cAAc,CAAC,EAAE,cAAc,CAAC,gBAAgB,CAAC,CAAC;QAClD,sBAAsB,CAAC,EAAE,yBAAyB,CAAC;QACnD;;;;;;WAMG;QACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,CAAC;IAEF,OAAO,CAAC,EAAE;QACR,cAAc,CAAC,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;QACtD,QAAQ,CAAC,EAAE,mBAAmB,CAAC;QAC/B,WAAW,CAAC,EAAE,kBAAkB,CAAC,aAAa,CAAC,CAAC;QAChD,mBAAmB,CAAC,EAAE,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;QAChE,mBAAmB,CAAC,EAAE,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;KACjE,CAAC;CACH,CAAC;AAqBF,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,CAsErE"}
|
|
@@ -8,11 +8,13 @@ export type DatePickerMode = 'date' | 'time' | 'dateAndTime' | 'countDownTimer';
|
|
|
8
8
|
export type DatePickerPresentation = 'modal' | 'embedded';
|
|
9
9
|
export type IOSDatePickerStyle = 'automatic' | 'compact' | 'inline' | 'wheels';
|
|
10
10
|
export type IOSRoundsToMinuteInterval = 'inherit' | 'round' | 'noRound';
|
|
11
|
+
export type IOSConfirmToolbar = 'show' | 'hide';
|
|
11
12
|
export type IOSProps = {
|
|
12
13
|
preferredStyle?: string;
|
|
13
14
|
countDownDurationSeconds?: CodegenTypes.Double;
|
|
14
15
|
minuteInterval?: CodegenTypes.Int32;
|
|
15
16
|
roundsToMinuteInterval?: string;
|
|
17
|
+
confirmToolbar?: string;
|
|
16
18
|
};
|
|
17
19
|
export type AndroidProps = {
|
|
18
20
|
firstDayOfWeek?: CodegenTypes.Int32;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePickerNativeComponent.d.ts","sourceRoot":"","sources":["../../../../src/DatePickerNativeComponent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG5D,MAAM,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC;AAE9C,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,EAAE,YAAY,CAAC,MAAM,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,GAAG,gBAAgB,CAAC;AAChF,MAAM,MAAM,sBAAsB,GAAG,OAAO,GAAG,UAAU,CAAC;AAE1D,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC/E,MAAM,MAAM,yBAAyB,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"DatePickerNativeComponent.d.ts","sourceRoot":"","sources":["../../../../src/DatePickerNativeComponent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG5D,MAAM,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC;AAE9C,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,EAAE,YAAY,CAAC,MAAM,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,GAAG,gBAAgB,CAAC;AAChF,MAAM,MAAM,sBAAsB,GAAG,OAAO,GAAG,UAAU,CAAC;AAE1D,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC/E,MAAM,MAAM,yBAAyB,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AACxE,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,CAAC;AAEhD,MAAM,MAAM,QAAQ,GAAG;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wBAAwB,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC;IAC/C,cAAc,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC;IACpC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,cAAc,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;AACpC,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;AACxC,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;AAEtC;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,MAAM,CAAC,EAAE,YAAY,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,gBAAgB,CAAC,CAAC;IAClE,SAAS,CAAC,EAAE,YAAY,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,gBAAgB,CAAC,CAAC;IACrE,SAAS,CAAC,EAAE,YAAY,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,gBAAgB,CAAC,CAAC;IAErE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,WAAW,WAAY,SAAQ,SAAS,EAAE,WAAW;IACzD,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,OAAO,CAAC,EAAE,YAAY,CAAC;IAEvB,SAAS,CAAC,EAAE,YAAY,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC;IAC/D,QAAQ,CAAC,EAAE,YAAY,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;CAC5D;;AAED,wBAAmE"}
|
|
@@ -27,6 +27,14 @@ export type DatePickerProps = {
|
|
|
27
27
|
countDownDurationSeconds?: NativeIOSProps['countDownDurationSeconds'];
|
|
28
28
|
minuteInterval?: NativeIOSProps['minuteInterval'];
|
|
29
29
|
roundsToMinuteInterval?: IOSRoundsToMinuteInterval;
|
|
30
|
+
/**
|
|
31
|
+
* Modal only. Show a Cancel/Done toolbar below the picker. Defaults to
|
|
32
|
+
* true. When false, `onConfirm` never fires with `confirmed: true` —
|
|
33
|
+
* the caller is expected to drive dismissal themselves by flipping
|
|
34
|
+
* `visible` off (and can read the current date from the stream of
|
|
35
|
+
* `confirmed: false` events).
|
|
36
|
+
*/
|
|
37
|
+
showConfirmToolbar?: boolean;
|
|
30
38
|
};
|
|
31
39
|
android?: {
|
|
32
40
|
firstDayOfWeek?: NativeAndroidProps['firstDayOfWeek'];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePicker.d.ts","sourceRoot":"","sources":["../../../../src/DatePicker.tsx"],"names":[],"mappings":"AACA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAwB,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG/E,OAAyB,EAGvB,KAAK,QAAQ,IAAI,cAAc,EAC/B,KAAK,YAAY,IAAI,kBAAkB,EACvC,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,EACxB,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,mBAAmB,EAAW,MAAM,eAAe,CAAC;AAElE,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAE7B,2DAA2D;IAC3D,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAElB,mDAAmD;IACnD,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAEtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,YAAY,CAAC,EAAE,sBAAsB,CAAC;IAEtC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IACzD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAEtB,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,GAAG,CAAC,EAAE;QACJ,cAAc,CAAC,EAAE,kBAAkB,CAAC;QACpC,wBAAwB,CAAC,EAAE,cAAc,CAAC,0BAA0B,CAAC,CAAC;QACtE,cAAc,CAAC,EAAE,cAAc,CAAC,gBAAgB,CAAC,CAAC;QAClD,sBAAsB,CAAC,EAAE,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"DatePicker.d.ts","sourceRoot":"","sources":["../../../../src/DatePicker.tsx"],"names":[],"mappings":"AACA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAwB,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG/E,OAAyB,EAGvB,KAAK,QAAQ,IAAI,cAAc,EAC/B,KAAK,YAAY,IAAI,kBAAkB,EACvC,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,EACxB,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,mBAAmB,EAAW,MAAM,eAAe,CAAC;AAElE,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAE7B,2DAA2D;IAC3D,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAElB,mDAAmD;IACnD,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAEtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,YAAY,CAAC,EAAE,sBAAsB,CAAC;IAEtC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IACzD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAEtB,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,GAAG,CAAC,EAAE;QACJ,cAAc,CAAC,EAAE,kBAAkB,CAAC;QACpC,wBAAwB,CAAC,EAAE,cAAc,CAAC,0BAA0B,CAAC,CAAC;QACtE,cAAc,CAAC,EAAE,cAAc,CAAC,gBAAgB,CAAC,CAAC;QAClD,sBAAsB,CAAC,EAAE,yBAAyB,CAAC;QACnD;;;;;;WAMG;QACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,CAAC;IAEF,OAAO,CAAC,EAAE;QACR,cAAc,CAAC,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;QACtD,QAAQ,CAAC,EAAE,mBAAmB,CAAC;QAC/B,WAAW,CAAC,EAAE,kBAAkB,CAAC,aAAa,CAAC,CAAC;QAChD,mBAAmB,CAAC,EAAE,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;QAChE,mBAAmB,CAAC,EAAE,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;KACjE,CAAC;CACH,CAAC;AAqBF,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,CAsErE"}
|
|
@@ -8,11 +8,13 @@ export type DatePickerMode = 'date' | 'time' | 'dateAndTime' | 'countDownTimer';
|
|
|
8
8
|
export type DatePickerPresentation = 'modal' | 'embedded';
|
|
9
9
|
export type IOSDatePickerStyle = 'automatic' | 'compact' | 'inline' | 'wheels';
|
|
10
10
|
export type IOSRoundsToMinuteInterval = 'inherit' | 'round' | 'noRound';
|
|
11
|
+
export type IOSConfirmToolbar = 'show' | 'hide';
|
|
11
12
|
export type IOSProps = {
|
|
12
13
|
preferredStyle?: string;
|
|
13
14
|
countDownDurationSeconds?: CodegenTypes.Double;
|
|
14
15
|
minuteInterval?: CodegenTypes.Int32;
|
|
15
16
|
roundsToMinuteInterval?: string;
|
|
17
|
+
confirmToolbar?: string;
|
|
16
18
|
};
|
|
17
19
|
export type AndroidProps = {
|
|
18
20
|
firstDayOfWeek?: CodegenTypes.Int32;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePickerNativeComponent.d.ts","sourceRoot":"","sources":["../../../../src/DatePickerNativeComponent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG5D,MAAM,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC;AAE9C,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,EAAE,YAAY,CAAC,MAAM,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,GAAG,gBAAgB,CAAC;AAChF,MAAM,MAAM,sBAAsB,GAAG,OAAO,GAAG,UAAU,CAAC;AAE1D,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC/E,MAAM,MAAM,yBAAyB,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"DatePickerNativeComponent.d.ts","sourceRoot":"","sources":["../../../../src/DatePickerNativeComponent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG5D,MAAM,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC;AAE9C,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,EAAE,YAAY,CAAC,MAAM,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,GAAG,gBAAgB,CAAC;AAChF,MAAM,MAAM,sBAAsB,GAAG,OAAO,GAAG,UAAU,CAAC;AAE1D,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC/E,MAAM,MAAM,yBAAyB,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AACxE,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,CAAC;AAEhD,MAAM,MAAM,QAAQ,GAAG;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wBAAwB,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC;IAC/C,cAAc,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC;IACpC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,cAAc,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;AACpC,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;AACxC,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;AAEtC;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,MAAM,CAAC,EAAE,YAAY,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,gBAAgB,CAAC,CAAC;IAClE,SAAS,CAAC,EAAE,YAAY,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,gBAAgB,CAAC,CAAC;IACrE,SAAS,CAAC,EAAE,YAAY,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,gBAAgB,CAAC,CAAC;IAErE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,WAAW,WAAY,SAAQ,SAAS,EAAE,WAAW;IACzD,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,OAAO,CAAC,EAAE,YAAY,CAAC;IAEvB,SAAS,CAAC,EAAE,YAAY,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC;IAC/D,QAAQ,CAAC,EAAE,YAAY,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;CAC5D;;AAED,wBAAmE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-platform-components",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.10",
|
|
4
4
|
"description": "Native UI components for React Native: DatePicker, ContextMenu, SelectionMenu, SegmentedControl, LiquidGlass.",
|
|
5
5
|
"main": "./lib/commonjs/index.js",
|
|
6
6
|
"module": "./lib/module/index.js",
|
|
@@ -110,15 +110,16 @@
|
|
|
110
110
|
"@eslint/compat": "^2.0.1",
|
|
111
111
|
"@eslint/eslintrc": "^3.3.3",
|
|
112
112
|
"@eslint/js": "^9.39.2",
|
|
113
|
-
"@expo/config-plugins": "^
|
|
114
|
-
"@react-native-community/cli": "20.1.
|
|
115
|
-
"@react-native/babel-preset": "0.
|
|
116
|
-
"@react-native/eslint-config": "^0.
|
|
113
|
+
"@expo/config-plugins": "^56.0.8",
|
|
114
|
+
"@react-native-community/cli": "20.1.3",
|
|
115
|
+
"@react-native/babel-preset": "0.85.3",
|
|
116
|
+
"@react-native/eslint-config": "^0.85.3",
|
|
117
|
+
"@react-native/jest-preset": "0.85.3",
|
|
117
118
|
"@release-it/conventional-changelog": "^10.0.4",
|
|
118
119
|
"@types/jest": "^30.0.0",
|
|
119
120
|
"@types/react": "^19.2.9",
|
|
120
121
|
"@types/react-test-renderer": "^19.1.0",
|
|
121
|
-
"babel-preset-expo": "^
|
|
122
|
+
"babel-preset-expo": "^56.0.14",
|
|
122
123
|
"commitlint": "^20.3.1",
|
|
123
124
|
"del-cli": "^7.0.0",
|
|
124
125
|
"eslint": "^9.39.2",
|
|
@@ -128,7 +129,7 @@
|
|
|
128
129
|
"lefthook": "^2.0.15",
|
|
129
130
|
"prettier": "^3.8.1",
|
|
130
131
|
"react": "19.2.3",
|
|
131
|
-
"react-native": "0.
|
|
132
|
+
"react-native": "0.85.3",
|
|
132
133
|
"react-native-builder-bob": "^0.40.17",
|
|
133
134
|
"react-test-renderer": "19.2.3",
|
|
134
135
|
"release-it": "^19.2.4",
|
|
@@ -218,7 +219,7 @@
|
|
|
218
219
|
}
|
|
219
220
|
},
|
|
220
221
|
"jest": {
|
|
221
|
-
"preset": "react-native",
|
|
222
|
+
"preset": "@react-native/jest-preset",
|
|
222
223
|
"modulePathIgnorePatterns": [
|
|
223
224
|
"<rootDir>/example/node_modules",
|
|
224
225
|
"<rootDir>/lib/"
|
package/src/DatePicker.tsx
CHANGED
|
@@ -48,6 +48,14 @@ export type DatePickerProps = {
|
|
|
48
48
|
countDownDurationSeconds?: NativeIOSProps['countDownDurationSeconds'];
|
|
49
49
|
minuteInterval?: NativeIOSProps['minuteInterval'];
|
|
50
50
|
roundsToMinuteInterval?: IOSRoundsToMinuteInterval;
|
|
51
|
+
/**
|
|
52
|
+
* Modal only. Show a Cancel/Done toolbar below the picker. Defaults to
|
|
53
|
+
* true. When false, `onConfirm` never fires with `confirmed: true` —
|
|
54
|
+
* the caller is expected to drive dismissal themselves by flipping
|
|
55
|
+
* `visible` off (and can read the current date from the stream of
|
|
56
|
+
* `confirmed: false` events).
|
|
57
|
+
*/
|
|
58
|
+
showConfirmToolbar?: boolean;
|
|
51
59
|
};
|
|
52
60
|
|
|
53
61
|
android?: {
|
|
@@ -132,6 +140,7 @@ export function DatePicker(props: DatePickerProps): React.ReactElement {
|
|
|
132
140
|
countDownDurationSeconds: ios.countDownDurationSeconds,
|
|
133
141
|
minuteInterval: ios.minuteInterval,
|
|
134
142
|
roundsToMinuteInterval: ios.roundsToMinuteInterval,
|
|
143
|
+
confirmToolbar: ios.showConfirmToolbar === false ? 'hide' : 'show',
|
|
135
144
|
}
|
|
136
145
|
: undefined,
|
|
137
146
|
|
|
@@ -14,12 +14,14 @@ export type DatePickerPresentation = 'modal' | 'embedded';
|
|
|
14
14
|
|
|
15
15
|
export type IOSDatePickerStyle = 'automatic' | 'compact' | 'inline' | 'wheels';
|
|
16
16
|
export type IOSRoundsToMinuteInterval = 'inherit' | 'round' | 'noRound';
|
|
17
|
+
export type IOSConfirmToolbar = 'show' | 'hide';
|
|
17
18
|
|
|
18
19
|
export type IOSProps = {
|
|
19
20
|
preferredStyle?: string; // IOSDatePickerStyle
|
|
20
21
|
countDownDurationSeconds?: CodegenTypes.Double;
|
|
21
22
|
minuteInterval?: CodegenTypes.Int32;
|
|
22
23
|
roundsToMinuteInterval?: string; // IOSRoundsToMinuteInterval
|
|
24
|
+
confirmToolbar?: string; // IOSConfirmToolbar
|
|
23
25
|
};
|
|
24
26
|
|
|
25
27
|
export type AndroidProps = {
|