iOS/Sources/Extensions/Share/ShareViewController.swift
mat1th 97834bfd5e
Update swift lint and format + appy fixes (#2585)
## Summary
Swift lint and swiftformat are outdated. This PR does update those +
applies the new formatting form swiftformat.
There is 1 swift file with a manual change:
`Sources/Vehicle/Templates/Areas/CarPlayAreasViewModel.swift`. This is
done because `swiftlint` did create the following swiftlint error:
`error: Cyclomatic Complexity Violation: Function should have complexity
10 or less; currently complexity is 11 (cyclomatic_complexity)`.

Because it does change a lot of files the question is if we want to
finetune the `swiftformat` rules.

## Screenshots
No user facing changes.

## Link to pull request in Documentation repository
NA

## Any other notes
NA
2024-02-22 13:06:39 +01:00

81 lines
2.6 KiB
Swift

import CoreServices
import PromiseKit
import Shared
import Social
import UIKit
@objc(HAShareViewController)
class ShareViewController: SLComposeServiceViewController {
enum EventError: LocalizedError {
case invalidExtensionContext
}
private func event(api: HomeAssistantAPI) -> Promise<(eventType: String, eventData: [String: String])> {
guard let extensionContext else {
return .init(error: EventError.invalidExtensionContext)
}
let entered: Guarantee<String> = .value(contentText)
let url: Guarantee<URL?> = extensionContext.inputItemAttachments(for: .url).map(\.first)
let text: Guarantee<String?> = extensionContext.inputItemAttachments(for: .text).map { values in
if values.isEmpty {
return nil
} else {
return values.joined(separator: "\n")
}
}
return firstly {
when(fulfilled: entered, url, text)
}.map { entered, url, text in
api.shareEvent(
entered: entered,
url: url,
text: text
)
}
}
override func loadPreviewView() -> UIView! {
nil
}
override func didSelectPost() {
Current.Log.info("starting to post")
firstly { () -> Promise<Void> in
Current.Log.verbose("starting request")
return when(fulfilled: Current.apis.map { api -> Promise<Void> in
firstly {
event(api: api)
}.then { event in
api.CreateEvent(eventType: event.eventType, eventData: event.eventData)
}
}).asVoid()
}.done { [extensionContext] in
Current.Log.info("succeeded with post")
extensionContext?.completeRequest(returningItems: [], completionHandler: nil)
}.catch { [weak self] error in
Current.Log.error("failed to post: \(error)")
let alert = UIAlertController(
title: L10n.ShareExtension.Error.title,
message: error.localizedDescription,
preferredStyle: .alert
)
alert.addAction(UIAlertAction(title: L10n.okLabel, style: .cancel, handler: { _ in
self?.extensionContext?.cancelRequest(withError: error)
}))
self?.present(alert, animated: true, completion: nil)
}
}
override func configurationItems() -> [Any]! {
[]
}
override func viewDidLoad() {
super.viewDidLoad()
placeholder = L10n.ShareExtension.enteredPlaceholder
}
}