From 50ab15f2ccfe3b281d4af189a40899a0814a6101 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Wed, 12 Jun 2019 03:08:51 -0500 Subject: [PATCH 01/18] Dismiss view after adding account or canceling. --- iOS/Settings/SettingsLocalAccountView.swift | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/iOS/Settings/SettingsLocalAccountView.swift b/iOS/Settings/SettingsLocalAccountView.swift index 2e1db27f4..04c91c200 100644 --- a/iOS/Settings/SettingsLocalAccountView.swift +++ b/iOS/Settings/SettingsLocalAccountView.swift @@ -11,7 +11,8 @@ import Account struct SettingsLocalAccountView : View { @State var name: String - + @Environment(\.isPresented) private var isPresented + var body: some View { NavigationView { List { @@ -36,13 +37,20 @@ struct SettingsLocalAccountView : View { } .listStyle(.grouped) .navigationBarTitle(Text(""), displayMode: .inline) + .navigationBarItems(trailing: Button(action: { self.dismiss() }) { Text("Cancel") } ) } } - func addAccount() { + private func addAccount() { let account = AccountManager.shared.createAccount(type: .onMyMac) account.name = name + dismiss() } + + private func dismiss() { + isPresented?.value = false + } + } #if DEBUG From 37f42e2ad870d03c1ff6d56f0019e6add934905f Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Wed, 12 Jun 2019 08:33:14 -0500 Subject: [PATCH 02/18] Added Feedbin add account logic. --- iOS/Settings/SettingsAddAccountView.swift | 2 +- iOS/Settings/SettingsFeedbinAccountView.swift | 111 ++++++++++++++++-- iOS/Settings/SettingsLocalAccountView.swift | 4 +- 3 files changed, 106 insertions(+), 11 deletions(-) diff --git a/iOS/Settings/SettingsAddAccountView.swift b/iOS/Settings/SettingsAddAccountView.swift index e7ec22319..5b1a8bda5 100644 --- a/iOS/Settings/SettingsAddAccountView.swift +++ b/iOS/Settings/SettingsAddAccountView.swift @@ -14,7 +14,7 @@ struct SettingsAddAccountView : View { PresentationButton(SettingsAccountLabelView(accountImage: "accountLocal", accountLabel: "On My Device"), destination: SettingsLocalAccountView(name: "")) PresentationButton(SettingsAccountLabelView(accountImage: "accountFeedbin", accountLabel: "Feedbin"), - destination: SettingsFeedbinAccountView(email: "", password: "")) + destination: SettingsFeedbinAccountView(viewModel: SettingsFeedbinAccountView.ViewModel())) } .listStyle(.grouped) .navigationBarTitle(Text("Add Account"), displayMode: .inline) diff --git a/iOS/Settings/SettingsFeedbinAccountView.swift b/iOS/Settings/SettingsFeedbinAccountView.swift index f62fce8c5..50d425bc7 100644 --- a/iOS/Settings/SettingsFeedbinAccountView.swift +++ b/iOS/Settings/SettingsFeedbinAccountView.swift @@ -7,11 +7,17 @@ // import SwiftUI +import Combine +import Account +import RSWeb struct SettingsFeedbinAccountView : View { - @State var email: String - @State var password: String - + @Environment(\.isPresented) private var isPresented + @ObjectBinding var viewModel: ViewModel + @State var busy: Bool = false + @State var error: Text = Text("") + var account: Account? = nil + var body: some View { NavigationView { List { @@ -20,27 +26,116 @@ struct SettingsFeedbinAccountView : View { ) { HStack { Spacer() - TextField($email, placeholder: Text("Email")) + TextField($viewModel.email, placeholder: Text("Email")) + .textContentType(.username) Spacer() } HStack { Spacer() - SecureField($password, placeholder: Text("Password")) + SecureField($viewModel.password, placeholder: Text("Password")) Spacer() } } - Section { + Section(footer: HStack { Spacer() - Button(action: {}) { + error.color(.red) + Spacer() + } + ) { + HStack { + Spacer() + Button(action: { self.addAccount() }) { Text("Add Account") } + .disabled(!viewModel.isValid) Spacer() } } } + .disabled(busy) .listStyle(.grouped) .navigationBarTitle(Text(""), displayMode: .inline) + .navigationBarItems(leading: + Button(action: { self.dismiss() }) { Text("Cancel") } + ) + } + } + + private func addAccount() { + + busy = true + + let emailAddress = viewModel.email.trimmingCharacters(in: .whitespaces) + let credentials = Credentials.basic(username: emailAddress, password: viewModel.password) + + Account.validateCredentials(type: .feedbin, credentials: credentials) { result in + + self.busy = false + + switch result { + case .success(let authenticated): + + if authenticated { + + var newAccount = false + let workAccount: Account + if self.account == nil { + workAccount = AccountManager.shared.createAccount(type: .feedbin) + newAccount = true + } else { + workAccount = self.account! + } + + do { + + do { + try workAccount.removeBasicCredentials() + } catch {} + try workAccount.storeCredentials(credentials) + + if newAccount { + workAccount.refreshAll() { result in } + } + + self.dismiss() + + } catch { + self.error = Text("Keychain error while storing credentials.") + } + + } else { + self.error = Text("Invalid email/password combination.") + } + + case .failure: + self.error = Text("Network error. Try again later.") + } + + } + + } + + private func dismiss() { + isPresented?.value = false + } + + class ViewModel: BindableObject { + let didChange = PassthroughSubject() + + var email: String = "" { + didSet { + didChange.send(self) + } + } + var password: String = "" { + didSet { + didChange.send(self) + } + } + + var isValid: Bool { + return !email.isEmpty && !password.isEmpty } } @@ -49,7 +144,7 @@ struct SettingsFeedbinAccountView : View { #if DEBUG struct SettingsFeedbinAccountView_Previews : PreviewProvider { static var previews: some View { - SettingsFeedbinAccountView(email: "", password: "") + SettingsFeedbinAccountView(viewModel: SettingsFeedbinAccountView.ViewModel()) } } #endif diff --git a/iOS/Settings/SettingsLocalAccountView.swift b/iOS/Settings/SettingsLocalAccountView.swift index 04c91c200..e39edcec4 100644 --- a/iOS/Settings/SettingsLocalAccountView.swift +++ b/iOS/Settings/SettingsLocalAccountView.swift @@ -10,8 +10,8 @@ import SwiftUI import Account struct SettingsLocalAccountView : View { - @State var name: String @Environment(\.isPresented) private var isPresented + @State var name: String var body: some View { NavigationView { @@ -37,7 +37,7 @@ struct SettingsLocalAccountView : View { } .listStyle(.grouped) .navigationBarTitle(Text(""), displayMode: .inline) - .navigationBarItems(trailing: Button(action: { self.dismiss() }) { Text("Cancel") } ) + .navigationBarItems(leading: Button(action: { self.dismiss() }) { Text("Cancel") } ) } } From ddb61489c4242798e7cf14baa0b7e076c7051351 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Wed, 12 Jun 2019 13:25:14 -0500 Subject: [PATCH 03/18] Add a little padding around the account selectors. --- iOS/Settings/SettingsAddAccountView.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iOS/Settings/SettingsAddAccountView.swift b/iOS/Settings/SettingsAddAccountView.swift index 5b1a8bda5..ae18edabc 100644 --- a/iOS/Settings/SettingsAddAccountView.swift +++ b/iOS/Settings/SettingsAddAccountView.swift @@ -12,9 +12,9 @@ struct SettingsAddAccountView : View { var body: some View { List { PresentationButton(SettingsAccountLabelView(accountImage: "accountLocal", accountLabel: "On My Device"), - destination: SettingsLocalAccountView(name: "")) + destination: SettingsLocalAccountView(name: "")).padding(.all, 4) PresentationButton(SettingsAccountLabelView(accountImage: "accountFeedbin", accountLabel: "Feedbin"), - destination: SettingsFeedbinAccountView(viewModel: SettingsFeedbinAccountView.ViewModel())) + destination: SettingsFeedbinAccountView(viewModel: SettingsFeedbinAccountView.ViewModel())).padding(.all, 4) } .listStyle(.grouped) .navigationBarTitle(Text("Add Account"), displayMode: .inline) From bf981130b22c4025c4ced8f60ab9609203f58391 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Wed, 12 Jun 2019 13:44:44 -0500 Subject: [PATCH 04/18] Added branching strategy technote --- Technotes/Branching-Full.png | Bin 0 -> 46195 bytes Technotes/Branching.png | Bin 0 -> 31082 bytes Technotes/BranchingStrategy.md | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 Technotes/Branching-Full.png create mode 100644 Technotes/Branching.png create mode 100644 Technotes/BranchingStrategy.md diff --git a/Technotes/Branching-Full.png b/Technotes/Branching-Full.png new file mode 100644 index 0000000000000000000000000000000000000000..54de93b94bf361e8d3cd6b61034b601841a68cd7 GIT binary patch literal 46195 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 z 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 Q4*1bh(^qX#ei-}z0X8Dyy#N3J literal 0 HcmV?d00001 diff --git a/Technotes/Branching.png b/Technotes/Branching.png new file mode 100644 index 0000000000000000000000000000000000000000..a64ec67562f8aa7ac5b1c657708348fe1046247c GIT binary patch literal 31082 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 Date: Wed, 12 Jun 2019 15:09:06 -0500 Subject: [PATCH 05/18] Updated to the latest RSWeb --- Frameworks/Account/Account.swift | 2 ++ submodules/RSWeb | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Frameworks/Account/Account.swift b/Frameworks/Account/Account.swift index 8d5564215..64a897a00 100644 --- a/Frameworks/Account/Account.swift +++ b/Frameworks/Account/Account.swift @@ -263,6 +263,8 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, switch credentials { case .basic(let username, _): self.username = username + default: + return } try CredentialsManager.storeCredentials(credentials, server: server) diff --git a/submodules/RSWeb b/submodules/RSWeb index 1686ee1b1..5d648e405 160000 --- a/submodules/RSWeb +++ b/submodules/RSWeb @@ -1 +1 @@ -Subproject commit 1686ee1b1c5a4aef6ebe1ffd72b17d6defabd9fd +Subproject commit 5d648e4050b700bb20fc7ae3303f087edcb3228f From 02c1e40c3a70413ed4c36e304dfe32f626691eaf Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Wed, 12 Jun 2019 15:20:33 -0500 Subject: [PATCH 06/18] Updated to the latest RSParser --- submodules/RSParser | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/RSParser b/submodules/RSParser index 812594e90..032edf89b 160000 --- a/submodules/RSParser +++ b/submodules/RSParser @@ -1 +1 @@ -Subproject commit 812594e902d4d640b08fea9cc6184d6ee84424e2 +Subproject commit 032edf89b64ccbbfb6c05887b239a4bf81329b92 From 1b5f3ab9a831adfd03983c9d31c02a0dc6390f5c Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Wed, 12 Jun 2019 21:59:08 -0700 Subject: [PATCH 07/18] Add article about reruns. --- Technotes/Reruns.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 Technotes/Reruns.md diff --git a/Technotes/Reruns.md b/Technotes/Reruns.md new file mode 100644 index 000000000..955036aa5 --- /dev/null +++ b/Technotes/Reruns.md @@ -0,0 +1,39 @@ +# Why Reruns Happen + +Sometimes you might see a new article in a feed that you’d swear you’ve already read. And maybe you can even see, in NetNewsWire, what looks like another copy of that same exact article, with no changes. + +Here’s the thing to know: if the article really was the exact same in every respect, NetNewsWire would see that. It’s super-easy for a computer to tell that some data is the exact same as some other data. + +When it’s not really the exact same, that’s where the problem comes in. + +Here are some reasons this situation can happen: + +## A blog changes its blog engine + +If someone switches from (for instance) Ghost to WordPress, then the code that creates that feeds will be different. And that code will make a different choice for the unique ID for each article in the feed. + +Those unique IDs are critical: they’re how NetNewsWire identifies an article. If an article appears with a new unique ID, then NetNewsWire treats it like a new article. + +In this situation, you’ll often see that you get a bunch of reruns for a given feed all at once. You’ll get 10 or 20 or whatever. + +This is by far the most common cause of reruns. + +## A feed that lacks unique IDs does something weird + +This is quite a bit less common. There are some feeds that don’t have unique IDs, which means NetNewsWire has to use some combination of other article metadata to identify articles. + +That metadata could change just enough to throw NetNewsWire off. This is rare, but it can happen. + +## A feed just has terrible bugs + +We’ve seen feeds that create a different unique ID for each article every time you fetch the feed, which results in reruns every single time. We’ve seen feeds that use the same unique ID for every article in the feed, even — which goes against the very idea of unique IDs! + +Some feeds just have bugs, and weird, unpredictable things happen. + +NetNewsWire is designed to be resistant to that, and it does a good job — but we haven’t anticipated every crazy case. + +However, this is the most rare cause of reruns. The most common cause is, by far, the first one: the feed is now being generated by different software. + +## Reporting Bugs + +If you have a feed that keeps showing reruns (as opposed to once, when a blog changes its blogging system), please do report a bug, either on our [Issues Tracker](https://github.com/brentsimmons/NetNewsWire/issues) or on the [Slack group](https://join.slack.com/t/netnewswire/shared_invite/enQtNjM4MDA1MjQzMDkzLTNlNjBhOWVhYzdhYjA4ZWFhMzQ1MTUxYjU0NTE5ZGY0YzYwZWJhNjYwNTNmNTg2NjIwYWY4YzhlYzk5NmU3ZTc). \ No newline at end of file From 8dd220a843a0cbd649af47ed7c65dccd88cbf2ac Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Wed, 12 Jun 2019 22:15:35 -0700 Subject: [PATCH 08/18] Use 'odd' instead of 'crazy' when describing feeds with bugs. --- Technotes/Reruns.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Technotes/Reruns.md b/Technotes/Reruns.md index 955036aa5..11d043f80 100644 --- a/Technotes/Reruns.md +++ b/Technotes/Reruns.md @@ -30,10 +30,10 @@ We’ve seen feeds that create a different unique ID for each article every time Some feeds just have bugs, and weird, unpredictable things happen. -NetNewsWire is designed to be resistant to that, and it does a good job — but we haven’t anticipated every crazy case. +NetNewsWire is designed to be resistant to that, and it does a good job — but we haven’t anticipated every odd case. However, this is the most rare cause of reruns. The most common cause is, by far, the first one: the feed is now being generated by different software. ## Reporting Bugs -If you have a feed that keeps showing reruns (as opposed to once, when a blog changes its blogging system), please do report a bug, either on our [Issues Tracker](https://github.com/brentsimmons/NetNewsWire/issues) or on the [Slack group](https://join.slack.com/t/netnewswire/shared_invite/enQtNjM4MDA1MjQzMDkzLTNlNjBhOWVhYzdhYjA4ZWFhMzQ1MTUxYjU0NTE5ZGY0YzYwZWJhNjYwNTNmNTg2NjIwYWY4YzhlYzk5NmU3ZTc). \ No newline at end of file +If you have a feed that keeps showing reruns (as opposed to once, when a blog changes its blogging system), please do report a bug, either on our [Issues Tracker](https://github.com/brentsimmons/NetNewsWire/issues) or on the [Slack group](https://join.slack.com/t/netnewswire/shared_invite/enQtNjM4MDA1MjQzMDkzLTNlNjBhOWVhYzdhYjA4ZWFhMzQ1MTUxYjU0NTE5ZGY0YzYwZWJhNjYwNTNmNTg2NjIwYWY4YzhlYzk5NmU3ZTc). From a1e5c1d08325878c1c74e75932833abcfa40da72 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Thu, 13 Jun 2019 04:06:05 -0500 Subject: [PATCH 09/18] fixed mispelling --- Technotes/BranchingStrategy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Technotes/BranchingStrategy.md b/Technotes/BranchingStrategy.md index 71432071d..cf9732d4d 100644 --- a/Technotes/BranchingStrategy.md +++ b/Technotes/BranchingStrategy.md @@ -17,7 +17,7 @@ That is Three-Flow applied to NetNewsWire. It would be that simple, but we have Today (6/12/2019) we have 2 branches, master and macOS Candidate, in the main repository which will eventually grow to be 5 branches. -There will also be a number of repository forks that NetNewWire developers will create to do bug fixes and implement new features (not shown here). Typically contributers will fork the Master branch to thier own repository. They would then create a feature/bugfix branch on their repository. Once work on their forked branch is complete, they will submit a pull request to be merged back into the main repository master. +There will also be a number of repository forks that NetNewWire developers will create to do bug fixes and implement new features (not shown here). Typically contributers will fork the Master branch to thier own repository. They would then create a feature/bugfix branch on their repository. Once work on thier forked branch is complete, they will submit a pull request to be merged back into the main repository master. ## Tagging From 089435f1afab6a0b5a618cdba49af0bf91489885 Mon Sep 17 00:00:00 2001 From: Joe Heck Date: Thu, 13 Jun 2019 07:52:30 -0700 Subject: [PATCH 10/18] adding technote and readme update for CI - noting where and how CI is configured - added current build status to the README for NNW - referenced submodule builds for a complete view of the current builds in the technote --- README.md | 2 ++ Technotes/ContinuousIntegration.md | 40 ++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 Technotes/ContinuousIntegration.md diff --git a/README.md b/README.md index 58d23fecf..180476627 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # NetNewsWire +[![CircleCI](https://circleci.com/gh/brentsimmons/NetNewsWire.svg?style=svg)](https://circleci.com/gh/brentsimmons/NetNewsWire) + It’s a free and open source feed reader for macOS. It’s not in beta just yet. Getting close! While NetNewsWire 5.0 is feature-complete as of May 25, 2019, it has known bugs — and, surely, plenty of unknown bugs. diff --git a/Technotes/ContinuousIntegration.md b/Technotes/ContinuousIntegration.md new file mode 100644 index 000000000..67a0fa6c3 --- /dev/null +++ b/Technotes/ContinuousIntegration.md @@ -0,0 +1,40 @@ +# NetNewsWire Continuous Integration + +CI for NetNewsWire is enabled through CircleCI, hosted at +. The CI configuration (hosted in +[`.circleci/config.yml`](https://github.com/brentsimmons/NetNewsWire/blob/master/.circleci/config.yml) +uses `xcodebuild` to build the project after syncing the repository and +the various submodules. + +As of June 2019, CircleCI offered Xcode 10.2.1, so IOS 13 and Catalina support are not available +via CI as yet. + +The build itself focuses on the scheme NetNewsWire and leverages the +`NetNewsWire.xcworkspace` configuration. + +Each submodule also has it's own CI configuration, which are set up and built from +their own repositories. The submodule CI systems are entirely independent so that +those libraries can grow and change, getting CI verification, indepdent of NetNewsWire. + +The submodule CI are typically set to run a build and any available tests. Refer to the +project repository for the current and complete list of submodules, but for quick reference: + +- [RSCore](https://github.com/brentsimmons/RSCore) + +[![CircleCI](https://circleci.com/gh/brentsimmons/RSCore.svg?style=svg)](https://circleci.com/gh/brentsimmons/RSCore) + +- [RSCore](https://github.com/brentsimmons/RSWeb) + +[![CircleCI](https://circleci.com/gh/brentsimmons/RSWeb.svg?style=svg)](https://circleci.com/gh/brentsimmons/RSWeb) + +- [RSCore](https://github.com/brentsimmons/RSParser) + +[![CircleCI](https://circleci.com/gh/brentsimmons/RSParser.svg?style=svg)](https://circleci.com/gh/brentsimmons/RSParser) + +- [RSCore](https://github.com/brentsimmons/RSTree) + +[![CircleCI](https://circleci.com/gh/brentsimmons/RSTree.svg?style=svg)](https://circleci.com/gh/brentsimmons/RSTree) + +- [RSCore](https://github.com/brentsimmons/RSDatabase) + +[![CircleCI](https://circleci.com/gh/brentsimmons/RSDatabase.svg?style=svg)](https://circleci.com/gh/brentsimmons/RSDatabase) From 1b7f1b73a439291bba3c2cc23d6c336e95e8f0d7 Mon Sep 17 00:00:00 2001 From: Joe Heck Date: Thu, 13 Jun 2019 07:55:20 -0700 Subject: [PATCH 11/18] trying them out on the same line --- Technotes/ContinuousIntegration.md | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/Technotes/ContinuousIntegration.md b/Technotes/ContinuousIntegration.md index 67a0fa6c3..a65c90e7e 100644 --- a/Technotes/ContinuousIntegration.md +++ b/Technotes/ContinuousIntegration.md @@ -19,22 +19,12 @@ those libraries can grow and change, getting CI verification, indepdent of NetNe The submodule CI are typically set to run a build and any available tests. Refer to the project repository for the current and complete list of submodules, but for quick reference: -- [RSCore](https://github.com/brentsimmons/RSCore) +- [RSCore](https://github.com/brentsimmons/RSCore) [![CircleCI](https://circleci.com/gh/brentsimmons/RSCore.svg?style=svg)](https://circleci.com/gh/brentsimmons/RSCore) -[![CircleCI](https://circleci.com/gh/brentsimmons/RSCore.svg?style=svg)](https://circleci.com/gh/brentsimmons/RSCore) +- [RSCore](https://github.com/brentsimmons/RSWeb) [![CircleCI](https://circleci.com/gh/brentsimmons/RSWeb.svg?style=svg)](https://circleci.com/gh/brentsimmons/RSWeb) -- [RSCore](https://github.com/brentsimmons/RSWeb) +- [RSCore](https://github.com/brentsimmons/RSParser) [![CircleCI](https://circleci.com/gh/brentsimmons/RSParser.svg?style=svg)](https://circleci.com/gh/brentsimmons/RSParser) -[![CircleCI](https://circleci.com/gh/brentsimmons/RSWeb.svg?style=svg)](https://circleci.com/gh/brentsimmons/RSWeb) +- [RSCore](https://github.com/brentsimmons/RSTree) [![CircleCI](https://circleci.com/gh/brentsimmons/RSTree.svg?style=svg)](https://circleci.com/gh/brentsimmons/RSTree) -- [RSCore](https://github.com/brentsimmons/RSParser) - -[![CircleCI](https://circleci.com/gh/brentsimmons/RSParser.svg?style=svg)](https://circleci.com/gh/brentsimmons/RSParser) - -- [RSCore](https://github.com/brentsimmons/RSTree) - -[![CircleCI](https://circleci.com/gh/brentsimmons/RSTree.svg?style=svg)](https://circleci.com/gh/brentsimmons/RSTree) - -- [RSCore](https://github.com/brentsimmons/RSDatabase) - -[![CircleCI](https://circleci.com/gh/brentsimmons/RSDatabase.svg?style=svg)](https://circleci.com/gh/brentsimmons/RSDatabase) +- [RSCore](https://github.com/brentsimmons/RSDatabase) [![CircleCI](https://circleci.com/gh/brentsimmons/RSDatabase.svg?style=svg)](https://circleci.com/gh/brentsimmons/RSDatabase) From 12a3383af94ab885e6b477d3541a9c8c4370d050 Mon Sep 17 00:00:00 2001 From: Joe Heck Date: Thu, 13 Jun 2019 07:56:23 -0700 Subject: [PATCH 12/18] fix typos --- Technotes/ContinuousIntegration.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Technotes/ContinuousIntegration.md b/Technotes/ContinuousIntegration.md index a65c90e7e..fb100ea0b 100644 --- a/Technotes/ContinuousIntegration.md +++ b/Technotes/ContinuousIntegration.md @@ -21,10 +21,10 @@ project repository for the current and complete list of submodules, but for quic - [RSCore](https://github.com/brentsimmons/RSCore) [![CircleCI](https://circleci.com/gh/brentsimmons/RSCore.svg?style=svg)](https://circleci.com/gh/brentsimmons/RSCore) -- [RSCore](https://github.com/brentsimmons/RSWeb) [![CircleCI](https://circleci.com/gh/brentsimmons/RSWeb.svg?style=svg)](https://circleci.com/gh/brentsimmons/RSWeb) +- [RSWeb](https://github.com/brentsimmons/RSWeb) [![CircleCI](https://circleci.com/gh/brentsimmons/RSWeb.svg?style=svg)](https://circleci.com/gh/brentsimmons/RSWeb) -- [RSCore](https://github.com/brentsimmons/RSParser) [![CircleCI](https://circleci.com/gh/brentsimmons/RSParser.svg?style=svg)](https://circleci.com/gh/brentsimmons/RSParser) +- [RSParser](https://github.com/brentsimmons/RSParser) [![CircleCI](https://circleci.com/gh/brentsimmons/RSParser.svg?style=svg)](https://circleci.com/gh/brentsimmons/RSParser) -- [RSCore](https://github.com/brentsimmons/RSTree) [![CircleCI](https://circleci.com/gh/brentsimmons/RSTree.svg?style=svg)](https://circleci.com/gh/brentsimmons/RSTree) +- [RSTree](https://github.com/brentsimmons/RSTree) [![CircleCI](https://circleci.com/gh/brentsimmons/RSTree.svg?style=svg)](https://circleci.com/gh/brentsimmons/RSTree) -- [RSCore](https://github.com/brentsimmons/RSDatabase) [![CircleCI](https://circleci.com/gh/brentsimmons/RSDatabase.svg?style=svg)](https://circleci.com/gh/brentsimmons/RSDatabase) +- [RSDatabase](https://github.com/brentsimmons/RSDatabase) [![CircleCI](https://circleci.com/gh/brentsimmons/RSDatabase.svg?style=svg)](https://circleci.com/gh/brentsimmons/RSDatabase) From a33688aecfa2c849d7425cb1e084304933495ee6 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Thu, 13 Jun 2019 10:23:44 -0500 Subject: [PATCH 13/18] Add Images folder in Technotes and updated Technotes/README to point to a couple more files --- README.md | 2 +- Technotes/BranchingStrategy.md | 4 ++-- Technotes/{ => Images}/Branching-Full.png | Bin Technotes/{ => Images}/Branching.png | Bin Technotes/Images/icon.png | Bin 0 -> 7895 bytes Technotes/README.md | 2 ++ 6 files changed, 5 insertions(+), 3 deletions(-) rename Technotes/{ => Images}/Branching-Full.png (100%) rename Technotes/{ => Images}/Branching.png (100%) create mode 100644 Technotes/Images/icon.png diff --git a/README.md b/README.md index 58d23fecf..c09420d85 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# NetNewsWire +# ![Icon](Technotes/Images/icon.png) NetNewsWire It’s a free and open source feed reader for macOS. diff --git a/Technotes/BranchingStrategy.md b/Technotes/BranchingStrategy.md index cf9732d4d..768e9ab48 100644 --- a/Technotes/BranchingStrategy.md +++ b/Technotes/BranchingStrategy.md @@ -7,13 +7,13 @@ The main repository for NetNewsWire utilizes a [Trunk Based Development](https:/ Three-Flow uses 3 branches to facilitate development, stabilize a release, and manage production hotfixes. Development happens on Master and moves to a branch called Candidate when it is ready to be stabilized. New feature development continues on Master and bug fixes to the release candidate happen on Candidate. When the product is released, it is pushed to the Release branch. Hotfixes can happen on the Release branch. Candidate is now free to be reused to stabilize the next release. All bugs found and fixed are back merged to Candidate and then Master respectively. -![Branching](Branching.png) +![Branching](Images/Branching.png) All arrows going up are promotions (pushes) to the next environment. All arrows going down are back ports of bugfixes. That is Three-Flow applied to NetNewsWire. It would be that simple, but we have two products we are going to deliver from the same repository. The iOS and the macOS variants of NetNewsWire. To stabilize and manage both variants, each will need to be given their own Candidate and Release branches. -![Branching Full](Branching-Full.png) +![Branching Full](Images/Branching-Full.png) Today (6/12/2019) we have 2 branches, master and macOS Candidate, in the main repository which will eventually grow to be 5 branches. diff --git a/Technotes/Branching-Full.png b/Technotes/Images/Branching-Full.png similarity index 100% rename from Technotes/Branching-Full.png rename to Technotes/Images/Branching-Full.png diff --git a/Technotes/Branching.png b/Technotes/Images/Branching.png similarity index 100% rename from Technotes/Branching.png rename to Technotes/Images/Branching.png diff --git a/Technotes/Images/icon.png b/Technotes/Images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..affdc72fcb3d62a013f5c2782f10742c591e7f32 GIT binary patch literal 7895 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

$)*D5GgHelFIr^Xgd*cFOlLK03 zxlDhbka;}P*mphG|I%4W`FzPa1_EtWe1*||jMbt_i$f57XFe6{frW2Qzlm6#j$+Q9 z8Sf~|DutVp$;7ZHDRG;2p?UlG=+@c3+=Hcs6TdDwK)O`1YOxPfpvo#KG7{x`$r5ug z$kXv>41Z}!^bsf=OY2|Pdt8|%joE4RS2wwH_b5Mv(5|sPIRk9%bpsTq!xKPf-YX&0 zLISp}QLT?syG<`ff|__Pu*k0G$21JEd`59@_PNkMwX5!=6mvw;8p_KUq9V`0(zwM< zX3Wy>-r|ohG&(xkez_^>dAn74U)cT@+{E>N7;>!tyuCZ5U$!8w(1|xrX&rb@C9ygk z+k}agH18Et8bO#@p5hV8lRE}|&0H1fsz9)?xM=C)u$!=m{nmhc{#-~y@lcfT)*AJXZtlHZO%C7CV^r? zyT=+Aj>wNhC-#=8nRqI_6lOG<6Odl1$Cd*0Ax7N7D9gUVnNn9LzOwyEso)rcxW?5v zq)qv^v%i$$GI>vDd;*sz7xHUupN{%slqGR~o`j&A+Aq?P;jT3uNkz>j?|8}3l^YbR z?Ht9bdMSaK`Xn(diZ8O1Dc$;)SyYDxZ*6xZdi?NC&xEUBXxCHQyNp|U&6>7xSMbu#!0#Yz# zAz{PW(9iDOhwaJBNyC;U)2vo?N~}qF<>h$F9eCeH)`nD{%c7CxUgQ@>HQ%U{P5tov zw6JMare$ATycMzg(*xSty~`IGwI#U`=jPcOz?=y7ix&R(-JvtBtf|B0#6z?J}fI+NQ#|L!p z;?j6M2q+cIhoCbV(~cg06Z<+tMT7I(vo1Ym+!z=byL)>%>YST%^*kt(J$%a2>(CtM z6vGTL`-Qfz`D|B&(fK-_8@XW9<1DniIG0^&MEJ|je(j!&0$^6AsyIz3Kn^Zq`=!1VxV((KDL)=I&c zeKRX*&vh&Dn?F1MM8CdglHp0sQ)3=mT6)h&)agR?d|02=OqphVezA<_%JY6c(7|1I z?UY|ZYONX#MQ2e+Wt`N|FH;8ut_H*fobrt2`p0huiN_n4iBRNp{^_@0o6+@HyBF*Z zvLPHeHfF;VVHF3cE3shNf~W8?ItW6PfTFWjCW~iawU9S9yopvenG?9k4=XdZng>ZV zn(x3QvFvBvPr@;sol>riR0vZwZEbmWl5RJ#XKGw0s>09b`Heg^J4+n>sqvChbwg>8 zE4j@4cUgG4_`W_^9B*G7s7K6b6;y}W

`9x;jZZXY(aM;!r_t=~u+$q5unu`|3!1 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 Date: Thu, 13 Jun 2019 10:26:03 -0500 Subject: [PATCH 14/18] adjusted icon size --- Technotes/Images/icon.png | Bin 7895 -> 2813 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Technotes/Images/icon.png b/Technotes/Images/icon.png index affdc72fcb3d62a013f5c2782f10742c591e7f32..acc93903e92873652d3d855591a78ec4dcc10351 100644 GIT binary patch delta 2497 zcmV;y2|o7MJ^d9SiBL{Q4GJ0x0000DNk~Le0000W0000W2nGNE0CReJ^symX0e=Z? zNklgfVosp|p7(^@rMZu0rOOQwq5P?KO2uUE>Y_gl(&0gPqZ~c&j;bLpQ`KAAv zGv~v3&v}0D|2%V^bKw8_ktI~k`G4V$HXj=3OW#(_p^!3bWRZAZc7||U(-l0yuwchVO=o+><6gNKW zw3Aj*2yI-HO+Fb@8``>vl)z9T2cK7Sph0|XL(W6la@vyYByLX0tV3GZ%q@KJEDbj@g#*=J$zX8Pc|&6BN1#z(=>{U zi!qr@L?aO*(FlQnA4!sUYQb2Fr7I-5TJg9C64zn^4Z&?%x_@!uwGN0jyJhs`+e%j< zHHpaGAh&^FqB}l{OVMnm<{bk=9-t$r&CDMcpz*>51VI46<#Lgho=!L%#@Fp55D1X& zbnxDzllkSyD8crNBoZJ=U^au%?sy9juL4y4dhy*BOEQhbx1gMZ*b#^yXZx9n%qwZc zB1S;W0xb+;9)Fkoxg0ni=FqVwd_EsOpAWm;PFYzQ`JOz?W;3d)VlWu^?V@okD-M&4 zgh*+is9?2;MdFg(xmN++eq;B+h7+m3%J%zpEVDomIUSgX#iBCJz7~?lK@EZuCMjpI zP?T-ov-jKwq<FbKegFIteD1w>O2l^~u148mkU05Ez( zsNN7Qo_{O-p@SPst25oh+>g!-Qs$CCo(O6m7{?Qe=kUpyTpnLG6-80;csz)r$i<5n zk!6|DqetU#II!F8~>$kz@-$ZzGReuShD4?n;E|&|J%SCHz>wp8z%{;&L zFbR{uni*~MO7kG8kno4m%uY~Kpr;_2RIcX0;JK^=3Sqxjj%$RAC$O_`24mOW#`+_( zY4h6o%ZWRfHDv;!{wRu~peO@t#N%L4Okq(eX@Z3f52aXmdxSleN7=t%AGdb? z9e+o#36uoH;}G}zt^*j9jubeFB7>k1x4F5JHJ_yGR{`{{8XY+%^(n`dn!&r>@$!r4Vu4exyX;+~^1?{xr{)v69C+CLuJO>g@<#2k?60VF^o!)fMtI0rmqNMwvb zHfIAel3?eN}IxX?tIq>&|uVBR?;N3P>WDonXrxY<4hP!Ri339o3O9N3De) z)bH8$KxO5hpQt|;{y=p;toeK6{k3l%e)C_A_y8Tg=Us5E21}+0m;k$J&eJ2bis}cE ztuw$-fvRVst0E#`5P$p#dZRA&9@bB9{YXE(sSQYFIWUbcrfkx9&qPOBuJx18PH#VT ziICn^qx~Sj4Il;v?vQ4{3YaliOhW11ne<(V>4By=L)i+cK?k+LC5**6q{#|OSCE+A zRdcl%{ZCJ`A#FZ{z(5%l2m7JMU@(2CubP8?!@QyG)~+4<(H8Y@KTlEkFT(?r00000 LNkvXXu0mjf>AS7t delta 7619 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 From 44ba3d9c39378dcf2e14cd53e902df72fdc2c979 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Thu, 13 Jun 2019 10:38:17 -0500 Subject: [PATCH 15/18] Made the icon a little smaller to match the README heading size --- Technotes/Images/icon.png | Bin 2813 -> 1712 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Technotes/Images/icon.png b/Technotes/Images/icon.png index acc93903e92873652d3d855591a78ec4dcc10351..760dc122feed63fc74d6106d1284f9bdea09915c 100644 GIT binary patch literal 1712 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 Date: Thu, 13 Jun 2019 10:41:27 -0500 Subject: [PATCH 16/18] Made the icon a little larger this time to match the README heading size --- Technotes/Images/icon.png | Bin 1712 -> 2177 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Technotes/Images/icon.png b/Technotes/Images/icon.png index 760dc122feed63fc74d6106d1284f9bdea09915c..3596d896163ba45ab70470a99c609f2fe87eb07f 100644 GIT binary patch delta 2130 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 From 58459631e41e7198f2b3bc5d77059c2dad1cebc9 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Thu, 13 Jun 2019 14:30:56 -0500 Subject: [PATCH 17/18] Add SwiftUI account detail view --- NetNewsWire.xcodeproj/project.pbxproj | 22 ++-- iOS/MasterFeed/MasterFeedViewController.swift | 2 +- iOS/Settings/SettingsAddAccountView.swift | 3 +- iOS/Settings/SettingsDetailAccountView.swift | 114 ++++++++++++++++++ iOS/Settings/SettingsLocalAccountView.swift | 2 +- iOS/Settings/SettingsView.swift | 71 ++++++++++- iOS/Settings/SettingsViewModel.swift | 68 ----------- 7 files changed, 197 insertions(+), 85 deletions(-) create mode 100644 iOS/Settings/SettingsDetailAccountView.swift delete mode 100644 iOS/Settings/SettingsViewModel.swift diff --git a/NetNewsWire.xcodeproj/project.pbxproj b/NetNewsWire.xcodeproj/project.pbxproj index eab5f9426..a6cd26935 100644 --- a/NetNewsWire.xcodeproj/project.pbxproj +++ b/NetNewsWire.xcodeproj/project.pbxproj @@ -139,7 +139,7 @@ 51EF0F902279C9500050506E /* AccountsAddViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51EF0F8F2279C9500050506E /* AccountsAddViewController.swift */; }; 51EF0F922279CA620050506E /* AccountsAddTableCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51EF0F912279CA620050506E /* AccountsAddTableCellView.swift */; }; 51F35D0922AFD4760003CE1B /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51F35D0822AFD4760003CE1B /* SettingsView.swift */; }; - 51F35D1B22B001010003CE1B /* SettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51F35D1A22B001010003CE1B /* SettingsViewModel.swift */; }; + 51F772F622B279570087D9D1 /* SettingsDetailAccountView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51F772EC22B2789B0087D9D1 /* SettingsDetailAccountView.swift */; }; 51F85BE5227217D000C787DC /* RefreshIntervalViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51F85BDB2272162F00C787DC /* RefreshIntervalViewController.swift */; }; 51F85BE7227245FC00C787DC /* AboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51F85BE6227245FC00C787DC /* AboutViewController.swift */; }; 51F85BEB22724CB600C787DC /* About.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 51F85BEA22724CB600C787DC /* About.rtf */; }; @@ -730,7 +730,7 @@ 51EF0F8F2279C9500050506E /* AccountsAddViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountsAddViewController.swift; sourceTree = ""; }; 51EF0F912279CA620050506E /* AccountsAddTableCellView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountsAddTableCellView.swift; sourceTree = ""; }; 51F35D0822AFD4760003CE1B /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; - 51F35D1A22B001010003CE1B /* SettingsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewModel.swift; sourceTree = ""; }; + 51F772EC22B2789B0087D9D1 /* SettingsDetailAccountView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsDetailAccountView.swift; sourceTree = ""; }; 51F85BDB2272162F00C787DC /* RefreshIntervalViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshIntervalViewController.swift; sourceTree = ""; }; 51F85BE6227245FC00C787DC /* AboutViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutViewController.swift; sourceTree = ""; }; 51F85BEA22724CB600C787DC /* About.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = About.rtf; sourceTree = ""; }; @@ -1040,13 +1040,13 @@ 5183CCEB227117C70010922C /* Settings */ = { isa = PBXGroup; children = ( - 51F35CFD22AFD0350003CE1B /* UIKit */, - 51F35D0822AFD4760003CE1B /* SettingsView.swift */, - 51F35D1A22B001010003CE1B /* SettingsViewModel.swift */, 510D708122B041CC004E8F65 /* SettingsAccountLabelView.swift */, 510D707322B028E1004E8F65 /* SettingsAddAccountView.swift */, - 510D707D22B02A4B004E8F65 /* SettingsLocalAccountView.swift */, + 51F772EC22B2789B0087D9D1 /* SettingsDetailAccountView.swift */, 510D707F22B02A5F004E8F65 /* SettingsFeedbinAccountView.swift */, + 510D707D22B02A4B004E8F65 /* SettingsLocalAccountView.swift */, + 51F35D0822AFD4760003CE1B /* SettingsView.swift */, + 51F35CFD22AFD0350003CE1B /* UIKit */, ); path = Settings; sourceTree = ""; @@ -1935,12 +1935,12 @@ ORGANIZATIONNAME = "Ranchero Software"; TargetAttributes = { 6581C73220CED60000F4AD34 = { - DevelopmentTeam = M8L2WTLA8W; + DevelopmentTeam = SHJK2V3AJG; ProvisioningStyle = Manual; }; 840D617B2029031C009BC708 = { CreatedOnToolsVersion = 9.3; - DevelopmentTeam = M8L2WTLA8W; + DevelopmentTeam = SHJK2V3AJG; ProvisioningStyle = Automatic; SystemCapabilities = { com.apple.BackgroundModes = { @@ -1950,7 +1950,7 @@ }; 849C645F1ED37A5D003D8FC0 = { CreatedOnToolsVersion = 8.2.1; - DevelopmentTeam = M8L2WTLA8W; + DevelopmentTeam = SHJK2V3AJG; ProvisioningStyle = Manual; SystemCapabilities = { com.apple.HardenedRuntime = { @@ -1960,7 +1960,7 @@ }; 849C64701ED37A5D003D8FC0 = { CreatedOnToolsVersion = 8.2.1; - DevelopmentTeam = 9C84TZ7Q6Z; + DevelopmentTeam = SHJK2V3AJG; ProvisioningStyle = Automatic; TestTargetID = 849C645F1ED37A5D003D8FC0; }; @@ -2324,6 +2324,7 @@ 510D707422B028E1004E8F65 /* SettingsAddAccountView.swift in Sources */, 51C45294226509C800C03939 /* SearchFeedDelegate.swift in Sources */, 512E09352268B25900BDCFDD /* UISplitViewController-Extensions.swift in Sources */, + 51F772F622B279570087D9D1 /* SettingsDetailAccountView.swift in Sources */, 510D707E22B02A4B004E8F65 /* SettingsLocalAccountView.swift in Sources */, 51C452A022650A1900C03939 /* FeedIconDownloader.swift in Sources */, 51F85BE7227245FC00C787DC /* AboutViewController.swift in Sources */, @@ -2348,7 +2349,6 @@ 51C4529922650A0000C03939 /* ArticleStylesManager.swift in Sources */, 51EF0F802277A8330050506E /* MasterTimelineCellLayout.swift in Sources */, 51F85BF722749FA100C787DC /* UIFont-Extensions.swift in Sources */, - 51F35D1B22B001010003CE1B /* SettingsViewModel.swift in Sources */, 515436882291D75D005E1CDF /* AddLocalAccountViewController.swift in Sources */, 51C452AF2265108300C03939 /* ArticleArray.swift in Sources */, 51C4528E2265099C00C03939 /* SmartFeedsController.swift in Sources */, diff --git a/iOS/MasterFeed/MasterFeedViewController.swift b/iOS/MasterFeed/MasterFeedViewController.swift index f91f0ca6a..13eca1c11 100644 --- a/iOS/MasterFeed/MasterFeedViewController.swift +++ b/iOS/MasterFeed/MasterFeedViewController.swift @@ -394,7 +394,7 @@ class MasterFeedViewController: ProgressTableViewController, UndoableCommandRunn @IBAction func settings(_ sender: UIBarButtonItem) { - let settings = UIHostingController(rootView: SettingsView(viewModel: SettingsViewModel())) + let settings = UIHostingController(rootView: SettingsView(viewModel: SettingsView.ViewModel())) self.present(settings, animated: true) } diff --git a/iOS/Settings/SettingsAddAccountView.swift b/iOS/Settings/SettingsAddAccountView.swift index ae18edabc..fde5175f0 100644 --- a/iOS/Settings/SettingsAddAccountView.swift +++ b/iOS/Settings/SettingsAddAccountView.swift @@ -7,11 +7,12 @@ // import SwiftUI +import Account struct SettingsAddAccountView : View { var body: some View { List { - PresentationButton(SettingsAccountLabelView(accountImage: "accountLocal", accountLabel: "On My Device"), + PresentationButton(SettingsAccountLabelView(accountImage: "accountLocal", accountLabel: Account.defaultLocalAccountName), destination: SettingsLocalAccountView(name: "")).padding(.all, 4) PresentationButton(SettingsAccountLabelView(accountImage: "accountFeedbin", accountLabel: "Feedbin"), destination: SettingsFeedbinAccountView(viewModel: SettingsFeedbinAccountView.ViewModel())).padding(.all, 4) diff --git a/iOS/Settings/SettingsDetailAccountView.swift b/iOS/Settings/SettingsDetailAccountView.swift new file mode 100644 index 000000000..75f4fe1fe --- /dev/null +++ b/iOS/Settings/SettingsDetailAccountView.swift @@ -0,0 +1,114 @@ +// +// SettingsDetailAccountView.swift +// NetNewsWire +// +// Created by Maurice Parker on 6/13/19. +// Copyright © 2019 Ranchero Software. All rights reserved. +// + +import SwiftUI +import Combine +import Account + +struct SettingsDetailAccountView : View { + @ObjectBinding var viewModel: ViewModel + @State private var verifyDelete = false + + var body: some View { + List { + Section { + HStack { + Text("Name") + Divider() + TextField($viewModel.name, placeholder: Text("(Optional)")) + } + Toggle(isOn: $viewModel.isActive) { + Text("Active") + } + } + Section { + HStack { + Spacer() + Button(action: { + + }) { + Text("Credentials") + } + Spacer() + } + } + if viewModel.isDeletable { + Section { + HStack { + Spacer() + Button(action: { + self.verifyDelete = true + }) { + Text("Delete Account") + .foregroundColor(.red) + } + .presentation($verifyDelete) { + Alert(title: Text("Are you sure you want to delete \"\(viewModel.nameForDisplay)\"?"), + primaryButton: Alert.Button.default(Text("Delete"), onTrigger: { self.viewModel.delete() }), + secondaryButton: Alert.Button.cancel()) + } + Spacer() + } + } + } + } + .listStyle(.grouped) + .navigationBarTitle(Text(verbatim: viewModel.nameForDisplay), displayMode: .inline) + + } + + class ViewModel: BindableObject { + let didChange = PassthroughSubject() + let account: Account + + init(_ account: Account) { + self.account = account + } + + var nameForDisplay: String { + account.nameForDisplay + } + + var name: String { + get { + account.name ?? "" + } + set { + account.name = newValue.isEmpty ? nil : newValue + didChange.send(self) + } + } + + var isActive: Bool { + get { + account.isActive + } + set { + account.isActive = newValue + didChange.send(self) + } + } + + var isDeletable: Bool { + return AccountManager.shared.defaultAccount != account + } + + func delete() { + AccountManager.shared.deleteAccount(account) + } + } +} + +#if DEBUG +struct SettingsDetailAccountView_Previews : PreviewProvider { + static var previews: some View { + let viewModel = SettingsDetailAccountView.ViewModel(AccountManager.shared.defaultAccount) + return SettingsDetailAccountView(viewModel: viewModel) + } +} +#endif diff --git a/iOS/Settings/SettingsLocalAccountView.swift b/iOS/Settings/SettingsLocalAccountView.swift index e39edcec4..40f671661 100644 --- a/iOS/Settings/SettingsLocalAccountView.swift +++ b/iOS/Settings/SettingsLocalAccountView.swift @@ -17,7 +17,7 @@ struct SettingsLocalAccountView : View { NavigationView { List { Section(header: - SettingsAccountLabelView(accountImage: "accountLocal", accountLabel: "On My Device").padding() + SettingsAccountLabelView(accountImage: "accountLocal", accountLabel: Account.defaultLocalAccountName).padding() ) { HStack { Spacer() diff --git a/iOS/Settings/SettingsView.swift b/iOS/Settings/SettingsView.swift index 629e78b25..d0ddae653 100644 --- a/iOS/Settings/SettingsView.swift +++ b/iOS/Settings/SettingsView.swift @@ -7,10 +7,11 @@ // import SwiftUI +import Combine import Account struct SettingsView : View { - @ObjectBinding var viewModel: SettingsViewModel + @ObjectBinding var viewModel: ViewModel var body: some View { NavigationView { @@ -18,7 +19,9 @@ struct SettingsView : View { Section(header: Text("ACCOUNTS")) { ForEach(viewModel.accounts.identified(by: \.self)) { account in - Text(verbatim: account.nameForDisplay) + NavigationButton(destination: SettingsDetailAccountView(viewModel: SettingsDetailAccountView.ViewModel(account)), isDetail: false) { + Text(verbatim: account.nameForDisplay) + } } NavigationButton(destination: SettingsAddAccountView(), isDetail: false) { Text("Add Account") @@ -83,12 +86,74 @@ struct SettingsView : View { } } + + class ViewModel: BindableObject { + + let didChange = PassthroughSubject() + + init() { + NotificationCenter.default.addObserver(self, selector: #selector(accountsDidChange(_:)), name: .AccountsDidChange, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(displayNameDidChange(_:)), name: .DisplayNameDidChange, object: nil) + } + + var accounts: [Account] { + get { + return AccountManager.shared.sortedAccounts + } + set { + } + } + + var sortOldestToNewest: Bool { + get { + return AppDefaults.timelineSortDirection == .orderedDescending + } + set { + if newValue == true { + AppDefaults.timelineSortDirection = .orderedDescending + } else { + AppDefaults.timelineSortDirection = .orderedAscending + } + didChange.send(self) + } + } + + var timelineNumberOfLines: Int { + get { + return AppDefaults.timelineNumberOfLines + } + set { + AppDefaults.timelineNumberOfLines = newValue + didChange.send(self) + } + } + + var refreshInterval: RefreshInterval { + get { + return AppDefaults.refreshInterval + } + set { + AppDefaults.refreshInterval = newValue + didChange.send(self) + } + } + + @objc func accountsDidChange(_ notification: Notification) { + didChange.send(self) + } + + @objc func displayNameDidChange(_ notification: Notification) { + didChange.send(self) + } + + } + } #if DEBUG struct SettingsView_Previews : PreviewProvider { static var previews: some View { - SettingsView(viewModel: SettingsViewModel()) + SettingsView(viewModel: SettingsView.ViewModel()) } } #endif diff --git a/iOS/Settings/SettingsViewModel.swift b/iOS/Settings/SettingsViewModel.swift deleted file mode 100644 index d51735fa4..000000000 --- a/iOS/Settings/SettingsViewModel.swift +++ /dev/null @@ -1,68 +0,0 @@ -// -// SettingsViewModel.swift -// NetNewsWire-iOS -// -// Created by Maurice Parker on 6/11/19. -// Copyright © 2019 Ranchero Software. All rights reserved. -// - -import Foundation -import SwiftUI -import Combine -import Account - -class SettingsViewModel: BindableObject { - - let didChange = PassthroughSubject() - - init() { - NotificationCenter.default.addObserver(self, selector: #selector(accountsDidChange(_:)), name: .AccountsDidChange, object: nil) - } - - var accounts: [Account] { - get { - return AccountManager.shared.accounts - } - set { - } - } - - var sortOldestToNewest: Bool { - get { - return AppDefaults.timelineSortDirection == .orderedDescending - } - set { - if newValue == true { - AppDefaults.timelineSortDirection = .orderedDescending - } else { - AppDefaults.timelineSortDirection = .orderedAscending - } - didChange.send(self) - } - } - - var timelineNumberOfLines: Int { - get { - return AppDefaults.timelineNumberOfLines - } - set { - AppDefaults.timelineNumberOfLines = newValue - didChange.send(self) - } - } - - var refreshInterval: RefreshInterval { - get { - return AppDefaults.refreshInterval - } - set { - AppDefaults.refreshInterval = newValue - didChange.send(self) - } - } - - @objc func accountsDidChange(_ notification: Notification) { - didChange.send(self) - } - -} From 7929371120d668a46df0d0f62648910bb639bc12 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Thu, 13 Jun 2019 15:56:44 -0500 Subject: [PATCH 18/18] Update README.md Added some formatting to recently added items. --- Technotes/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Technotes/README.md b/Technotes/README.md index 073b1496f..20a6392f7 100644 --- a/Technotes/README.md +++ b/Technotes/README.md @@ -17,5 +17,7 @@ ## Contributing [Contributing](../CONTRIBUTING.md) + [Coding Guidelines](CodingGuidelines.md) + [Branching Strategy](BranchingStrategy.md)