import SwiftUI struct PostGridTabSwitcherView: View { @EnvironmentObject var settings: SettingsManager @State private var tabs: [PostGridTab] = [] @State private var selectedTabID: UUID? @Binding private var selectedTab: Int @State private var searchText: String = "" @Binding private var selectedPost: (post: BooruPost?, manager: BooruManager?) init(selectedTab: Binding, selectedPost: Binding<(post: BooruPost?, manager: BooruManager?)>) { let initialTab = PostGridTab(manager: BooruManager()) _tabs = State(initialValue: [initialTab]) _selectedTabID = State(initialValue: initialTab.id) _selectedTab = selectedTab _selectedPost = selectedPost Task { await initialTab.manager.fetchPosts(page: 1, tags: [], replace: true) } } private var activeManager: BooruManager? { if let selectedID = selectedTabID, let activeTab = tabs.first(where: { $0.id == selectedID }) { return activeTab.manager } return nil } var body: some View { VStack(spacing: 0) { #if !os(macOS) ScrollView(.horizontal, showsIndicators: false) { HStack { ForEach(tabs) { tab in PostGridTabButtonView( title: tab.manager.searchText.isEmpty ? "New Tab" : tab.manager.searchText, isSelected: tab.id == selectedTabID, onSelect: { selectedTabID = tab.id }, onClose: { if tabs.count > 1 { tabs.removeAll { $0.id == tab.id } if selectedTabID == tab.id { selectedTabID = tabs.first!.id } } } ) } Button( action: { let newTab = PostGridTab(manager: BooruManager()) tabs.append(newTab) selectedTabID = newTab.id Task { await newTab.manager.fetchPosts(page: 1, tags: [], replace: true) } } ) { Image(systemName: "plus") } } .padding(.horizontal) } .background(Color(.systemGray6)) HStack { TextField( "Tags", text: $searchText ) { if let manager = activeManager { manager.searchText = searchText Task { manager.performSearch(settings: settings) } } } .textFieldStyle(PlainTextFieldStyle()) .padding(.vertical, 8) .padding(.horizontal, 12) .background(Color(.systemGray5)) .clipShape(RoundedRectangle(cornerRadius: 9)) if !searchText.isEmpty { Button(action: { searchText = "" if let manager = activeManager { manager.searchText = "" Task { manager.performSearch(settings: settings) } } }) { Image(systemName: "xmark.circle.fill") .foregroundColor(.secondary) } .buttonStyle(PlainButtonStyle()) } } .padding(.horizontal) .padding(.vertical, 12) .background(Color(.systemGray6)) #endif ZStack { PostGridTabSwitcherContentView( selectedTabID: $selectedTabID, selectedPost: $selectedPost, selectedTab: $selectedTab, tabs: $tabs ) } } .onChange(of: selectedTabID) { _, newValue in if let selectedID = newValue, let activeTab = tabs.first(where: { $0.id == selectedID }) { searchText = activeTab.manager.searchText } } } }