From ec7bff9205faf919b359ad895334e8c3fffd46be Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> Date: Mon, 19 Jun 2023 11:49:45 +0100 Subject: [PATCH] ios: search members (#2593) --- apps/ios/Shared/Views/Chat/ChatView.swift | 4 +- .../Chat/Group/AddGroupMembersView.swift | 38 ++++++++++++++++++- .../Views/Chat/Group/GroupChatInfoView.swift | 11 +++++- 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index 8a43434289..6e05e645ed 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -193,7 +193,7 @@ struct ChatView: View { .focused($searchFocussed) .foregroundColor(.primary) .frame(maxWidth: .infinity) - + Button { searchText = "" } label: { @@ -204,7 +204,7 @@ struct ChatView: View { .foregroundColor(.secondary) .background(Color(.secondarySystemBackground)) .cornerRadius(10.0) - + Button ("Cancel") { searchText = "" searchMode = false diff --git a/apps/ios/Shared/Views/Chat/Group/AddGroupMembersView.swift b/apps/ios/Shared/Views/Chat/Group/AddGroupMembersView.swift index f52b7c327c..123d93714d 100644 --- a/apps/ios/Shared/Views/Chat/Group/AddGroupMembersView.swift +++ b/apps/ios/Shared/Views/Chat/Group/AddGroupMembersView.swift @@ -29,6 +29,8 @@ struct AddGroupMembersViewCommon: View { @State private var selectedContacts = Set() @State private var selectedRole: GroupMemberRole = .member @State private var alert: AddGroupMembersAlert? + @State private var searchText: String = "" + @FocusState private var searchFocussed private enum AddGroupMembersAlert: Identifiable { case prohibitedToInviteIncognito @@ -85,7 +87,7 @@ struct AddGroupMembersViewCommon: View { if showFooterCounter { if (count >= 1) { HStack { - Button { selectedContacts.removeAll() } label: { Text("Clear") } + Button { selectedContacts.removeAll() } label: { Text("Clear").font(.caption) } Spacer() Text("\(count) contact(s) selected") } @@ -97,7 +99,11 @@ struct AddGroupMembersViewCommon: View { } Section { - ForEach(membersToAdd) { contact in + searchFieldView(text: $searchText, focussed: $searchFocussed) + .padding(.leading, 2) + let s = searchText.trimmingCharacters(in: .whitespaces).localizedLowercase + let members = s == "" ? membersToAdd : membersToAdd.filter { $0.chatViewName.localizedLowercase.contains(s) } + ForEach(members) { contact in contactCheckView(contact) } } @@ -116,6 +122,9 @@ struct AddGroupMembersViewCommon: View { return Alert(title: Text(title), message: Text(error)) } } + .onChange(of: selectedContacts) { _ in + searchFocussed = false + } } private func inviteMembersButton() -> some View { @@ -199,6 +208,31 @@ struct AddGroupMembersViewCommon: View { } } +func searchFieldView(text: Binding, focussed: FocusState.Binding) -> some View { + HStack { + Image(systemName: "magnifyingglass") + .resizable() + .scaledToFit() + .frame(height: 20) + .padding(.trailing, 10) + TextField("Search", text: text) + .focused(focussed) + .foregroundColor(.primary) + .frame(maxWidth: .infinity) + Image(systemName: "xmark.circle.fill") + .resizable() + .scaledToFit() + .opacity(text.wrappedValue == "" ? 0 : 1) + .frame(height: 20) + .onTapGesture { + text.wrappedValue = "" + focussed.wrappedValue = false + } + } + .foregroundColor(.secondary) + .frame(height: 36) +} + struct AddGroupMembersView_Previews: PreviewProvider { static var previews: some View { AddGroupMembersView(chat: Chat(chatInfo: ChatInfo.sampleData.group), groupInfo: GroupInfo.sampleData) diff --git a/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift b/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift index 9da75d3e2a..a9e7e8fed9 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift @@ -22,6 +22,8 @@ struct GroupChatInfoView: View { @State private var connectionStats: ConnectionStats? @State private var connectionCode: String? @AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false + @State private var searchText: String = "" + @FocusState private var searchFocussed enum GroupChatInfoViewAlert: Identifiable { case deleteGroupAlert @@ -67,8 +69,14 @@ struct GroupChatInfoView: View { addMembersButton() } } + if members.count > 8 { + searchFieldView(text: $searchText, focussed: $searchFocussed) + .padding(.leading, 8) + } + let s = searchText.trimmingCharacters(in: .whitespaces).localizedLowercase + let filteredMembers = s == "" ? members : members.filter { $0.chatViewName.localizedLowercase.contains(s) } memberView(groupInfo.membership, user: true) - ForEach(members) { member in + ForEach(filteredMembers) { member in ZStack { NavigationLink { memberInfoView(member.groupMemberId) @@ -144,6 +152,7 @@ struct GroupChatInfoView: View { NavigationLink { AddGroupMembersView(chat: chat, groupInfo: groupInfo) .onAppear { + searchFocussed = false Task { let groupMembers = await apiListMembers(groupInfo.groupId) await MainActor.run {