NetNewsWire/Multiplatform/macOS/Preferences/Preference Panes/Accounts/Account Preferences/Add Account/AddAccountView.swift

152 lines
4.1 KiB
Swift
Raw Normal View History

2020-07-13 15:41:02 +02:00
//
// AddAccountView.swift
// Multiplatform macOS
//
// Created by Stuart Breckenridge on 13/7/20.
// Copyright © 2020 Ranchero Software. All rights reserved.
//
import SwiftUI
import Account
struct AddAccountView: View {
@Environment(\.presentationMode) private var presentationMode
2020-07-13 17:10:50 +02:00
@ObservedObject var preferencesModel: AccountsPreferencesModel
2020-07-13 15:41:02 +02:00
@StateObject private var viewModel = AddAccountModel()
var body: some View {
VStack(alignment: .leading) {
Text("Add an Account").font(.headline)
Form {
Picker("Account Type",
selection: $viewModel.selectedAddAccount,
content: {
ForEach(0..<viewModel.addableAccountTypes.count, content: { i in
AddAccountPickerRow(accountType: viewModel.addableAccountTypes[i]).tag(viewModel.addableAccountTypes[i])
})
})
switch viewModel.selectedAddAccount {
case .onMyMac:
addLocalAccountView
case .cloudKit:
2020-07-15 03:04:33 +02:00
iCloudAccountView
2020-07-13 15:41:02 +02:00
case .feedbin:
userNameAndPasswordView
case .feedWrangler:
userNameAndPasswordView
case .freshRSS:
userNamePasswordAndAPIUrlView
case .feedly:
2020-07-15 03:04:33 +02:00
oAuthView
2020-07-13 15:41:02 +02:00
case .newsBlur:
userNameAndPasswordView
}
}
2020-07-15 04:54:18 +02:00
2020-07-13 15:41:02 +02:00
Spacer()
HStack {
if viewModel.accountIsAuthenticating {
ProgressView("Adding Account")
2020-07-13 15:41:02 +02:00
}
Spacer()
Button(action: { presentationMode.wrappedValue.dismiss() }, label: {
Text("Cancel")
})
2020-07-15 03:04:33 +02:00
switch viewModel.selectedAddAccount {
case .onMyMac:
Button("Add Account", action: {
viewModel.authenticateAccount()
})
case .feedly:
Button("Authenticate", action: {
viewModel.authenticateAccount()
})
case .cloudKit:
Button("Add Account", action: {
viewModel.authenticateAccount()
})
case .freshRSS:
Button("Add Account", action: {
viewModel.authenticateAccount()
})
.disabled(viewModel.userName.count == 0 || viewModel.password.count == 0 || viewModel.apiUrl.count == 0)
default:
Button("Add Account", action: {
viewModel.authenticateAccount()
})
.disabled(viewModel.userName.count == 0 || viewModel.password.count == 0)
2020-07-13 15:41:02 +02:00
}
}
}
2020-07-15 03:04:33 +02:00
.frame(width: 300, height: 200, alignment: .top)
2020-07-13 15:41:02 +02:00
.padding()
.onChange(of: viewModel.selectedAddAccount) { _ in
viewModel.resetUserEntries()
}
.onChange(of: viewModel.accountAdded) { value in
if value == true {
preferencesModel.showAddAccountView = false
presentationMode.wrappedValue.dismiss()
2020-07-13 15:41:02 +02:00
}
}
.alert(isPresented: $viewModel.showError) {
Alert(title: Text("Error Adding Account"),
message: Text(viewModel.addAccountError.description),
dismissButton: .default(Text("Dismiss"),
action: {
viewModel.addAccountError = .none
}))
}
}
var addLocalAccountView: some View {
Group {
TextField("Account Name", text: $viewModel.newLocalAccountName)
Text("This account stores all of its data on your device. It does not sync.")
.foregroundColor(.secondary)
.multilineTextAlignment(.leading)
2020-07-15 03:04:33 +02:00
}.textFieldStyle(RoundedBorderTextFieldStyle())
}
var iCloudAccountView: some View {
Group {
Text("This account syncs across your devices using your iCloud account.")
.foregroundColor(.secondary)
.multilineTextAlignment(.leading)
}.textFieldStyle(RoundedBorderTextFieldStyle())
2020-07-13 15:41:02 +02:00
}
var userNameAndPasswordView: some View {
Group {
TextField("Email", text: $viewModel.userName)
SecureField("Password", text: $viewModel.password)
2020-07-15 03:04:33 +02:00
}.textFieldStyle(RoundedBorderTextFieldStyle())
2020-07-13 15:41:02 +02:00
}
var userNamePasswordAndAPIUrlView: some View {
Group {
TextField("Email", text: $viewModel.userName)
SecureField("Password", text: $viewModel.password)
TextField("API URL", text: $viewModel.apiUrl)
}.textFieldStyle(RoundedBorderTextFieldStyle())
2020-07-13 15:41:02 +02:00
}
2020-07-15 03:04:33 +02:00
var oAuthView: some View {
Group {
Text("Click Authenticate")
}.textFieldStyle(RoundedBorderTextFieldStyle())
}
2020-07-13 15:41:02 +02:00
}
struct AddAccountView_Previews: PreviewProvider {
static var previews: some View {
2020-07-13 17:10:50 +02:00
AddAccountView(preferencesModel: AccountsPreferencesModel())
2020-07-13 15:41:02 +02:00
}
}