@@ -55,42 +55,51 @@ public class MembersToMentionUseCase internal constructor(
5555 public suspend operator fun invoke (conversationId : ConversationId , searchQuery : String ): List <MemberDetails > =
5656 withContext(dispatcher.io) {
5757 val conversationMembers = observeConversationMembers(conversationId).first()
58+ filterConversationMembers(conversationMembers, searchQuery)
59+ }
5860
59- // TODO apply normalization techniques that are used for other searches to the name (e.g. ö -> oe)
60-
61- val usersToSearch = conversationMembers.filter {
62- it.user.id != selfUserId
63- }
64- if (searchQuery.isEmpty())
65- return @withContext usersToSearch
61+ /* *
62+ * Search the provided conversation member snapshot without collecting the members flow.
63+ */
64+ public fun filterConversationMembers (
65+ conversationMembers : List <MemberDetails >,
66+ searchQuery : String
67+ ): List <MemberDetails > {
68+ // TODO apply normalization techniques that are used for other searches to the name (e.g. ö -> oe)
6669
67- if (searchQuery.first().isWhitespace())
68- return @withContext listOf ()
70+ val usersToSearch = conversationMembers.filter {
71+ it.user.id != selfUserId
72+ }
73+ if (searchQuery.isEmpty())
74+ return usersToSearch
6975
70- val rules: List < (MemberDetails ) -> Boolean > = listOf (
71- { it.user.name?.startsWith(searchQuery, true ) == true },
72- {
73- it.user.name?.let { name ->
74- nameTokens(name).firstOrNull { nameToken -> nameToken.startsWith(searchQuery, true ) }
75- } != null
76- },
77- { it.user.handle?.startsWith(searchQuery, true ) == true },
78- { it.user.name?.contains(searchQuery, true ) == true },
79- { it.user.handle?.contains(searchQuery, true ) == true }
80- )
76+ if (searchQuery.first().isWhitespace())
77+ return listOf ()
8178
82- var foundUsers: Set <MemberDetails > = emptySet()
83- val usersToMention = mutableListOf<MemberDetails >()
84- rules.forEach { rule ->
85- val matches = usersToSearch.filter { rule(it) }
86- .filter { ! foundUsers.contains(it) }
87- .sortedBy { it.user.name }
88- foundUsers = foundUsers.union(matches)
89- usersToMention + = matches
90- }
79+ val rules: List < (MemberDetails ) -> Boolean > = listOf (
80+ { it.user.name?.startsWith(searchQuery, true ) == true },
81+ {
82+ it.user.name?.let { name ->
83+ nameTokens(name).firstOrNull { nameToken -> nameToken.startsWith(searchQuery, true ) }
84+ } != null
85+ },
86+ { it.user.handle?.startsWith(searchQuery, true ) == true },
87+ { it.user.name?.contains(searchQuery, true ) == true },
88+ { it.user.handle?.contains(searchQuery, true ) == true }
89+ )
9190
92- return @withContext usersToMention
91+ var foundUsers: Set <MemberDetails > = emptySet()
92+ val usersToMention = mutableListOf<MemberDetails >()
93+ rules.forEach { rule ->
94+ val matches = usersToSearch.filter { rule(it) }
95+ .filter { ! foundUsers.contains(it) }
96+ .sortedBy { it.user.name }
97+ foundUsers = foundUsers.union(matches)
98+ usersToMention + = matches
9399 }
100+
101+ return usersToMention
102+ }
94103}
95104
96105/* *
0 commit comments