From 4c5f8e6985cac12580c4ac2fa74753d71d4d1dd6 Mon Sep 17 00:00:00 2001 From: talksik Date: Mon, 20 Dec 2021 17:23:06 -0800 Subject: [PATCH] adding custom sorting method and all and works fine with search and all now --- .../Views/Contacts/ContactsViewModel.swift | 11 +++++---- .../Views/Contacts/FindFriendsView.swift | 23 +++++++++++++------ 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/nirvana-ios/Views/Contacts/ContactsViewModel.swift b/nirvana-ios/Views/Contacts/ContactsViewModel.swift index 2ce7539..36eeebb 100644 --- a/nirvana-ios/Views/Contacts/ContactsViewModel.swift +++ b/nirvana-ios/Views/Contacts/ContactsViewModel.swift @@ -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 } diff --git a/nirvana-ios/Views/Contacts/FindFriendsView.swift b/nirvana-ios/Views/Contacts/FindFriendsView.swift index 6cc7b86..3693d7c 100644 --- a/nirvana-ios/Views/Contacts/FindFriendsView.swift +++ b/nirvana-ios/Views/Contacts/FindFriendsView.swift @@ -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) } } } }