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 { class ContactsViewModel : ObservableObject {
@Published var showPermissionAlert = false @Published var showPermissionAlert = false
@Published var contacts: [ContactsViewModelContact] = [] @Published var contacts: [String: ContactsViewModelContact] = [:]
private var firestoreService = FirestoreService() private var firestoreService = FirestoreService()
@@ -63,11 +63,11 @@ class ContactsViewModel : ObservableObject {
var formattedNumber = cnPhoneNumber?.digits.suffix(10) var formattedNumber = cnPhoneNumber?.digits.suffix(10)
// only show contacts if they have a phone number // 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 formattedNumber = "+1" + formattedNumber! // adding country code
let contactNumber = String(formattedNumber!) 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 // check if the contact is an existing user by phone number
self.firestoreService.getUserByPhoneNumber(phoneNumber: contactNumber) {[weak self] returnedUser in self.firestoreService.getUserByPhoneNumber(phoneNumber: contactNumber) {[weak self] returnedUser in
@@ -75,13 +75,15 @@ class ContactsViewModel : ObservableObject {
if returnedUser == nil { if returnedUser == nil {
// do nothing, keep contactsVm object user property nil // do nothing, keep contactsVm object user property nil
contactVm.isExisting = false contactVm.isExisting = false
contactVm.sortingProp = contactVm.cnName
} else { } else {
// adding user details if this contact is existing user // adding user details if this contact is existing user
contactVm.sortingProp = "!" // adding for sorting purposes
contactVm.user = returnedUser contactVm.user = returnedUser
contactVm.isExisting = true contactVm.isExisting = true
} }
self?.contacts.append(contactVm) self?.contacts[contactVm.sortingProp] = contactVm
} }
} }
} }
@@ -100,4 +102,5 @@ struct ContactsViewModelContact : Identifiable {
var cnName: String var cnName: String
var cnPhoneNumber: String var cnPhoneNumber: String
var isExisting: Bool = false var isExisting: Bool = false
var sortingProp: String
} }
@@ -16,15 +16,19 @@ struct FindFriendsView: View {
@StateObject var contactsVM = ContactsViewModel() @StateObject var contactsVM = ContactsViewModel()
@State private var searchQuery: String = "" @State private var searchQuery: String = ""
var body: some View { var body: some View {
NavigationView { NavigationView {
// TODO: add search bar + have secondary sort // TODO: add search bar + have secondary sort
List { List {
ForEach(contactsVM.contacts.sorted { $0.isExisting && !$1.isExisting }) { contact in ForEach(searchItems, id: \.self) { key in
ListContactRow(contact: contact) if let currContact = self.contactsVM.contacts[key] {
ListContactRow(contact: currContact)
}
} }
} }
.searchable(text: self.$searchQuery)
.navigationTitle("Find Friends") .navigationTitle("Find Friends")
.navigationBarItems(trailing: Button(action: { .navigationBarItems(trailing: Button(action: {
dismiss() dismiss()
@@ -32,10 +36,15 @@ struct FindFriendsView: View {
Text("Cancel") 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) }
} }
} }
} }