Add the ability to specify folder in Add Feed shortcut

This commit is contained in:
Maurice Parker
2019-10-20 18:49:17 -05:00
parent b1668d6a62
commit af16731ecd
4 changed files with 172 additions and 11 deletions

View File

@@ -10,7 +10,7 @@ import Intents
import Account
public class AddFeedIntentHandler: NSObject, AddFeedIntentHandling {
override init() {
super.init()
DispatchQueue.main.sync {
@@ -35,25 +35,85 @@ public class AddFeedIntentHandler: NSObject, AddFeedIntentHandling {
public func resolveAccountName(for intent: AddFeedIntent, with completion: @escaping (AddFeedAccountNameResolutionResult) -> Void) {
guard let accountName = intent.accountName else {
completion(.unsupported(forReason: .required))
completion(AddFeedAccountNameResolutionResult.notRequired())
return
}
DispatchQueue.main.async {
if AccountManager.shared.findActiveAccount(forDisplayName: accountName) == nil {
completion(.unsupported(forReason: .invalid))
} else {
completion(.success(with: accountName))
}
}
}
public func provideFolderNameOptions(for intent: AddFeedIntent, with completion: @escaping ([String]?, Error?) -> Void) {
DispatchQueue.main.async {
guard let accountName = intent.accountName, let account = AccountManager.shared.findActiveAccount(forDisplayName: accountName) else {
completion([String](), nil)
return
}
let folderNames = account.folders?.map { $0.nameForDisplay }
completion(folderNames, nil)
}
}
public func resolveFolderName(for intent: AddFeedIntent, with completion: @escaping (AddFeedFolderNameResolutionResult) -> Void) {
guard let accountName = intent.accountName, let folderName = intent.folderName else {
completion(AddFeedFolderNameResolutionResult.notRequired())
return
}
DispatchQueue.main.async {
guard let account = AccountManager.shared.findActiveAccount(forDisplayName: accountName) else {
completion(.unsupported(forReason: .invalid))
return
}
if account.findFolder(withDisplayName: folderName) == nil {
completion(.unsupported(forReason: .invalid))
} else {
completion(.success(with: folderName))
}
return
}
completion(.success(with: accountName))
}
public func handle(intent: AddFeedIntent, completion: @escaping (AddFeedIntentResponse) -> Void) {
guard let url = intent.url, let accountName = intent.accountName else {
guard let url = intent.url else {
completion(AddFeedIntentResponse(code: .failure, userActivity: nil))
return
}
DispatchQueue.main.async {
guard let account = AccountManager.shared.activeAccounts.first(where: { $0.nameForDisplay == accountName }) else {
let account: Account? = {
if let accountName = intent.accountName {
return AccountManager.shared.findActiveAccount(forDisplayName: accountName)
} else {
return AccountManager.shared.sortedActiveAccounts.first
}
}()
guard let validAccount = account else {
completion(AddFeedIntentResponse(code: .failure, userActivity: nil))
return
}
account.createFeed(url: url.absoluteString, name: nil, container: account) { result in
let container: Container? = {
if let folderName = intent.folderName {
return validAccount.findFolder(withDisplayName: folderName)
} else {
return validAccount
}
}()
guard let validContainer = container else {
completion(AddFeedIntentResponse(code: .failure, userActivity: nil))
return
}
validAccount.createFeed(url: url.absoluteString, name: nil, container: validContainer) { result in
switch result {
case .success:
completion(AddFeedIntentResponse(code: .success, userActivity: nil))