From 8108f1ab0fc55993bf69eb36ba780e8cc16a190c Mon Sep 17 00:00:00 2001 From: Stuart Breckenridge Date: Sun, 18 Dec 2022 07:51:54 +0800 Subject: [PATCH] Adds local add account view Renames AddAccount view for clarity --- NetNewsWire.xcodeproj/project.pbxproj | 20 ++-- iOS/Account/Account.strings | 4 + ...iew.swift => CloudKitAddAccountView.swift} | 15 +-- iOS/Account/Views/LocalAddAccountView.swift | 96 +++++++++++++++++++ ...ew.swift => ReaderAPIAddAccountView.swift} | 4 +- .../Views/AccountInspectorView.swift | 6 +- .../Accounts/AddAccountListView.swift | 7 +- 7 files changed, 131 insertions(+), 21 deletions(-) rename iOS/Account/Views/{iCloudAccountView.swift => CloudKitAddAccountView.swift} (86%) create mode 100644 iOS/Account/Views/LocalAddAccountView.swift rename iOS/Account/Views/{ReaderAPIAccountView.swift => ReaderAPIAddAccountView.swift} (99%) diff --git a/NetNewsWire.xcodeproj/project.pbxproj b/NetNewsWire.xcodeproj/project.pbxproj index 209686553..1410f5c0a 100644 --- a/NetNewsWire.xcodeproj/project.pbxproj +++ b/NetNewsWire.xcodeproj/project.pbxproj @@ -864,12 +864,13 @@ DFB3498A294B45AC00BC81AD /* ExtensionInspectorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFB34989294B45AC00BC81AD /* ExtensionInspectorView.swift */; }; DFB3498C294B4CA700BC81AD /* WebFeedInspectorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFB3498B294B4CA700BC81AD /* WebFeedInspectorView.swift */; }; DFB34993294C0B7400BC81AD /* Account.strings in Resources */ = {isa = PBXBuildFile; fileRef = DFB34992294C0B7400BC81AD /* Account.strings */; }; - DFB34994294C0E3900BC81AD /* ReaderAPIAccountView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFB34990294C0B2200BC81AD /* ReaderAPIAccountView.swift */; }; + DFB34994294C0E3900BC81AD /* ReaderAPIAddAccountView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFB34990294C0B2200BC81AD /* ReaderAPIAddAccountView.swift */; }; DFB34996294C4DCB00BC81AD /* LocalizedNetNewsWireError.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFB34995294C4DCB00BC81AD /* LocalizedNetNewsWireError.swift */; }; DFB34997294C4DCB00BC81AD /* LocalizedNetNewsWireError.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFB34995294C4DCB00BC81AD /* LocalizedNetNewsWireError.swift */; }; DFB34999294C4F1D00BC81AD /* Errors.strings in Resources */ = {isa = PBXBuildFile; fileRef = DFB34998294C4F1D00BC81AD /* Errors.strings */; }; DFB3499A294C4F1D00BC81AD /* Errors.strings in Resources */ = {isa = PBXBuildFile; fileRef = DFB34998294C4F1D00BC81AD /* Errors.strings */; }; - DFB3499E294C5D5000BC81AD /* iCloudAccountView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFB3499D294C5D5000BC81AD /* iCloudAccountView.swift */; }; + DFB3499E294C5D5000BC81AD /* CloudKitAddAccountView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFB3499D294C5D5000BC81AD /* CloudKitAddAccountView.swift */; }; + DFB349A0294E87B700BC81AD /* LocalAddAccountView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFB3499F294E87B700BC81AD /* LocalAddAccountView.swift */; }; DFC14F0F28EA55BD00F6EE86 /* AboutWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFC14F0E28EA55BD00F6EE86 /* AboutWindowController.swift */; }; DFC14F1228EA5DC500F6EE86 /* AboutData.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF790D6128E990A900455FC7 /* AboutData.swift */; }; DFC14F1328EA677C00F6EE86 /* Bundle-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51F85BF42273625800C787DC /* Bundle-Extensions.swift */; }; @@ -1626,11 +1627,12 @@ DFB34987294B447F00BC81AD /* InjectedNavigationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InjectedNavigationView.swift; sourceTree = ""; }; DFB34989294B45AC00BC81AD /* ExtensionInspectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionInspectorView.swift; sourceTree = ""; }; DFB3498B294B4CA700BC81AD /* WebFeedInspectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebFeedInspectorView.swift; sourceTree = ""; }; - DFB34990294C0B2200BC81AD /* ReaderAPIAccountView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReaderAPIAccountView.swift; sourceTree = ""; }; + DFB34990294C0B2200BC81AD /* ReaderAPIAddAccountView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReaderAPIAddAccountView.swift; sourceTree = ""; }; DFB34992294C0B7400BC81AD /* Account.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; path = Account.strings; sourceTree = ""; }; DFB34995294C4DCB00BC81AD /* LocalizedNetNewsWireError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizedNetNewsWireError.swift; sourceTree = ""; }; DFB34998294C4F1D00BC81AD /* Errors.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; path = Errors.strings; sourceTree = ""; }; - DFB3499D294C5D5000BC81AD /* iCloudAccountView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iCloudAccountView.swift; sourceTree = ""; }; + DFB3499D294C5D5000BC81AD /* CloudKitAddAccountView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudKitAddAccountView.swift; sourceTree = ""; }; + DFB3499F294E87B700BC81AD /* LocalAddAccountView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalAddAccountView.swift; sourceTree = ""; }; DFC14F0E28EA55BD00F6EE86 /* AboutWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutWindowController.swift; sourceTree = ""; }; DFC14F1428EB177000F6EE86 /* AboutNetNewsWireView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutNetNewsWireView.swift; sourceTree = ""; }; DFC14F1628EB17A800F6EE86 /* CreditsNetNewsWireView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreditsNetNewsWireView.swift; sourceTree = ""; }; @@ -3003,8 +3005,9 @@ DFB3498F294C0B0D00BC81AD /* Views */ = { isa = PBXGroup; children = ( - DFB34990294C0B2200BC81AD /* ReaderAPIAccountView.swift */, - DFB3499D294C5D5000BC81AD /* iCloudAccountView.swift */, + DFB3499F294E87B700BC81AD /* LocalAddAccountView.swift */, + DFB3499D294C5D5000BC81AD /* CloudKitAddAccountView.swift */, + DFB34990294C0B2200BC81AD /* ReaderAPIAddAccountView.swift */, ); path = Views; sourceTree = ""; @@ -4251,8 +4254,9 @@ 5126EE97226CB48A00C22AFC /* SceneCoordinator.swift in Sources */, 84CAFCB022BC8C35007694F0 /* FetchRequestOperation.swift in Sources */, DFD406FA291FB5E400C02962 /* SettingsRows.swift in Sources */, - DFB3499E294C5D5000BC81AD /* iCloudAccountView.swift in Sources */, + DFB3499E294C5D5000BC81AD /* CloudKitAddAccountView.swift in Sources */, DFB3498C294B4CA700BC81AD /* WebFeedInspectorView.swift in Sources */, + DFB349A0294E87B700BC81AD /* LocalAddAccountView.swift in Sources */, 5193CD5A245E44A90092735E /* RedditFeedProvider-Extensions.swift in Sources */, 51EF0F77227716200050506E /* FaviconGenerator.swift in Sources */, 51938DF3231AFC660055A1A0 /* SearchTimelineFeedDelegate.swift in Sources */, @@ -4331,7 +4335,7 @@ 51EF0F7E2277A57D0050506E /* MasterTimelineAccessibilityCellLayout.swift in Sources */, 512D554423C804DE0023FFFA /* OpenInSafariActivity.swift in Sources */, DF47CDB2294803AB00FCD57E /* AddExtensionListView.swift in Sources */, - DFB34994294C0E3900BC81AD /* ReaderAPIAccountView.swift in Sources */, + DFB34994294C0E3900BC81AD /* ReaderAPIAddAccountView.swift in Sources */, 512392C224E33A3C00F11704 /* RedditEnterDetailTableViewController.swift in Sources */, 51C452762265091600C03939 /* MasterTimelineViewController.swift in Sources */, 5195C1DC2720BD3000888867 /* MasterFeedRowIdentifier.swift in Sources */, diff --git a/iOS/Account/Account.strings b/iOS/Account/Account.strings index b26672b10..818dbd7d8 100644 --- a/iOS/Account/Account.strings +++ b/iOS/Account/Account.strings @@ -7,10 +7,14 @@ */ /* Account Names */ +"ACCOUNT_NAME" = "Name"; "CLOUDKIT" = "iCloud"; +"LOCAL_ACCOUNT_NAME_PHONE" = "On My iPhone"; +"LOCAL_ACCOUNT_NAME_PAD" = "On My iPad"; /* Explainers */ +"LOCAL_FOOTER_EXPLAINER" = "Local accounts do not sync your feeds across devices"; "BAZQUX_FOOTER_EXPLAINER" = "Sign in to your BazQux account and sync your feeds across your devices. Your username and password will be encrypted and stored in Keychain.\n\nDon’t have a BazQux account? [Sign Up Here](https://bazqux.com)"; "INOREADER_FOOTER_EXPLAINER" = "Sign in to your InoReader account and sync your feeds across your devices. Your username and password will be encrypted and stored in Keychain.\n\nDon’t have an InoReader account? [Sign Up Here](https://www.inoreader.com)"; "OLDREADER_FOOTER_EXPLAINER" = "Sign in to your The Old Reader account and sync your feeds across your devices. Your username and password will be encrypted and stored in Keychain.\n\nDon’t have a The Old Reader account? [Sign Up Here](https://theoldreader.com)"; diff --git a/iOS/Account/Views/iCloudAccountView.swift b/iOS/Account/Views/CloudKitAddAccountView.swift similarity index 86% rename from iOS/Account/Views/iCloudAccountView.swift rename to iOS/Account/Views/CloudKitAddAccountView.swift index 6e42be0a4..97ddd43bf 100644 --- a/iOS/Account/Views/iCloudAccountView.swift +++ b/iOS/Account/Views/CloudKitAddAccountView.swift @@ -1,5 +1,5 @@ // -// iCloudAccountView.swift +// CloudKitAddAccountView.swift // NetNewsWire-iOS // // Created by Stuart Breckenridge on 16/12/2022. @@ -9,7 +9,7 @@ import SwiftUI import Account -struct iCloudAccountView: View { +struct CloudKitAddAccountView: View { @Environment(\.dismiss) private var dismiss @State private var addAccountError: (LocalizedError?, Bool) = (nil, false) @@ -18,13 +18,16 @@ struct iCloudAccountView: View { NavigationView { Form { Section(header: cloudKitHeader) {} - Section { - createCloudKitAccount - } + Section { createCloudKitAccount } Section(footer: cloudKitExplainer) {} } .navigationTitle(Text("CLOUDKIT", tableName: "Account")) .navigationBarTitleDisplayMode(.inline) + .toolbar { + ToolbarItem(placement: .navigationBarLeading) { + Button(action: { dismiss() }, label: { Text("CANCEL_BUTTON_TITLE", tableName: "Buttons") }) + } + } .alert(Text("ERROR_TITLE", tableName: "Errors"), isPresented: $addAccountError.1) { Button(action: {}, label: { Text("DISMISS_BUTTON_TITLE", tableName: "Buttons") }) } message: { @@ -78,6 +81,6 @@ struct iCloudAccountView: View { struct iCloudAccountView_Previews: PreviewProvider { static var previews: some View { - iCloudAccountView() + CloudKitAddAccountView() } } diff --git a/iOS/Account/Views/LocalAddAccountView.swift b/iOS/Account/Views/LocalAddAccountView.swift new file mode 100644 index 000000000..a842f531e --- /dev/null +++ b/iOS/Account/Views/LocalAddAccountView.swift @@ -0,0 +1,96 @@ +// +// LocalAddAccountView.swift +// NetNewsWire-iOS +// +// Created by Stuart Breckenridge on 18/12/2022. +// Copyright © 2022 Ranchero Software. All rights reserved. +// + +import SwiftUI +import Account + +struct LocalAddAccountView: View { + + @Environment(\.dismiss) var dismiss + @State private var accountName: String = "" + + var body: some View { + NavigationView { + Form { + Section(header: accountHeaderView) {} + Section { accountNameSection } + Section { addAccountButton } + Section(footer: accountFooterView) {} + } + .toolbar { + ToolbarItem(placement: .navigationBarLeading) { + Button(action: { dismiss() }, label: { Text("CANCEL_BUTTON_TITLE", tableName: "Buttons") }) + } + } + .navigationTitle(deviceAccountName()) + .navigationBarTitleDisplayMode(.inline) + .onReceive(NotificationCenter.default.publisher(for: .UserDidAddAccount)) { _ in + dismiss() + } + } + } + + var accountNameSection: some View { + TextField("Name", + text: $accountName, + prompt: Text("ACCOUNT_NAME", tableName: "Account")) + } + + var addAccountButton: some View { + Button { + let account = AccountManager.shared.createAccount(type: .onMyMac) + if accountName.trimmingWhitespace.count > 0 { account.name = accountName } + } label: { + HStack { + Spacer() + Text("ADD_ACCOUNT_BUTTON_TITLE", tableName: "Buttons") + Spacer() + } + } + } + + var accountHeaderView: some View { + HStack { + Spacer() + Image(uiImage: accountImage()) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 48, height: 48) + Spacer() + } + } + + var accountFooterView: some View { + HStack { + Spacer() + Text("LOCAL_FOOTER_EXPLAINER", tableName: "Account") + .multilineTextAlignment(.center) + Spacer() + } + } + + private func accountImage() -> UIImage { + if UIDevice.current.userInterfaceIdiom == .pad { + return AppAssets.accountLocalPadImage + } + return AppAssets.accountLocalPhoneImage + } + + private func deviceAccountName() -> Text { + if UIDevice.current.userInterfaceIdiom == .pad { + return Text("LOCAL_ACCOUNT_NAME_PAD", tableName: "Account") + } + return Text("LOCAL_ACCOUNT_NAME_PHONE", tableName: "Account") + } +} + +struct LocalAddAccountView_Previews: PreviewProvider { + static var previews: some View { + LocalAddAccountView() + } +} diff --git a/iOS/Account/Views/ReaderAPIAccountView.swift b/iOS/Account/Views/ReaderAPIAddAccountView.swift similarity index 99% rename from iOS/Account/Views/ReaderAPIAccountView.swift rename to iOS/Account/Views/ReaderAPIAddAccountView.swift index 6de4a553c..50c10209c 100644 --- a/iOS/Account/Views/ReaderAPIAccountView.swift +++ b/iOS/Account/Views/ReaderAPIAddAccountView.swift @@ -13,7 +13,7 @@ import RSWeb import SafariServices import RSCore -struct ReaderAPIAccountView: View { +struct ReaderAPIAddAccountView: View { @Environment(\.dismiss) var dismiss @@ -249,6 +249,6 @@ struct ReaderAPIAccountView: View { struct ReaderAPIAccountView_Previews: PreviewProvider { static var previews: some View { - ReaderAPIAccountView() + ReaderAPIAddAccountView() } } diff --git a/iOS/Inspector/Views/AccountInspectorView.swift b/iOS/Inspector/Views/AccountInspectorView.swift index e03d34425..d1321879a 100644 --- a/iOS/Inspector/Views/AccountInspectorView.swift +++ b/iOS/Inspector/Views/AccountInspectorView.swift @@ -44,7 +44,11 @@ struct AccountInspectorView: View { .sheet(isPresented: $showAccountCredentialsSheet) { switch account.type { case .theOldReader, .bazQux, .inoreader, .freshRSS: - ReaderAPIAccountView(accountType: account.type, account: account) + ReaderAPIAddAccountView(accountType: account.type, account: account) + case .feedbin: + Text("FEEDBIN") + case .newsBlur: + Text("NEWSBLUR") default: EmptyView() } diff --git a/iOS/Settings/Views/Account and Extensions/Accounts/AddAccountListView.swift b/iOS/Settings/Views/Account and Extensions/Accounts/AddAccountListView.swift index cc65656f8..6f29fce47 100644 --- a/iOS/Settings/Views/Account and Extensions/Accounts/AddAccountListView.swift +++ b/iOS/Settings/Views/Account and Extensions/Accounts/AddAccountListView.swift @@ -87,11 +87,11 @@ struct AddAccountListView: View { .sheet(isPresented: $viewModel.showAddAccountSheet.0) { switch viewModel.showAddAccountSheet.accountType { case .onMyMac: - Text("ON MY MAC") + LocalAddAccountView() case .cloudKit: - iCloudAccountView() + CloudKitAddAccountView() case .freshRSS, .inoreader, .bazQux, .theOldReader: - ReaderAPIAccountView(accountType: viewModel.showAddAccountSheet.accountType, account: nil) + ReaderAPIAddAccountView(accountType: viewModel.showAddAccountSheet.accountType, account: nil) default: Text(viewModel.showAddAccountSheet.accountType.localizedAccountName()) } @@ -200,7 +200,6 @@ struct AddAccountListView: View { } } - private func interactionDisabled(for accountType: AccountType) -> Bool { if accountType == .cloudKit { if AccountManager.shared.accounts.contains(where: { $0.type == .cloudKit }) {