diff --git a/Shared/Navigation/ContentView.swift b/Shared/Navigation/ContentView.swift index f67cda9..5b9d89a 100644 --- a/Shared/Navigation/ContentView.swift +++ b/Shared/Navigation/ContentView.swift @@ -1,87 +1,112 @@ import SwiftUI struct ContentView: View { @EnvironmentObject var model: WriteFreelyModel @EnvironmentObject var errorHandling: ErrorHandling var body: some View { - NavigationView { - #if os(macOS) - CollectionListView() - .withErrorHandling() - .toolbar { - Button( - action: { - NSApp.keyWindow?.contentViewController?.tryToPerform( - #selector(NSSplitViewController.toggleSidebar(_:)), with: nil + #if os(macOS) + WFNavigation( + collectionList: { + CollectionListView() + .withErrorHandling() + .toolbar { + if #available(macOS 13, *) { + EmptyView() + } else { + Button( + action: { + NSApp.keyWindow?.contentViewController?.tryToPerform( + #selector(NSSplitViewController.toggleSidebar(_:)), with: nil + ) + }, + label: { Image(systemName: "sidebar.left") } ) - }, - label: { Image(systemName: "sidebar.left") } - ) - .help("Toggle the sidebar's visibility.") - Spacer() - Button(action: { - withAnimation { - // Un-set the currently selected post - self.model.selectedPost = nil + .help("Toggle the sidebar's visibility.") } - // Create the new-post managed object - let managedPost = model.editor.generateNewLocalPost(withFont: model.preferences.font) - withAnimation { - DispatchQueue.main.async { - // Load the new post in the editor - self.model.selectedPost = managedPost + Spacer() + Button(action: { + withAnimation { + // Un-set the currently selected post + self.model.selectedPost = nil + } + // Create the new-post managed object + let managedPost = model.editor.generateNewLocalPost(withFont: model.preferences.font) + withAnimation { + DispatchQueue.main.async { + // Load the new post in the editor + self.model.selectedPost = managedPost + } } + }, label: { Image(systemName: "square.and.pencil") }) + .help("Create a new local draft.") + } + .frame(width: 200) + }, + postList: { + ZStack { + PostListView(selectedCollection: model.selectedCollection, showAllPosts: model.showAllPosts) + .withErrorHandling() + .frame(width: 300) + if model.isProcessingRequest { + ZStack { + Color(NSColor.controlBackgroundColor).opacity(0.75) + ProgressView() } - }, label: { Image(systemName: "square.and.pencil") }) - .help("Create a new local draft.") - } - .frame(width: 200) - #else - CollectionListView() - .withErrorHandling() - #endif - - #if os(macOS) - ZStack { - PostListView(selectedCollection: model.selectedCollection, showAllPosts: model.showAllPosts) - .withErrorHandling() - .frame(width: 300) - if model.isProcessingRequest { - ZStack { - Color(NSColor.controlBackgroundColor).opacity(0.75) - ProgressView() } } + }, + postDetail: { + NoSelectedPostView(isConnected: $model.hasNetworkConnection) + } + ) + .environmentObject(model) + .onChange(of: model.hasError) { value in + if value { + if let error = model.currentError { + self.errorHandling.handle(error: error) + } else { + self.errorHandling.handle(error: AppError.genericError()) + } + model.hasError = false } - #else - PostListView(selectedCollection: model.selectedCollection, showAllPosts: model.showAllPosts) - .withErrorHandling() - #endif - - NoSelectedPostView(isConnected: $model.hasNetworkConnection) } + #else + WFNavigation( + collectionList: { + CollectionListView() + .withErrorHandling() + }, + postList: { + PostListView(selectedCollection: model.selectedCollection, showAllPosts: model.showAllPosts) + .withErrorHandling() + }, + postDetail: { + NoSelectedPostView(isConnected: $model.hasNetworkConnection) + } + ) .environmentObject(model) .onChange(of: model.hasError) { value in if value { if let error = model.currentError { self.errorHandling.handle(error: error) } else { self.errorHandling.handle(error: AppError.genericError()) } model.hasError = false } } + #endif } } struct ContentView_Previews: PreviewProvider { static var previews: some View { let context = LocalStorageManager.standard.container.viewContext let model = WriteFreelyModel() return ContentView() .environment(\.managedObjectContext, context) .environmentObject(model) } }