conversations-classic-ios/ConversationsClassic/View/Contacts/ContactsScreen.swift
2024-08-11 13:39:17 +02:00

174 lines
6.2 KiB
Swift

import SwiftUI
struct ContactsScreen: View {
@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
@State private var rosters: [Roster] = []
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: {
// addPanelPresented = true
}
)
)
// Contacts list
if !rosters.isEmpty {
List {
ForEach(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
// }
// }
// }
}