import SwiftUI struct ContactsScreen: View { @EnvironmentObject var navigation: NavigationStore @EnvironmentObject var clientsStore: ClientsStore @StateObject var rostersStore = RostersStore(clientsPublisher: ClientsStore.shared.$clients) // @State private var addPanelPresented = false // @State private var isErrorAlertPresented = false // @State private var errorAlertMessage = "" // @State private var isShowingLoader = false var body: some View { ZStack { // Background color Color.Material.Background.light .ignoresSafeArea() // Content VStack(spacing: 0) { // Header SharedNavigationBar( centerText: .init(text: L10n.Contacts.title), rightButton: .init( image: Image(systemName: "plus"), action: { withAnimation { navigation.flow = .main(.contacts(.add)) } // addPanelPresented = true } ) ) // Contacts list if !rostersStore.rosters.isEmpty { List { ForEach(rostersStore.rosters) { roster in ContactsScreenRow( roster: roster // isErrorAlertPresented: $isErrorAlertPresented, // errorAlertMessage: $errorAlertMessage, // isShowingLoader: $isShowingLoader ) } } .listStyle(.plain) .background(Color.Material.Background.light) } else { Spacer() } // Tab bar SharedTabBar() } } // .task { // await fetchRosters() // } // .loadingIndicator(isShowingLoader) // .fullScreenCover(isPresented: $addPanelPresented) { // AddContactOrChannelScreen(isPresented: $addPanelPresented) // } // .alert(isPresented: $isErrorAlertPresented) { // Alert( // title: Text(L10n.Global.Error.title), // message: Text(errorAlertMessage), // dismissButton: .default(Text(L10n.Global.ok)) // ) // } } // private func fetchRosters() async { // let jids = clientsStore.clients // .filter { $0.state != .disabled } // .map { $0.credentials.bareJid } // // do { // try await withThrowingTaskGroup(of: [Roster].self) { group in // for jid in jids { // group.addTask { // try await Roster.fetchAll(for: jid) // } // } // // var allRosters: [Roster] = [] // for try await rosters in group { // allRosters.append(contentsOf: rosters) // } // self.rosters = allRosters.sorted { $0.contactBareJid < $1.contactBareJid } // } // } catch {} // } } private struct ContactsScreenRow: View { var roster: Roster // @State private var isShowingMenu = false // @State private var isDeleteAlertPresented = false // // @Binding var isErrorAlertPresented: Bool // @Binding var errorAlertMessage: String // @Binding var isShowingLoader: Bool var body: some View { SharedListRow( iconType: .charCircle(roster.name?.firstLetter ?? roster.contactBareJid.firstLetter), text: roster.contactBareJid ) // .onTapGesture { // store.dispatch(.chatsAction(.startChat(accountJid: roster.bareJid, participantJid: roster.contactBareJid))) // } // .onLongPressGesture { // isShowingMenu.toggle() // } // .swipeActions(edge: .trailing, allowsFullSwipe: false) { // Button { // isDeleteAlertPresented = true // } label: { // Label(L10n.Contacts.sendMessage, systemImage: "trash") // } // .tint(Color.red) // } // .contextMenu { // Button(L10n.Contacts.sendMessage, systemImage: "message") { // store.dispatch(.chatsAction(.startChat(accountJid: roster.bareJid, participantJid: roster.contactBareJid))) // } // Divider() // // Button(L10n.Contacts.editContact) { // print("Edit contact") // } // // Button(L10n.Contacts.selectContact) { // print("Select contact") // } // // Divider() // Button(L10n.Contacts.deleteContact, systemImage: "trash", role: .destructive) { // isDeleteAlertPresented = true // } // } // .actionSheet(isPresented: $isDeleteAlertPresented) { // ActionSheet( // title: Text(L10n.Contacts.Delete.title), // message: Text(L10n.Contacts.Delete.message), // buttons: [ // .destructive(Text(L10n.Contacts.Delete.deleteFromDevice)) { // store.dispatch(.rostersAction(.markRosterAsLocallyDeleted(ownerJID: roster.bareJid, contactJID: roster.contactBareJid))) // }, // .destructive(Text(L10n.Contacts.Delete.deleteCompletely)) { // isShowingLoader = true // store.dispatch(.rostersAction(.deleteRoster(ownerJID: roster.bareJid, contactJID: roster.contactBareJid))) // }, // .cancel(Text(L10n.Global.cancel)) // ] // ) // } // .onChange(of: store.state.rostersState.rosters) { _ in // endOfDeleting() // } // .onChange(of: store.state.rostersState.deleteRosterError) { _ in // endOfDeleting() // } } // private func endOfDeleting() { // if isShowingLoader { // isShowingLoader = false // if let error = store.state.rostersState.deleteRosterError { // errorAlertMessage = error // isErrorAlertPresented = true // } // } // } }