adding custom sorting method and all and works fine with search and all now
This commit is contained in:
@@ -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) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user