another.im-ios/ConversationsClassic/View/Main/Contacts/ContactsScreen.swift
2024-08-11 23:55:45 +02:00

162 lines
5.7 KiB
Swift

import SwiftUI
struct ContactsScreen: View {
@Environment(\.router) var router
@EnvironmentObject var clientsStore: ClientsStore
@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: {
router.showScreen(.fullScreenCover) { _ in
AddContactOrChannelScreen()
}
}
)
)
// Contacts list
if !rosters.isEmpty {
List {
ForEach(rosters) { roster in
ContactsScreenRow(
roster: roster
)
}
}
.listStyle(.plain)
.background(Color.Material.Background.light)
} else {
Spacer()
}
}
}
.task {
rosters = await clientsStore.actualRosters
}
// .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
// }
// }
// }
}