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 {
|
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) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user