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:
parent
7aab8c87fb
commit
0a51508abf
@ -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()
|
||||
}
|
||||
}
|
||||
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
21
Multiplatform/Shared/SceneNavigationModel.swift
Normal file
21
Multiplatform/Shared/SceneNavigationModel.swift
Normal 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
|
||||
}
|
@ -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
|
||||
}
|
||||
|
@ -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()
|
||||
|
@ -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 */,
|
||||
|
Loading…
x
Reference in New Issue
Block a user