Rename isFetchingSearchResults to showSearchLoader

This commit is contained in:
ganfra 2024-01-05 15:54:50 +01:00
parent 2f49de1fbb
commit c78ce88c53
14 changed files with 50 additions and 50 deletions

View file

@ -50,7 +50,7 @@ import kotlinx.collections.immutable.ImmutableList
fun SearchUserBar( fun SearchUserBar(
query: String, query: String,
state: SearchBarResultState<ImmutableList<UserSearchResult>>, state: SearchBarResultState<ImmutableList<UserSearchResult>>,
isSearching: Boolean, showLoader: Boolean,
selectedUsers: ImmutableList<MatrixUser>, selectedUsers: ImmutableList<MatrixUser>,
active: Boolean, active: Boolean,
isMultiSelectionEnabled: Boolean, isMultiSelectionEnabled: Boolean,
@ -102,7 +102,7 @@ fun SearchUserBar(
} }
}, },
contentSuffix = { contentSuffix = {
if (isSearching) { if (showLoader) {
AsyncLoading() AsyncLoading()
} }
}, },

View file

@ -48,7 +48,7 @@ fun UserListView(
state = state.searchResults, state = state.searchResults,
selectedUsers = state.selectedUsers, selectedUsers = state.selectedUsers,
active = state.isSearchActive, active = state.isSearchActive,
isSearching = state.isFetchingSearchResults, showLoader = state.showSearchLoader,
isMultiSelectionEnabled = state.isMultiSelectionEnabled, isMultiSelectionEnabled = state.isMultiSelectionEnabled,
showBackButton = showBackButton, showBackButton = showBackButton,
onActiveChanged = { state.eventSink(UserListEvents.OnSearchActiveChanged(it)) }, onActiveChanged = { state.eventSink(UserListEvents.OnSearchActiveChanged(it)) },

View file

@ -61,16 +61,16 @@ class DefaultUserListPresenter @AssistedInject constructor(
var searchResults: SearchBarResultState<ImmutableList<UserSearchResult>> by remember { var searchResults: SearchBarResultState<ImmutableList<UserSearchResult>> by remember {
mutableStateOf(SearchBarResultState.Initial()) mutableStateOf(SearchBarResultState.Initial())
} }
var isFetchingSearchResults by remember { mutableStateOf(false) } var showSearchLoader by remember { mutableStateOf(false) }
LaunchedEffect(searchQuery) { LaunchedEffect(searchQuery) {
searchResults = SearchBarResultState.Initial() searchResults = SearchBarResultState.Initial()
isFetchingSearchResults = false showSearchLoader = false
userRepository.search(searchQuery).onEach { state -> userRepository.search(searchQuery).onEach { state ->
isFetchingSearchResults = state.isFetchingSearchResults showSearchLoader = state.isSearching
searchResults = when { searchResults = when {
state.results.isEmpty() && state.isFetchingSearchResults -> SearchBarResultState.Initial() state.results.isEmpty() && state.isSearching -> SearchBarResultState.Initial()
state.results.isEmpty() && !state.isFetchingSearchResults -> SearchBarResultState.NoResultsFound() state.results.isEmpty() && !state.isSearching -> SearchBarResultState.NoResultsFound()
else -> SearchBarResultState.Results(state.results.toImmutableList()) else -> SearchBarResultState.Results(state.results.toImmutableList())
} }
}.launchIn(this) }.launchIn(this)
@ -81,7 +81,7 @@ class DefaultUserListPresenter @AssistedInject constructor(
searchResults = searchResults, searchResults = searchResults,
selectedUsers = selectedUsers.toImmutableList(), selectedUsers = selectedUsers.toImmutableList(),
isSearchActive = isSearchActive, isSearchActive = isSearchActive,
isFetchingSearchResults = isFetchingSearchResults, showSearchLoader = showSearchLoader,
selectionMode = args.selectionMode, selectionMode = args.selectionMode,
eventSink = { event -> eventSink = { event ->
when (event) { when (event) {

View file

@ -24,7 +24,7 @@ import kotlinx.collections.immutable.ImmutableList
data class UserListState( data class UserListState(
val searchQuery: String, val searchQuery: String,
val searchResults: SearchBarResultState<ImmutableList<UserSearchResult>>, val searchResults: SearchBarResultState<ImmutableList<UserSearchResult>>,
val isFetchingSearchResults: Boolean, val showSearchLoader: Boolean,
val selectedUsers: ImmutableList<MatrixUser>, val selectedUsers: ImmutableList<MatrixUser>,
val isSearchActive: Boolean, val isSearchActive: Boolean,
val selectionMode: SelectionMode, val selectionMode: SelectionMode,

View file

@ -63,7 +63,7 @@ fun aUserListState() = UserListState(
searchResults = SearchBarResultState.Initial(), searchResults = SearchBarResultState.Initial(),
selectedUsers = persistentListOf(), selectedUsers = persistentListOf(),
selectionMode = SelectionMode.Single, selectionMode = SelectionMode.Single,
isFetchingSearchResults = false, showSearchLoader = false,
eventSink = {} eventSink = {}
) )

View file

@ -139,7 +139,7 @@ class DefaultUserListPresenterTests {
// When the user repository emits a result, it's copied to the state // When the user repository emits a result, it's copied to the state
val result = UserSearchResultState( val result = UserSearchResultState(
results = listOf(UserSearchResult(aMatrixUser())), results = listOf(UserSearchResult(aMatrixUser())),
isFetchingSearchResults = false, isSearching = false,
) )
userRepository.emitState(result) userRepository.emitState(result)
awaitItem().also { state -> awaitItem().also { state ->
@ -148,12 +148,12 @@ class DefaultUserListPresenterTests {
persistentListOf(UserSearchResult(aMatrixUser())) persistentListOf(UserSearchResult(aMatrixUser()))
) )
) )
assertThat(state.isFetchingSearchResults).isFalse() assertThat(state.showSearchLoader).isFalse()
} }
// When the user repository emits another result, it replaces the previous value // When the user repository emits another result, it replaces the previous value
val newResult = UserSearchResultState( val newResult = UserSearchResultState(
results = aMatrixUserList().map { UserSearchResult(it) }, results = aMatrixUserList().map { UserSearchResult(it) },
isFetchingSearchResults = false, isSearching = false,
) )
userRepository.emitState(newResult) userRepository.emitState(newResult)
awaitItem().also { state -> awaitItem().also { state ->
@ -162,7 +162,7 @@ class DefaultUserListPresenterTests {
aMatrixUserList().map { UserSearchResult(it) } aMatrixUserList().map { UserSearchResult(it) }
) )
) )
assertThat(state.isFetchingSearchResults).isFalse() assertThat(state.showSearchLoader).isFalse()
} }
} }
} }
@ -189,7 +189,7 @@ class DefaultUserListPresenterTests {
skipItems(2) skipItems(2)
// When the results list is empty, the state is set to NoResults // When the results list is empty, the state is set to NoResults
userRepository.emitState(UserSearchResultState(results = emptyList(), isFetchingSearchResults = false)) userRepository.emitState(UserSearchResultState(results = emptyList(), isSearching = false))
assertThat(awaitItem().searchResults).isInstanceOf(SearchBarResultState.NoResultsFound::class.java) assertThat(awaitItem().searchResults).isInstanceOf(SearchBarResultState.NoResultsFound::class.java)
} }
} }

View file

@ -55,7 +55,7 @@ class RoomInviteMembersPresenter @Inject constructor(
val searchResults = remember { mutableStateOf<SearchBarResultState<ImmutableList<InvitableUser>>>(SearchBarResultState.Initial()) } val searchResults = remember { mutableStateOf<SearchBarResultState<ImmutableList<InvitableUser>>>(SearchBarResultState.Initial()) }
var searchQuery by rememberSaveable { mutableStateOf("") } var searchQuery by rememberSaveable { mutableStateOf("") }
var searchActive by rememberSaveable { mutableStateOf(false) } var searchActive by rememberSaveable { mutableStateOf(false) }
var isFetchingSearchResults = rememberSaveable { mutableStateOf(false) } var showSearchLoader = rememberSaveable { mutableStateOf(false) }
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
fetchMembers(roomMembers) fetchMembers(roomMembers)
@ -65,7 +65,7 @@ class RoomInviteMembersPresenter @Inject constructor(
searchResults = searchResults, searchResults = searchResults,
roomMembers = roomMembers, roomMembers = roomMembers,
selectedUsers = selectedUsers, selectedUsers = selectedUsers,
isFetchingSearchResults = isFetchingSearchResults, showSearchLoader = showSearchLoader,
searchQuery = searchQuery searchQuery = searchQuery
) )
} }
@ -76,7 +76,7 @@ class RoomInviteMembersPresenter @Inject constructor(
searchQuery = searchQuery, searchQuery = searchQuery,
isSearchActive = searchActive, isSearchActive = searchActive,
searchResults = searchResults.value, searchResults = searchResults.value,
isFetchingSearchResults = isFetchingSearchResults.value, showSearchLoader = showSearchLoader.value,
eventSink = { eventSink = {
when (it) { when (it) {
is RoomInviteMembersEvents.OnSearchActiveChanged -> { is RoomInviteMembersEvents.OnSearchActiveChanged -> {
@ -126,18 +126,18 @@ class RoomInviteMembersPresenter @Inject constructor(
searchResults: MutableState<SearchBarResultState<ImmutableList<InvitableUser>>>, searchResults: MutableState<SearchBarResultState<ImmutableList<InvitableUser>>>,
roomMembers: MutableState<AsyncData<ImmutableList<RoomMember>>>, roomMembers: MutableState<AsyncData<ImmutableList<RoomMember>>>,
selectedUsers: MutableState<ImmutableList<MatrixUser>>, selectedUsers: MutableState<ImmutableList<MatrixUser>>,
isFetchingSearchResults: MutableState<Boolean>, showSearchLoader: MutableState<Boolean>,
searchQuery: String, searchQuery: String,
) = withContext(coroutineDispatchers.io) { ) = withContext(coroutineDispatchers.io) {
searchResults.value = SearchBarResultState.Initial() searchResults.value = SearchBarResultState.Initial()
isFetchingSearchResults.value = false showSearchLoader.value = false
val joinedMembers = roomMembers.value.dataOrNull().orEmpty() val joinedMembers = roomMembers.value.dataOrNull().orEmpty()
userRepository.search(searchQuery).onEach { state -> userRepository.search(searchQuery).onEach { state ->
isFetchingSearchResults.value = state.isFetchingSearchResults showSearchLoader.value = state.isSearching
searchResults.value = when { searchResults.value = when {
state.results.isEmpty() && state.isFetchingSearchResults -> SearchBarResultState.Initial() state.results.isEmpty() && state.isSearching -> SearchBarResultState.Initial()
state.results.isEmpty() && !state.isFetchingSearchResults -> SearchBarResultState.NoResultsFound() state.results.isEmpty() && !state.isSearching -> SearchBarResultState.NoResultsFound()
else -> SearchBarResultState.Results(state.results.map { result -> else -> SearchBarResultState.Results(state.results.map { result ->
val existingMembership = joinedMembers.firstOrNull { j -> j.userId == result.matrixUser.userId }?.membership val existingMembership = joinedMembers.firstOrNull { j -> j.userId == result.matrixUser.userId }?.membership
val isJoined = existingMembership == RoomMembershipState.JOIN val isJoined = existingMembership == RoomMembershipState.JOIN

View file

@ -23,7 +23,7 @@ import kotlinx.collections.immutable.ImmutableList
data class RoomInviteMembersState( data class RoomInviteMembersState(
val canInvite: Boolean, val canInvite: Boolean,
val searchQuery: String, val searchQuery: String,
val isFetchingSearchResults: Boolean, val showSearchLoader: Boolean,
val searchResults: SearchBarResultState<ImmutableList<InvitableUser>>, val searchResults: SearchBarResultState<ImmutableList<InvitableUser>>,
val selectedUsers: ImmutableList<MatrixUser>, val selectedUsers: ImmutableList<MatrixUser>,
val isSearchActive: Boolean, val isSearchActive: Boolean,

View file

@ -73,7 +73,7 @@ internal class RoomInviteMembersStateProvider : PreviewParameterProvider<RoomInv
InvitableUser(aMatrixUser("@alice:server.org"), isUnresolved = true), InvitableUser(aMatrixUser("@alice:server.org"), isUnresolved = true),
) )
), ),
isFetchingSearchResults = true, showSearchLoader = true,
), ),
) )
} }
@ -84,7 +84,7 @@ private fun aRoomInviteMembersState(
searchResults: SearchBarResultState<ImmutableList<InvitableUser>> = SearchBarResultState.Initial(), searchResults: SearchBarResultState<ImmutableList<InvitableUser>> = SearchBarResultState.Initial(),
selectedUsers: ImmutableList<MatrixUser> = persistentListOf(), selectedUsers: ImmutableList<MatrixUser> = persistentListOf(),
isSearchActive: Boolean = false, isSearchActive: Boolean = false,
isFetchingSearchResults: Boolean = false, showSearchLoader: Boolean = false,
): RoomInviteMembersState { ): RoomInviteMembersState {
return RoomInviteMembersState( return RoomInviteMembersState(
canInvite = canInvite, canInvite = canInvite,
@ -92,7 +92,7 @@ private fun aRoomInviteMembersState(
searchResults = searchResults, searchResults = searchResults,
selectedUsers = selectedUsers, selectedUsers = selectedUsers,
isSearchActive = isSearchActive, isSearchActive = isSearchActive,
isFetchingSearchResults = isFetchingSearchResults, showSearchLoader = showSearchLoader,
eventSink = {}, eventSink = {},
) )
} }

View file

@ -87,7 +87,7 @@ fun RoomInviteMembersView(
RoomInviteMembersSearchBar( RoomInviteMembersSearchBar(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
query = state.searchQuery, query = state.searchQuery,
isSearching = state.isFetchingSearchResults, showLoader = state.showSearchLoader,
selectedUsers = state.selectedUsers, selectedUsers = state.selectedUsers,
state = state.searchResults, state = state.searchResults,
active = state.isSearchActive, active = state.isSearchActive,
@ -141,7 +141,7 @@ private fun RoomInviteMembersTopBar(
private fun RoomInviteMembersSearchBar( private fun RoomInviteMembersSearchBar(
query: String, query: String,
state: SearchBarResultState<ImmutableList<InvitableUser>>, state: SearchBarResultState<ImmutableList<InvitableUser>>,
isSearching: Boolean, showLoader: Boolean,
selectedUsers: ImmutableList<MatrixUser>, selectedUsers: ImmutableList<MatrixUser>,
active: Boolean, active: Boolean,
onActiveChanged: (Boolean) -> Unit, onActiveChanged: (Boolean) -> Unit,
@ -171,7 +171,7 @@ private fun RoomInviteMembersSearchBar(
showBackButton = false, showBackButton = false,
resultState = state, resultState = state,
contentSuffix = { contentSuffix = {
if (isSearching) { if (showLoader) {
AsyncLoading() AsyncLoading()
} }
}, },

View file

@ -110,15 +110,15 @@ internal class RoomInviteMembersPresenterTest {
val initialState = awaitItem() val initialState = awaitItem()
initialState.eventSink(RoomInviteMembersEvents.UpdateSearchQuery("some query")) initialState.eventSink(RoomInviteMembersEvents.UpdateSearchQuery("some query"))
assertThat(repository.providedQuery).isEqualTo("some query") assertThat(repository.providedQuery).isEqualTo("some query")
repository.emitState(UserSearchResultState(results = emptyList(), isFetchingSearchResults = true)) repository.emitState(UserSearchResultState(results = emptyList(), isSearching = true))
consumeItemsUntilPredicate { it.isFetchingSearchResults }.last().also { state -> consumeItemsUntilPredicate { it.showSearchLoader }.last().also { state ->
assertThat(state.searchResults).isInstanceOf(SearchBarResultState.Initial::class.java) assertThat(state.searchResults).isInstanceOf(SearchBarResultState.Initial::class.java)
assertThat(state.isFetchingSearchResults).isTrue() assertThat(state.showSearchLoader).isTrue()
} }
repository.emitState(results = emptyList(), isFetchingSearchResults = false) repository.emitState(results = emptyList(), isSearching = false)
consumeItemsUntilPredicate { !it.isFetchingSearchResults }.last().also { state -> consumeItemsUntilPredicate { !it.showSearchLoader }.last().also { state ->
assertThat(state.searchResults).isInstanceOf(SearchBarResultState.NoResultsFound::class.java) assertThat(state.searchResults).isInstanceOf(SearchBarResultState.NoResultsFound::class.java)
assertThat(state.isFetchingSearchResults).isFalse() assertThat(state.showSearchLoader).isFalse()
} }
} }
} }
@ -387,21 +387,21 @@ internal class RoomInviteMembersPresenterTest {
private suspend fun FakeUserRepository.emitStateWithUsers( private suspend fun FakeUserRepository.emitStateWithUsers(
users: List<MatrixUser>, users: List<MatrixUser>,
isFetchingSearchResults: Boolean = false isSearching: Boolean = false
) { ) {
emitState( emitState(
results = users.map { UserSearchResult(it) }, results = users.map { UserSearchResult(it) },
isFetchingSearchResults = isFetchingSearchResults, isSearching = isSearching,
) )
} }
private suspend fun FakeUserRepository.emitState( private suspend fun FakeUserRepository.emitState(
results: List<UserSearchResult>, results: List<UserSearchResult>,
isFetchingSearchResults: Boolean = false isSearching: Boolean = false
) { ) {
val state = UserSearchResultState( val state = UserSearchResultState(
results = results, results = results,
isFetchingSearchResults = isFetchingSearchResults isSearching = isSearching
) )
emitState(state) emitState(state)
} }

View file

@ -25,5 +25,5 @@ data class UserSearchResult(
data class UserSearchResultState( data class UserSearchResultState(
val results: List<UserSearchResult>, val results: List<UserSearchResult>,
val isFetchingSearchResults: Boolean, val isSearching: Boolean,
) )

View file

@ -47,7 +47,7 @@ class MatrixUserRepository @Inject constructor(
null null
} }
if (shouldQueryProfile || shouldFetchSearchResults) { if (shouldQueryProfile || shouldFetchSearchResults) {
emit(UserSearchResultState(isFetchingSearchResults = shouldFetchSearchResults, results = listOfNotNull(fakeSearchResult))) emit(UserSearchResultState(isSearching = shouldFetchSearchResults, results = listOfNotNull(fakeSearchResult)))
} }
if (shouldFetchSearchResults) { if (shouldFetchSearchResults) {
val results = fetchSearchResults(query, shouldQueryProfile) val results = fetchSearchResults(query, shouldQueryProfile)
@ -73,7 +73,7 @@ class MatrixUserRepository @Inject constructor(
?: UserSearchResult(MatrixUser(UserId(query)), isUnresolved = true)) ?: UserSearchResult(MatrixUser(UserId(query)), isUnresolved = true))
} }
return UserSearchResultState(results = results, isFetchingSearchResults = false) return UserSearchResultState(results = results, isSearching = false)
} }
companion object { companion object {

View file

@ -55,11 +55,11 @@ internal class MatrixUserRepositoryTest {
result.test { result.test {
awaitItem().also { awaitItem().also {
assertThat(it.isFetchingSearchResults).isTrue() assertThat(it.isSearching).isTrue()
assertThat(it.results).isEmpty() assertThat(it.results).isEmpty()
} }
awaitItem().also { awaitItem().also {
assertThat(it.isFetchingSearchResults).isFalse() assertThat(it.isSearching).isFalse()
assertThat(it.results).isEmpty() assertThat(it.results).isEmpty()
} }
awaitComplete() awaitComplete()
@ -76,11 +76,11 @@ internal class MatrixUserRepositoryTest {
result.test { result.test {
awaitItem().also { awaitItem().also {
assertThat(it.isFetchingSearchResults).isTrue() assertThat(it.isSearching).isTrue()
assertThat(it.results).isEmpty() assertThat(it.results).isEmpty()
} }
awaitItem().also { awaitItem().also {
assertThat(it.isFetchingSearchResults).isFalse() assertThat(it.isSearching).isFalse()
assertThat(it.results).isEqualTo(aMatrixUserList().toUserSearchResults()) assertThat(it.results).isEqualTo(aMatrixUserList().toUserSearchResults())
} }
awaitComplete() awaitComplete()
@ -96,7 +96,7 @@ internal class MatrixUserRepositoryTest {
result.test { result.test {
awaitItem().also { awaitItem().also {
assertThat(it.isFetchingSearchResults).isTrue() assertThat(it.isSearching).isTrue()
assertThat(it.results).isEqualTo(listOf(placeholderResult())) assertThat(it.results).isEqualTo(listOf(placeholderResult()))
} }
cancelAndConsumeRemainingEvents() cancelAndConsumeRemainingEvents()
@ -112,7 +112,7 @@ internal class MatrixUserRepositoryTest {
result.test { result.test {
awaitItem().also { awaitItem().also {
assertThat(it.isFetchingSearchResults).isTrue() assertThat(it.isSearching).isTrue()
assertThat(it.results).isEmpty() assertThat(it.results).isEmpty()
} }
cancelAndConsumeRemainingEvents() cancelAndConsumeRemainingEvents()