From 388bdc70837d7e87fb0beb57ec934c97a7526add Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> Date: Tue, 27 Jun 2023 10:28:47 +0100 Subject: [PATCH] ios: improve chat filter, "No filtered chats" note (#2619) * ios: improve chat filter, "No filtered chats" note * refactor filter --- .../Shared/Views/ChatList/ChatListView.swift | 62 +++++++++++++------ 1 file changed, 42 insertions(+), 20 deletions(-) diff --git a/apps/ios/Shared/Views/ChatList/ChatListView.swift b/apps/ios/Shared/Views/ChatList/ChatListView.swift index 90ff8433ea..6de638257c 100644 --- a/apps/ios/Shared/Views/ChatList/ChatListView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatListView.swift @@ -117,18 +117,24 @@ struct ChatListView: View { } } - private var chatList: some View { - List { - ForEach(filteredChats(), id: \.viewId) { chat in - ChatListNavLink(chat: chat) - .padding(.trailing, -16) - .disabled(chatModel.chatRunning != true) + @ViewBuilder private var chatList: some View { + let cs = filteredChats() + ZStack { + List { + ForEach(cs, id: \.viewId) { chat in + ChatListNavLink(chat: chat) + .padding(.trailing, -16) + .disabled(chatModel.chatRunning != true) + } } - } - .onChange(of: chatModel.chatId) { _ in - if chatModel.chatId == nil, let chatId = chatModel.chatToTop { - chatModel.chatToTop = nil - chatModel.popChat(chatId) + .onChange(of: chatModel.chatId) { _ in + if chatModel.chatId == nil, let chatId = chatModel.chatToTop { + chatModel.chatToTop = nil + chatModel.popChat(chatId) + } + } + if cs.isEmpty && !chatModel.chats.isEmpty { + Text("No filtered chats").foregroundColor(.secondary) } } } @@ -195,18 +201,34 @@ struct ChatListView: View { return s == "" && !showUnreadAndFavorites ? chatModel.chats : chatModel.chats.filter { chat in - let contains = s == "" - ? ((chat.chatInfo.chatSettings?.favorite ?? false) || chat.chatStats.unreadCount > 0 || chat.chatStats.unreadChat) - : chat.chatInfo.chatViewName.localizedLowercase.contains(s) - switch chat.chatInfo { + let cInfo = chat.chatInfo + switch cInfo { case let .direct(contact): - return contains - || contact.profile.displayName.localizedLowercase.contains(s) - || contact.fullName.localizedLowercase.contains(s) - case .contactConnection: return false - default: return contains + return s == "" + ? filtered(chat) + : (viewNameContains(cInfo, s) || + contact.profile.displayName.localizedLowercase.contains(s) || + contact.fullName.localizedLowercase.contains(s)) + case let .group(gInfo): + return s == "" + ? (filtered(chat) || gInfo.membership.memberStatus == .memInvited) + : viewNameContains(cInfo, s) + case .contactRequest: + return s == "" || viewNameContains(cInfo, s) + case let .contactConnection(conn): + return s != "" && conn.localAlias.localizedLowercase.contains(s) + case .invalidJSON: + return false } } + + func filtered(_ chat: Chat) -> Bool { + (chat.chatInfo.chatSettings?.favorite ?? false) || chat.chatStats.unreadCount > 0 || chat.chatStats.unreadChat + } + + func viewNameContains(_ cInfo: ChatInfo, _ s: String) -> Bool { + cInfo.chatViewName.localizedLowercase.contains(s) + } } }