// // AddReaderAPIViewModel.swift // Multiplatform macOS // // Created by Stuart Breckenridge on 05/12/2020. // Copyright © 2020 Ranchero Software. All rights reserved. // import SwiftUI import Account import RSCore import RSWeb import Secrets class AddReaderAPIViewModel: ObservableObject { @Published var isAuthenticating: Bool = false @Published var accountUpdateError: AccountUpdateErrors = .none @Published var showError: Bool = false @Published var username: String = "" @Published var password: String = "" @Published var apiUrl: String = "" @Published var canDismiss: Bool = false func authenticateReaderAccount(_ accountType: AccountType) { isAuthenticating = true let credentials = Credentials(type: .readerBasic, username: username, secret: password) if accountType == .freshRSS { Account.validateCredentials(type: accountType, credentials: credentials, endpoint: URL(string: apiUrl)!) { result in self.isAuthenticating = false switch result { case .success(let validatedCredentials): guard let validatedCredentials = validatedCredentials else { self.accountUpdateError = .invalidUsernamePassword self.showError = true return } let account = AccountManager.shared.createAccount(type: .freshRSS) do { try account.removeCredentials(type: .readerBasic) try account.removeCredentials(type: .readerAPIKey) try account.storeCredentials(credentials) try account.storeCredentials(validatedCredentials) self.canDismiss = true account.refreshAll(completion: { result in switch result { case .success: break case .failure(let error): self.accountUpdateError = .other(error: error) self.showError = true } }) } catch { self.accountUpdateError = .keyChainError self.showError = true } case .failure: self.accountUpdateError = .networkError self.showError = true } } } else { Account.validateCredentials(type: accountType, credentials: credentials) { result in self.isAuthenticating = false switch result { case .success(let validatedCredentials): guard let validatedCredentials = validatedCredentials else { self.accountUpdateError = .invalidUsernamePassword self.showError = true return } let account = AccountManager.shared.createAccount(type: .freshRSS) do { try account.removeCredentials(type: .readerBasic) try account.removeCredentials(type: .readerAPIKey) try account.storeCredentials(credentials) try account.storeCredentials(validatedCredentials) self.canDismiss = true account.refreshAll(completion: { result in switch result { case .success: break case .failure(let error): self.accountUpdateError = .other(error: error) self.showError = true } }) } catch { self.accountUpdateError = .keyChainError self.showError = true } case .failure: self.accountUpdateError = .networkError self.showError = true } } } } }