ios: search members (#2593)

This commit is contained in:
Evgeny Poberezkin
2023-06-19 11:49:45 +01:00
committed by GitHub
parent 22f20a9c5f
commit ec7bff9205
3 changed files with 48 additions and 5 deletions
+2 -2
View File
@@ -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
@@ -29,6 +29,8 @@ struct AddGroupMembersViewCommon: View {
@State private var selectedContacts = Set<Int64>()
@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<String>, focussed: FocusState<Bool>.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)
@@ -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 {