Reduces reliance on presentationMode to dismiss

Bindings are passed instead and this fixes issues with Add Web (etc) only appearing once.
This commit is contained in:
Stuart Breckenridge 2020-08-14 00:04:39 +08:00
parent 7aab8c87fb
commit 0a51508abf
No known key found for this signature in database
GPG Key ID: 79BD673276AE83CE
6 changed files with 62 additions and 51 deletions

View File

@ -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()
}
}

View File

@ -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()
}
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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()

View File

@ -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 = "<group>"; };
1717535524BADF33004498C6 /* GeneralPreferencesModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneralPreferencesModel.swift; sourceTree = "<group>"; };
171BCB8B24CB08A3006E22D9 /* FixAccountCredentialView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FixAccountCredentialView.swift; sourceTree = "<group>"; };
172199C824AB228900A31D04 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = "<group>"; };
@ -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 */,