From 81a92738f9556f6c22ce42961c124b646d070a66 Mon Sep 17 00:00:00 2001 From: Rizwan Mohamed Ibrahim Date: Tue, 21 Jul 2020 23:10:18 +0530 Subject: [PATCH] Add fresh RSS account with credentials account view --- .../Accounts/SettingsAddAccountModel.swift | 3 +- .../Accounts/SettingsAddAccountView.swift | 2 +- .../SettingsCredentialsAccountModel.swift | 57 +++++++++++++++++++ .../SettingsCredentialsAccountView.swift | 3 + 4 files changed, 63 insertions(+), 2 deletions(-) diff --git a/Multiplatform/iOS/Settings/Accounts/SettingsAddAccountModel.swift b/Multiplatform/iOS/Settings/Accounts/SettingsAddAccountModel.swift index 80a24d487..5977bd775 100644 --- a/Multiplatform/iOS/Settings/Accounts/SettingsAddAccountModel.swift +++ b/Multiplatform/iOS/Settings/Accounts/SettingsAddAccountModel.swift @@ -38,7 +38,8 @@ class SettingsAddAccountModel: ObservableObject { SettingsAddAccount(name: "Feedly", accountType: .feedly), SettingsAddAccount(name: "Feed Wrangler", accountType: .feedWrangler), SettingsAddAccount(name: "iCloud", accountType: .cloudKit), - SettingsAddAccount(name: "NewsBlur", accountType: .newsBlur) + SettingsAddAccount(name: "NewsBlur", accountType: .newsBlur), + SettingsAddAccount(name: "Fresh RSS", accountType: .freshRSS) ] } diff --git a/Multiplatform/iOS/Settings/Accounts/SettingsAddAccountView.swift b/Multiplatform/iOS/Settings/Accounts/SettingsAddAccountView.swift index 7f7e858a2..a42caeb0f 100644 --- a/Multiplatform/iOS/Settings/Accounts/SettingsAddAccountView.swift +++ b/Multiplatform/iOS/Settings/Accounts/SettingsAddAccountView.swift @@ -30,7 +30,7 @@ struct SettingsAddAccountView: View { switch model.selectedAccountType { case .onMyMac: SettingsLocalAccountView() - case .feedbin, .feedWrangler, .newsBlur: + case .feedbin, .feedWrangler, .newsBlur, .freshRSS: SettingsCredentialsAccountView(accountType: model.selectedAccountType!) case .cloudKit: SettingsCloudKitAccountView() diff --git a/Multiplatform/iOS/Settings/Accounts/SettingsCredentialsAccountModel.swift b/Multiplatform/iOS/Settings/Accounts/SettingsCredentialsAccountModel.swift index 96adbab0f..d3bb0671a 100644 --- a/Multiplatform/iOS/Settings/Accounts/SettingsCredentialsAccountModel.swift +++ b/Multiplatform/iOS/Settings/Accounts/SettingsCredentialsAccountModel.swift @@ -16,6 +16,7 @@ class SettingsCredentialsAccountModel: ObservableObject { @Published var shouldDismiss: Bool = false @Published var email: String = "" @Published var password: String = "" + @Published var apiUrl: String = "" @Published var busy: Bool = false @Published var accountCredentialsError: AccountCredentialsError? { didSet { @@ -43,6 +44,9 @@ class SettingsCredentialsAccountModel: ObservableObject { } var isValid: Bool { + if apiUrlEnabled { + return !email.isEmpty && !password.isEmpty && !apiUrl.isEmpty + } return !email.isEmpty && !password.isEmpty } @@ -69,6 +73,10 @@ class SettingsCredentialsAccountModel: ObservableObject { return accountType == .newsBlur ? NSLocalizedString("Username or Email", comment: "") : NSLocalizedString("Email", comment: "") } + var apiUrlEnabled: Bool { + return accountType == .freshRSS + } + func addAccount() { switch accountType { case .feedbin: @@ -77,6 +85,8 @@ class SettingsCredentialsAccountModel: ObservableObject { addFeedWranglerAccount() case .newsBlur: addNewsBlurAccount() + case .freshRSS: + addFreshRSSAccount() default: return } @@ -221,4 +231,51 @@ extension SettingsCredentialsAccountModel { } } } + + // MARK:- Fresh RSS + + func addFreshRSSAccount() { + busy = true + let credentials = Credentials(type: .readerBasic, username: email, secret: password) + + Account.validateCredentials(type: .freshRSS, credentials: credentials, endpoint: URL(string: apiUrl)!) { [weak self] result in + + guard let self = self else { return } + + self.busy = false + + switch result { + case .success(let validatedCredentials): + + guard let validatedCredentials = validatedCredentials else { + self.accountCredentialsError = .invalidCredentials + 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.shouldDismiss = true + account.refreshAll(completion: { result in + switch result { + case .success: + break + case .failure(let error): + self.accountCredentialsError = .other(error: error) + } + }) + + } catch { + self.accountCredentialsError = .keyChain + } + + case .failure: + self.accountCredentialsError = .noNetwork + } + } + } } diff --git a/Multiplatform/iOS/Settings/Accounts/SettingsCredentialsAccountView.swift b/Multiplatform/iOS/Settings/Accounts/SettingsCredentialsAccountView.swift index 373705075..25b475c22 100644 --- a/Multiplatform/iOS/Settings/Accounts/SettingsCredentialsAccountView.swift +++ b/Multiplatform/iOS/Settings/Accounts/SettingsCredentialsAccountView.swift @@ -39,6 +39,9 @@ struct SettingsCredentialsAccountView: View { Text(settingsModel.showPassword ? "Hide" : "Show") } } + if settingsModel.apiUrlEnabled { + TextField("API URL", text: $settingsModel.apiUrl) + } } Section(footer: errorFooter) { HStack {