adding custom sorting method and all and works fine with search and all now

This commit is contained in:
talksik
2021-12-20 17:23:06 -08:00
parent f7b8126a26
commit 4c5f8e6985
2 changed files with 23 additions and 11 deletions
@@ -11,7 +11,7 @@ import SwiftUI
class ContactsViewModel : ObservableObject {
@Published var showPermissionAlert = false
@Published var contacts: [ContactsViewModelContact] = []
@Published var contacts: [String: ContactsViewModelContact] = [:]
private var firestoreService = FirestoreService()
@@ -63,11 +63,11 @@ class ContactsViewModel : ObservableObject {
var formattedNumber = cnPhoneNumber?.digits.suffix(10)
// only show contacts if they have a phone number
if formattedNumber != nil {
if formattedNumber != nil && formattedNumber?.count ?? 0 > 9 {
formattedNumber = "+1" + formattedNumber! // adding country code
let contactNumber = String(formattedNumber!)
var contactVm = ContactsViewModelContact(cnName: contactDisplayName, cnPhoneNumber: contactNumber)
var contactVm = ContactsViewModelContact(cnName: contactDisplayName, cnPhoneNumber: contactNumber, sortingProp: contactDisplayName)
// check if the contact is an existing user by phone number
self.firestoreService.getUserByPhoneNumber(phoneNumber: contactNumber) {[weak self] returnedUser in
@@ -75,13 +75,15 @@ class ContactsViewModel : ObservableObject {
if returnedUser == nil {
// do nothing, keep contactsVm object user property nil
contactVm.isExisting = false
contactVm.sortingProp = contactVm.cnName
} else {
// adding user details if this contact is existing user
contactVm.sortingProp = "!" // adding for sorting purposes
contactVm.user = returnedUser
contactVm.isExisting = true
}
self?.contacts.append(contactVm)
self?.contacts[contactVm.sortingProp] = contactVm
}
}
}
@@ -100,4 +102,5 @@ struct ContactsViewModelContact : Identifiable {
var cnName: String
var cnPhoneNumber: String
var isExisting: Bool = false
var sortingProp: String
}
@@ -16,15 +16,19 @@ struct FindFriendsView: View {
@StateObject var contactsVM = ContactsViewModel()
@State private var searchQuery: String = ""
var body: some View {
NavigationView {
// TODO: add search bar + have secondary sort
List {
ForEach(contactsVM.contacts.sorted { $0.isExisting && !$1.isExisting }) { contact in
ListContactRow(contact: contact)
ForEach(searchItems, id: \.self) { key in
if let currContact = self.contactsVM.contacts[key] {
ListContactRow(contact: currContact)
}
}
}
.searchable(text: self.$searchQuery)
.navigationTitle("Find Friends")
.navigationBarItems(trailing: Button(action: {
dismiss()
@@ -32,10 +36,15 @@ struct FindFriendsView: View {
Text("Cancel")
}))
}
.onAppear {
// organize contacts
// sort by has account and then show all other contacts
}
var searchItems: [String] {
let keys = (Array(self.contactsVM.contacts.keys) as [String]).sorted()
if self.searchQuery.isEmpty {
return keys
} else {
return keys.filter { $0.contains(self.searchQuery) }
}
}
}