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