Skip to content

Commit d4c0199

Browse files
authored
refactor: expose member mention filtering (#4179)
Refactor persistence snapshot reads and mention filtering
1 parent c969014 commit d4c0199

2 files changed

Lines changed: 42 additions & 31 deletions

File tree

data/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/MetadataDAOImpl.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ class MetadataDAOImpl internal constructor(
5050
}
5151
}
5252

53-
override fun valueByKeyFlow(key: String): Flow<String?> =
53+
override fun valueByKeyFlow(
54+
key: String
55+
): Flow<String?> =
5456
metadataQueries.selectValueByKey(key)
5557
.asFlow()
5658
.mapToOneOrNull()

logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/MembersToMentionUseCase.kt

Lines changed: 39 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)