import SwiftUI struct MainView: View { @EnvironmentObject var settings: SettingsManager @State private var selectedTab: Int = 0 @State private var selectedPost: (post: BooruPost?, manager: BooruManager?) var body: some View { platformSpecificContent .environmentObject(settings) .onChange(of: settings.preferredBooru) { _, newState in updateManager(newState) } .onChange(of: settings.searchSuggestionsMode) { _, newState in if newState != .disabled { refreshTags() } } .onAppear(perform: initializeManager) } @ViewBuilder private var platformSpecificContent: some View { #if os(macOS) ContentView(selectedTab: $selectedTab, selectedPost: $selectedPost) #else TabView(selection: $selectedTab) { ContentView(selectedTab: $selectedTab, selectedPost: $selectedPost) .tabItem { Label("Posts", systemImage: "rectangle.stack") } .tag(0) NavigationStack { BookmarksView( selectedTab: $selectedTab, manager: selectedPost.manager ?? BooruManager() ) } .tabItem { Label("Bookmarks", systemImage: "bookmark") } .tag(1) SettingsView() .tabItem { Label("Settings", systemImage: "gear") } .tag(2) } #endif } private func updateManager(_ provider: BooruProvider) { if var manager = selectedPost.manager { let previousSearchText = manager.searchText manager = BooruManager(provider) manager.searchText = previousSearchText Task { refreshTags() if manager.searchText.isEmpty { await manager.fetchPosts() } else { manager.performSearch(settings: settings) } } } } private func initializeManager() { if var manager = selectedPost.manager { manager = BooruManager(settings.preferredBooru) Task { refreshTags() if manager.posts.isEmpty { await manager.fetchPosts() } } } } private func refreshTags() { if let manager = selectedPost.manager { Task { if settings.searchSuggestionsMode != .disabled { manager.initializeTags() } else { manager.updateTagsCacheSize() } } } } } #Preview { MainView() .environmentObject(SettingsManager()) #if os(macOS) .frame(width: 736, height: 736) #endif }