diff --git a/Multiplatform/Shared/Assets.xcassets/AccountFeedbin.imageset/Contents.json b/Multiplatform/Shared/Assets.xcassets/AccountFeedbin.imageset/Contents.json index ec7826d65..1b0780896 100644 --- a/Multiplatform/Shared/Assets.xcassets/AccountFeedbin.imageset/Contents.json +++ b/Multiplatform/Shared/Assets.xcassets/AccountFeedbin.imageset/Contents.json @@ -1,17 +1,7 @@ { "images" : [ { - "filename" : "feedbin-logo-filled.pdf", - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "filename" : "feedbin-logo-filled-1.pdf", + "filename" : "feedbin.pdf", "idiom" : "universal" } ], diff --git a/Multiplatform/Shared/Assets.xcassets/AccountFeedbin.imageset/feedbin-logo-filled-1.pdf b/Multiplatform/Shared/Assets.xcassets/AccountFeedbin.imageset/feedbin-logo-filled-1.pdf deleted file mode 100644 index 72ff612eb..000000000 Binary files a/Multiplatform/Shared/Assets.xcassets/AccountFeedbin.imageset/feedbin-logo-filled-1.pdf and /dev/null differ diff --git a/Multiplatform/Shared/Assets.xcassets/AccountFeedbin.imageset/feedbin-logo-filled.pdf b/Multiplatform/Shared/Assets.xcassets/AccountFeedbin.imageset/feedbin-logo-filled.pdf deleted file mode 100644 index 72ff612eb..000000000 Binary files a/Multiplatform/Shared/Assets.xcassets/AccountFeedbin.imageset/feedbin-logo-filled.pdf and /dev/null differ diff --git a/Multiplatform/Shared/Assets.xcassets/AccountFeedbin.imageset/feedbin.pdf b/Multiplatform/Shared/Assets.xcassets/AccountFeedbin.imageset/feedbin.pdf new file mode 100644 index 000000000..8892e9db6 Binary files /dev/null and b/Multiplatform/Shared/Assets.xcassets/AccountFeedbin.imageset/feedbin.pdf differ diff --git a/Multiplatform/Shared/Assets.xcassets/AccountNewsBlur.imageset/Newsblur-any.pdf b/Multiplatform/Shared/Assets.xcassets/AccountNewsBlur.imageset/Newsblur-any.pdf index 8b07ac745..216dc4f8a 100644 Binary files a/Multiplatform/Shared/Assets.xcassets/AccountNewsBlur.imageset/Newsblur-any.pdf and b/Multiplatform/Shared/Assets.xcassets/AccountNewsBlur.imageset/Newsblur-any.pdf differ diff --git a/Multiplatform/macOS/Preferences/Preference Panes/Accounts/Account Preferences/Add Account/Sheets/AddFeedbinAccountView.swift b/Multiplatform/macOS/Preferences/Preference Panes/Accounts/Account Preferences/Add Account/Sheets/AddFeedbinAccountView.swift index e4ed3d52f..e97275a48 100644 --- a/Multiplatform/macOS/Preferences/Preference Panes/Accounts/Account Preferences/Add Account/Sheets/AddFeedbinAccountView.swift +++ b/Multiplatform/macOS/Preferences/Preference Panes/Accounts/Account Preferences/Add Account/Sheets/AddFeedbinAccountView.swift @@ -30,8 +30,8 @@ struct AddFeedbinAccountView: View { HStack(spacing: 16) { VStack(alignment: .leading) { AccountType.feedbin.image() - .resizable() .frame(width: 50, height: 50) + Spacer() } VStack(alignment: .leading, spacing: 8) { diff --git a/Multiplatform/macOS/Preferences/Preference Panes/Accounts/Account Preferences/Add Account/Sheets/AddNewsBlurAccountView.swift b/Multiplatform/macOS/Preferences/Preference Panes/Accounts/Account Preferences/Add Account/Sheets/AddNewsBlurAccountView.swift index 59c83189f..f8f6a9b38 100644 --- a/Multiplatform/macOS/Preferences/Preference Panes/Accounts/Account Preferences/Add Account/Sheets/AddNewsBlurAccountView.swift +++ b/Multiplatform/macOS/Preferences/Preference Panes/Accounts/Account Preferences/Add Account/Sheets/AddNewsBlurAccountView.swift @@ -8,19 +8,29 @@ import SwiftUI import Account +import RSCore +import RSWeb +import Secrets + +fileprivate class AddNewsBlurViewModel: ObservableObject { + @Published var isAuthenticating: Bool = false + @Published var accountUpdateError: AccountUpdateErrors = .none + @Published var showError: Bool = false + @Published var username: String = "" + @Published var password: String = "" +} + struct AddNewsBlurAccountView: View { @Environment (\.presentationMode) var presentationMode - @State private var username: String = "" - @State private var password: String = "" + @StateObject private var model = AddNewsBlurViewModel() var body: some View { VStack { HStack(spacing: 16) { VStack(alignment: .leading) { AccountType.newsBlur.image() - .resizable() .frame(width: 50, height: 50) Spacer() } @@ -43,8 +53,8 @@ struct AddNewsBlurAccountView: View { Text("Password") } VStack(spacing: 8) { - TextField("me@email.com", text: $username) - SecureField("•••••••••••", text: $password) + TextField("me@email.com", text: $model.username) + SecureField("•••••••••••", text: $model.password) } } @@ -57,7 +67,9 @@ struct AddNewsBlurAccountView: View { Spacer() HStack(spacing: 8) { Spacer() - ProgressView().scaleEffect(CGSize(width: 0.5, height: 0.5)) + ProgressView() + .scaleEffect(CGSize(width: 0.5, height: 0.5)) + .hidden(!model.isAuthenticating) Button(action: { presentationMode.wrappedValue.dismiss() }, label: { @@ -72,7 +84,7 @@ struct AddNewsBlurAccountView: View { .frame(width: 60) }) .keyboardShortcut(.defaultAction) - .disabled(username.isEmpty && password.isEmpty) + .disabled(model.username.isEmpty || model.password.isEmpty) } } } @@ -81,6 +93,52 @@ struct AddNewsBlurAccountView: View { .frame(width: 400, height: 230) .textFieldStyle(RoundedBorderTextFieldStyle()) } + + private func authenticateNewsBlur() { + model.isAuthenticating = true + let credentials = Credentials(type: .newsBlurBasic, username: model.username, secret: model.password) + + Account.validateCredentials(type: .newsBlur, credentials: credentials) { result in + + self.model.isAuthenticating = false + + switch result { + case .success(let validatedCredentials): + + guard let validatedCredentials = validatedCredentials else { + self.model.accountUpdateError = .invalidUsernamePassword + self.model.showError = true + return + } + + let account = AccountManager.shared.createAccount(type: .newsBlur) + + do { + try account.removeCredentials(type: .newsBlurBasic) + try account.removeCredentials(type: .newsBlurSessionId) + try account.storeCredentials(credentials) + try account.storeCredentials(validatedCredentials) + account.refreshAll(completion: { result in + switch result { + case .success: + self.presentationMode.wrappedValue.dismiss() + case .failure(let error): + self.model.accountUpdateError = .other(error: error) + self.model.showError = true + } + }) + + } catch { + self.model.accountUpdateError = .keyChainError + self.model.showError = true + } + + case .failure: + self.model.accountUpdateError = .networkError + self.model.showError = true + } + } + } } struct AddNewsBlurAccountView_Previews: PreviewProvider {