diff --git a/.changes/fix-default-arg-value.md b/.changes/fix-default-arg-value.md new file mode 100644 index 00000000..b2657724 --- /dev/null +++ b/.changes/fix-default-arg-value.md @@ -0,0 +1,7 @@ +--- +"notification": patch +"barcode-scanner": patch +"dialog": patch +--- + +Fixes command argument parsing on iOS. diff --git a/plugins/barcode-scanner/ios/Sources/BarcodeScannerPlugin.swift b/plugins/barcode-scanner/ios/Sources/BarcodeScannerPlugin.swift index 7a329e37..ec16ad59 100644 --- a/plugins/barcode-scanner/ios/Sources/BarcodeScannerPlugin.swift +++ b/plugins/barcode-scanner/ios/Sources/BarcodeScannerPlugin.swift @@ -8,7 +8,7 @@ import UIKit import WebKit struct ScanOptions: Decodable { - var formats: [SupportedFormat] = [] + var formats: [SupportedFormat]? let windowed: Bool? let cameraDirection: String? } @@ -241,7 +241,7 @@ class BarcodeScannerPlugin: Plugin, AVCaptureMetadataOutputObjectsDelegate { private func runScanner(_ invoke: Invoke, args: ScanOptions) { scanFormats = [AVMetadataObject.ObjectType]() - args.formats.forEach { format in + (args.formats ?? []).forEach { format in scanFormats.append(format.value) } diff --git a/plugins/dialog/ios/Sources/DialogPlugin.swift b/plugins/dialog/ios/Sources/DialogPlugin.swift index 40f51571..26c9fefa 100644 --- a/plugins/dialog/ios/Sources/DialogPlugin.swift +++ b/plugins/dialog/ios/Sources/DialogPlugin.swift @@ -19,18 +19,18 @@ enum FilePickerEvent { struct MessageDialogOptions: Decodable { let title: String? let message: String - var okButtonLabel = "OK" - var cancelButtonLabel = "Cancel" + let okButtonLabel: String? + let cancelButtonLabel: String? } struct Filter: Decodable { - var extensions: [String] = [] + var extensions: [String]? } struct FilePickerOptions: Decodable { - var multiple = false - var readData = false - var filters: [Filter] = [] + var multiple: Bool? + var readData: Bool? + var filters: [Filter]? } class DialogPlugin: Plugin { @@ -47,7 +47,7 @@ class DialogPlugin: Plugin { @objc public func showFilePicker(_ invoke: Invoke) throws { let args = try invoke.parseArgs(FilePickerOptions.self) - let parsedTypes = parseFiltersOption(args.filters) + let parsedTypes = parseFiltersOption(args.filters ?? []) var isMedia = true var uniqueMimeType: Bool? = nil @@ -74,7 +74,7 @@ class DialogPlugin: Plugin { DispatchQueue.main.async { if #available(iOS 14, *) { var configuration = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared()) - configuration.selectionLimit = args.multiple ? 0 : 1 + configuration.selectionLimit = (args.multiple ?? false) ? 0 : 1 if uniqueMimeType == true { if mimeKind == "image" { @@ -106,7 +106,7 @@ class DialogPlugin: Plugin { DispatchQueue.main.async { let picker = UIDocumentPickerViewController(documentTypes: documentTypes, in: .import) picker.delegate = self.filePickerController - picker.allowsMultipleSelection = args.multiple + picker.allowsMultipleSelection = args.multiple ?? false picker.modalPresentationStyle = .fullScreen self.presentViewController(picker) } @@ -120,7 +120,7 @@ class DialogPlugin: Plugin { private func parseFiltersOption(_ filters: [Filter]) -> [String] { var parsedTypes: [String] = [] for filter in filters { - for ext in filter.extensions { + for ext in filter.extensions ?? [] { guard let utType: String = UTTypeCreatePreferredIdentifierForTag( kUTTagClassMIMEType, ext as CFString, nil)?.takeRetainedValue() as String? @@ -197,24 +197,36 @@ class DialogPlugin: Plugin { DispatchQueue.main.async { [] in let alert = UIAlertController( title: args.title, message: args.message, preferredStyle: UIAlertController.Style.alert) - alert.addAction( - UIAlertAction( - title: args.cancelButtonLabel, style: UIAlertAction.Style.default, - handler: { (_) -> Void in - invoke.resolve([ - "value": false, - "cancelled": false, - ]) - })) - alert.addAction( - UIAlertAction( - title: args.okButtonLabel, style: UIAlertAction.Style.default, - handler: { (_) -> Void in - invoke.resolve([ - "value": true, - "cancelled": false, - ]) - })) + + let cancelButtonLabel = args.cancelButtonLabel ?? "" + if !cancelButtonLabel.isEmpty { + alert.addAction( + UIAlertAction( + title: cancelButtonLabel, style: UIAlertAction.Style.default, + handler: { (_) -> Void in + Logger.error("cancel") + + invoke.resolve([ + "value": false, + "cancelled": false, + ]) + })) + } + + let okButtonLabel = args.okButtonLabel ?? (cancelButtonLabel.isEmpty ? "OK" : "") + if !okButtonLabel.isEmpty { + alert.addAction( + UIAlertAction( + title: okButtonLabel, style: UIAlertAction.Style.default, + handler: { (_) -> Void in + Logger.error("ok") + + invoke.resolve([ + "value": true, + "cancelled": false, + ]) + })) + } manager.viewController?.present(alert, animated: true, completion: nil) } diff --git a/plugins/notification/ios/Sources/NotificationCategory.swift b/plugins/notification/ios/Sources/NotificationCategory.swift index a5d4eea6..f796e03a 100644 --- a/plugins/notification/ios/Sources/NotificationCategory.swift +++ b/plugins/notification/ios/Sources/NotificationCategory.swift @@ -40,7 +40,7 @@ func makeActions(_ actions: [Action]) -> [UNNotificationAction] { for action in actions { var newAction: UNNotificationAction - if action.input { + if action.input ?? false { if action.inputButtonTitle != nil { newAction = UNTextInputNotificationAction( identifier: action.id, @@ -66,30 +66,30 @@ func makeActions(_ actions: [Action]) -> [UNNotificationAction] { } func makeActionOptions(_ action: Action) -> UNNotificationActionOptions { - if action.foreground { + if action.foreground ?? false { return .foreground } - if action.destructive { + if action.destructive ?? false { return .destructive } - if action.requiresAuthentication { + if action.requiresAuthentication ?? false { return .authenticationRequired } return UNNotificationActionOptions(rawValue: 0) } func makeCategoryOptions(_ type: ActionType) -> UNNotificationCategoryOptions { - if type.customDismissAction { + if type.customDismissAction ?? false { return .customDismissAction } - if type.allowInCarPlay { + if type.allowInCarPlay ?? false { return .allowInCarPlay } - if type.hiddenPreviewsShowTitle { + if type.hiddenPreviewsShowTitle ?? false { return .hiddenPreviewsShowTitle } - if type.hiddenPreviewsShowSubtitle { + if type.hiddenPreviewsShowSubtitle ?? false { return .hiddenPreviewsShowSubtitle } diff --git a/plugins/notification/ios/Sources/NotificationPlugin.swift b/plugins/notification/ios/Sources/NotificationPlugin.swift index 53c9788e..c8974b36 100644 --- a/plugins/notification/ios/Sources/NotificationPlugin.swift +++ b/plugins/notification/ios/Sources/NotificationPlugin.swift @@ -64,9 +64,9 @@ struct NotificationAttachment: Codable { struct Notification: Decodable { let id: Int - var title: String = "" - var body: String = "" - var extra: [String: String] = [:] + var title: String + var body: String + var extra: [String: String]? let schedule: NotificationSchedule? let attachments: [NotificationAttachment]? let sound: String? @@ -126,10 +126,10 @@ struct CancelArgs: Decodable { struct Action: Decodable { let id: String let title: String - var requiresAuthentication: Bool = false - var foreground: Bool = false - var destructive: Bool = false - var input: Bool = false + var requiresAuthentication: Bool? + var foreground: Bool? + var destructive: Bool? + var input: Bool? let inputButtonTitle: String? let inputPlaceholder: String? } @@ -138,10 +138,10 @@ struct ActionType: Decodable { let id: String let actions: [Action] let hiddenPreviewsBodyPlaceholder: String? - var customDismissAction = false - var allowInCarPlay = false - var hiddenPreviewsShowTitle = false - var hiddenPreviewsShowSubtitle = false + var customDismissAction: Bool? + var allowInCarPlay: Bool? + var hiddenPreviewsShowTitle: Bool? + var hiddenPreviewsShowSubtitle: Bool? let hiddenBodyPlaceholder: String? }