From 0a51508abfd500227917c68e50d176e625cb1c1a Mon Sep 17 00:00:00 2001 From: Stuart Breckenridge Date: Fri, 14 Aug 2020 00:04:39 +0800 Subject: [PATCH] Reduces reliance on presentationMode to dismiss Bindings are passed instead and this fixes issues with Add Web (etc) only appearing once. --- Multiplatform/Shared/Add/AddFolderView.swift | 18 +++----- Multiplatform/Shared/Add/AddWebFeedView.swift | 19 ++++---- .../Shared/SceneNavigationModel.swift | 21 +++++++++ .../Shared/SceneNavigationView.swift | 45 +++++++++---------- .../Sidebar/SidebarToolbarModifier.swift | 4 +- NetNewsWire.xcodeproj/project.pbxproj | 6 +++ 6 files changed, 62 insertions(+), 51 deletions(-) create mode 100644 Multiplatform/Shared/SceneNavigationModel.swift diff --git a/Multiplatform/Shared/Add/AddFolderView.swift b/Multiplatform/Shared/Add/AddFolderView.swift index 3256b6fea..1167096c5 100644 --- a/Multiplatform/Shared/Add/AddFolderView.swift +++ b/Multiplatform/Shared/Add/AddFolderView.swift @@ -12,8 +12,8 @@ import RSCore struct AddFolderView: View { - @Environment(\.presentationMode) private var presentationMode @ObservedObject private var viewModel = AddFolderModel() + @Binding var isPresented: Bool var body: some View { #if os(iOS) @@ -21,16 +21,14 @@ struct AddFolderView: View { .onReceive(viewModel.$shouldDismiss, perform: { dismiss in if dismiss == true { - presentationMode - .wrappedValue - .dismiss() + isPresented = false } }) #else macForm .onReceive(viewModel.$shouldDismiss, perform: { dismiss in if dismiss == true { - presentationMode.wrappedValue.dismiss() + isPresented = false } }) #endif @@ -50,7 +48,7 @@ struct AddFolderView: View { .navigationBarTitleDisplayMode(.inline) .navigationBarItems( leading:Button("Cancel", action: { - presentationMode.wrappedValue.dismiss() + isPresented = false } ) .help("Cancel Adding Folder"), @@ -113,7 +111,7 @@ struct AddFolderView: View { } Spacer() Button("Cancel", action: { - presentationMode.wrappedValue.dismiss() + isPresented = false }) .help("Cancel Adding Folder") @@ -125,9 +123,3 @@ struct AddFolderView: View { } } } - -struct AddFolderView_Previews: PreviewProvider { - static var previews: some View { - AddFolderView() - } -} diff --git a/Multiplatform/Shared/Add/AddWebFeedView.swift b/Multiplatform/Shared/Add/AddWebFeedView.swift index d040c7391..e898312e0 100644 --- a/Multiplatform/Shared/Add/AddWebFeedView.swift +++ b/Multiplatform/Shared/Add/AddWebFeedView.swift @@ -13,8 +13,8 @@ import RSCore struct AddWebFeedView: View { - @Environment(\.presentationMode) private var presentationMode @StateObject private var viewModel = AddWebFeedModel() + @Binding var isPresented: Bool var body: some View { #if os(iOS) @@ -24,7 +24,7 @@ struct AddWebFeedView: View { } .onReceive(viewModel.$shouldDismiss, perform: { dismiss in if dismiss == true { - presentationMode.wrappedValue.dismiss() + isPresented = false } }) #else @@ -37,9 +37,10 @@ struct AddWebFeedView: View { dismissButton: Alert.Button.cancel({ viewModel.addFeedError = AddWebFeedError.none })) - }.onReceive(viewModel.$shouldDismiss, perform: { dismiss in + } + .onChange(of: viewModel.shouldDismiss, perform: { dismiss in if dismiss == true { - presentationMode.wrappedValue.dismiss() + isPresented = false } }) #endif @@ -92,7 +93,7 @@ struct AddWebFeedView: View { .navigationBarTitleDisplayMode(.inline) .navigationBarItems(leading: Button("Cancel", action: { - presentationMode.wrappedValue.dismiss() + isPresented = false }) .help("Cancel Add Feed") , trailing: @@ -188,7 +189,7 @@ struct AddWebFeedView: View { } Spacer() Button("Cancel", action: { - presentationMode.wrappedValue.dismiss() + isPresented = false }) .help("Cancel Add Feed") @@ -205,8 +206,4 @@ struct AddWebFeedView: View { } -struct AddFeedView_Previews: PreviewProvider { - static var previews: some View { - AddWebFeedView() - } -} + diff --git a/Multiplatform/Shared/SceneNavigationModel.swift b/Multiplatform/Shared/SceneNavigationModel.swift new file mode 100644 index 000000000..f613210f7 --- /dev/null +++ b/Multiplatform/Shared/SceneNavigationModel.swift @@ -0,0 +1,21 @@ +// +// SceneNavigationModel.swift +// NetNewsWire +// +// Created by Stuart Breckenridge on 13/8/20. +// Copyright © 2020 Ranchero Software. All rights reserved. +// + +import Foundation + + +class SceneNavigationModel: ObservableObject { + @Published var sheetToShow: SidebarSheets = .none { + didSet { + sheetToShow != .none ? (showSheet = true) : (showSheet = false) + } + } + @Published var showSheet = false + @Published var showShareSheet = false + @Published var showAccountSyncErrorAlert = false +} diff --git a/Multiplatform/Shared/SceneNavigationView.swift b/Multiplatform/Shared/SceneNavigationView.swift index dac1dfa88..190164638 100644 --- a/Multiplatform/Shared/SceneNavigationView.swift +++ b/Multiplatform/Shared/SceneNavigationView.swift @@ -12,13 +12,11 @@ import Account import AppKit #endif + struct SceneNavigationView: View { @StateObject private var sceneModel = SceneModel() - @State private var showSheet = false - @State private var showShareSheet = false - @State private var sheetToShow: SidebarSheets = .none - @State private var showAccountSyncErrorAlert = false // multiple sync errors + @StateObject private var sceneNavigationModel = SceneNavigationModel() #if os(iOS) @Environment(\.horizontalSizeClass) private var horizontalSizeClass @@ -47,41 +45,38 @@ struct SceneNavigationView: View { .onAppear { sceneModel.startup() } - .onChange(of: sheetToShow) { value in - value != .none ? (showSheet = true) : (showSheet = false) - } .onReceive(sceneModel.$accountSyncErrors) { errors in if errors.count == 0 { - showAccountSyncErrorAlert = false + sceneNavigationModel.showAccountSyncErrorAlert = false } else { if errors.count > 1 { - showAccountSyncErrorAlert = true + sceneNavigationModel.showAccountSyncErrorAlert = true } else { - sheetToShow = .fixCredentials + sceneNavigationModel.sheetToShow = .fixCredentials } } } - .sheet(isPresented: $showSheet, + .sheet(isPresented: $sceneNavigationModel.showSheet, onDismiss: { - sheetToShow = .none + sceneNavigationModel.sheetToShow = .none sceneModel.accountSyncErrors = [] }) { - if sheetToShow == .web { - AddWebFeedView() + if sceneNavigationModel.sheetToShow == .web { + AddWebFeedView(isPresented: $sceneNavigationModel.showSheet) } - if sheetToShow == .folder { - AddFolderView() + if sceneNavigationModel.sheetToShow == .folder { + AddFolderView(isPresented: $sceneNavigationModel.showSheet) } #if os(iOS) - if sheetToShow == .settings { + if sceneNavigationModel.sheetToShow == .settings { SettingsView() } #endif - if sheetToShow == .fixCredentials { + if sceneNavigationModel.sheetToShow == .fixCredentials { FixAccountCredentialView(accountSyncError: sceneModel.accountSyncErrors[0]) } } - .alert(isPresented: $showAccountSyncErrorAlert, content: { + .alert(isPresented: $sceneNavigationModel.showAccountSyncErrorAlert, content: { #if os(macOS) return Alert(title: Text("Account Sync Error"), message: Text("The following accounts failed to sync: ") + Text(sceneModel.accountSyncErrors.map({ $0.account.nameForDisplay }).joined(separator: ", ")) + Text(". You can update credentials in Preferences"), @@ -91,7 +86,7 @@ struct SceneNavigationView: View { message: Text("The following accounts failed to sync: ") + Text(sceneModel.accountSyncErrors.map({ $0.account.nameForDisplay }).joined(separator: ", ")) + Text(". You can update credentials in Settings"), primaryButton: .default(Text("Show Settings"), action: { DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: { - sheetToShow = .settings + sceneNavigationModel.sheetToShow = .settings }) }), @@ -112,10 +107,10 @@ struct SceneNavigationView: View { } ToolbarItem() { Menu { - Button("Add Web Feed", action: { sheetToShow = .web }) + Button("Add Web Feed", action: { sceneNavigationModel.sheetToShow = .web }) Button("Add Reddit Feed", action: { }) Button("Add Twitter Feed", action: { }) - Button("Add Folder", action: { sheetToShow = .folder}) + Button("Add Folder", action: { sceneNavigationModel.sheetToShow = .folder}) } label : { AppAssets.addMenuImage } @@ -197,12 +192,12 @@ struct SceneNavigationView: View { } ToolbarItem { ZStack { - if showShareSheet { - SharingServiceView(articles: sceneModel.selectedArticles, showing: $showShareSheet) + if sceneNavigationModel.showShareSheet { + SharingServiceView(articles: sceneModel.selectedArticles, showing: $sceneNavigationModel.showShareSheet) .frame(width: 20, height: 20) } Button { - showShareSheet = true + sceneNavigationModel.showShareSheet = true } label: { AppAssets.shareImage } diff --git a/Multiplatform/Shared/Sidebar/SidebarToolbarModifier.swift b/Multiplatform/Shared/Sidebar/SidebarToolbarModifier.swift index 9d604c2a5..b0096513e 100644 --- a/Multiplatform/Shared/Sidebar/SidebarToolbarModifier.swift +++ b/Multiplatform/Shared/Sidebar/SidebarToolbarModifier.swift @@ -81,10 +81,10 @@ struct SidebarToolbarModifier: ViewModifier { } .sheet(isPresented: $viewModel.showSheet, onDismiss: { viewModel.sheetToShow = .none }) { if viewModel.sheetToShow == .web { - AddWebFeedView() + AddWebFeedView(isPresented: $viewModel.showSheet) } if viewModel.sheetToShow == .folder { - AddFolderView() + AddFolderView(isPresented: $viewModel.showSheet) } if viewModel.sheetToShow == .settings { SettingsView() diff --git a/NetNewsWire.xcodeproj/project.pbxproj b/NetNewsWire.xcodeproj/project.pbxproj index fda989d4a..487c38536 100644 --- a/NetNewsWire.xcodeproj/project.pbxproj +++ b/NetNewsWire.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 1704053424E5985A00A00787 /* SceneNavigationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1704053324E5985A00A00787 /* SceneNavigationModel.swift */; }; + 1704053524E5985A00A00787 /* SceneNavigationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1704053324E5985A00A00787 /* SceneNavigationModel.swift */; }; 1717535624BADF33004498C6 /* GeneralPreferencesModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1717535524BADF33004498C6 /* GeneralPreferencesModel.swift */; }; 171BCB8C24CB08A3006E22D9 /* FixAccountCredentialView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171BCB8B24CB08A3006E22D9 /* FixAccountCredentialView.swift */; }; 171BCB8D24CB08A3006E22D9 /* FixAccountCredentialView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171BCB8B24CB08A3006E22D9 /* FixAccountCredentialView.swift */; }; @@ -1415,6 +1417,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 1704053324E5985A00A00787 /* SceneNavigationModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneNavigationModel.swift; sourceTree = ""; }; 1717535524BADF33004498C6 /* GeneralPreferencesModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneralPreferencesModel.swift; sourceTree = ""; }; 171BCB8B24CB08A3006E22D9 /* FixAccountCredentialView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FixAccountCredentialView.swift; sourceTree = ""; }; 172199C824AB228900A31D04 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; @@ -2634,6 +2637,7 @@ FF64D0C424AF53EE0084080A /* RefreshProgressModel.swift */, 51E499D724A912C200B667CB /* SceneModel.swift */, 51E49A0224A91FF600B667CB /* SceneNavigationView.swift */, + 1704053324E5985A00A00787 /* SceneNavigationModel.swift */, 51C0513824A77DF800194D5E /* Assets.xcassets */, 17930ED224AF10CD00A9BA52 /* Add */, 51A576B924AE617B00078888 /* Article */, @@ -4419,6 +4423,7 @@ 51E498F124A8085D00B667CB /* StarredFeedDelegate.swift in Sources */, 51E498FF24A808BB00B667CB /* SingleFaviconDownloader.swift in Sources */, 51E4997224A8784300B667CB /* DefaultFeedsImporter.swift in Sources */, + 1704053424E5985A00A00787 /* SceneNavigationModel.swift in Sources */, 514E6C0924AD39AD00AC6F6E /* ArticleIconImageLoader.swift in Sources */, 6594CA3B24AF6F2A005C7D7C /* OPMLExporter.swift in Sources */, FA80C13E24B072AA00974098 /* AddFolderModel.swift in Sources */, @@ -4643,6 +4648,7 @@ 514E6C0324AD29A300AC6F6E /* TimelineItemStatusView.swift in Sources */, 51B54A6524B549B20014348B /* WrapperScriptMessageHandler.swift in Sources */, 51E4996D24A8762D00B667CB /* ArticleExtractor.swift in Sources */, + 1704053524E5985A00A00787 /* SceneNavigationModel.swift in Sources */, 51E4994024A8713B00B667CB /* AccountRefreshTimer.swift in Sources */, 51E49A0424A91FF600B667CB /* SceneNavigationView.swift in Sources */, 51E498CC24A8085D00B667CB /* SearchFeedDelegate.swift in Sources */,