NetNewsWire/iOS/Intents/AddFeedIntentHandler.swift

76 lines
2.3 KiB
Swift
Raw Normal View History

2019-10-19 01:31:00 +02:00
//
// AddFeedIntentHandler.swift
// NetNewsWire
//
// Created by Maurice Parker on 10/18/19.
// Copyright © 2019 Ranchero Software. All rights reserved.
//
import Intents
import Account
2019-10-19 01:31:00 +02:00
public class AddFeedIntentHandler: NSObject, AddFeedIntentHandling {
override init() {
super.init()
DispatchQueue.main.sync {
AccountManager.shared = AccountManager()
}
2019-10-19 01:31:00 +02:00
}
public func resolveUrl(for intent: AddFeedIntent, with completion: @escaping (AddFeedUrlResolutionResult) -> Void) {
guard let url = intent.url else {
completion(.unsupported(forReason: .required))
return
}
completion(.success(with: url))
2019-10-19 01:31:00 +02:00
}
2019-10-19 03:06:18 +02:00
public func provideAccountNameOptions(for intent: AddFeedIntent, with completion: @escaping ([String]?, Error?) -> Void) {
DispatchQueue.main.async {
let accountNames = AccountManager.shared.activeAccounts.compactMap { $0.nameForDisplay }
completion(accountNames, nil)
}
}
public func resolveAccountName(for intent: AddFeedIntent, with completion: @escaping (AddFeedAccountNameResolutionResult) -> Void) {
guard let accountName = intent.accountName else {
completion(.unsupported(forReason: .required))
return
}
completion(.success(with: accountName))
}
public func handle(intent: AddFeedIntent, completion: @escaping (AddFeedIntentResponse) -> Void) {
2019-10-19 03:06:18 +02:00
guard let url = intent.url, let accountName = intent.accountName else {
completion(AddFeedIntentResponse(code: .failure, userActivity: nil))
return
}
DispatchQueue.main.async {
2019-10-19 03:06:18 +02:00
guard let account = AccountManager.shared.activeAccounts.first(where: { $0.nameForDisplay == accountName }) else {
completion(AddFeedIntentResponse(code: .failure, userActivity: nil))
return
}
account.createFeed(url: url.absoluteString, name: nil, container: account) { result in
switch result {
case .success:
completion(AddFeedIntentResponse(code: .success, userActivity: nil))
case .failure(let error):
switch error {
case AccountError.createErrorNotFound:
completion(AddFeedIntentResponse(code: .feedNotFound, userActivity: nil))
case AccountError.createErrorAlreadySubscribed:
completion(AddFeedIntentResponse(code: .alreadySubscribed, userActivity: nil))
default:
completion(AddFeedIntentResponse(code: .failure, userActivity: nil))
}
}
}
}
}
2019-10-19 01:31:00 +02:00
}