Skip to content

Commit

Permalink
fix: conversation search not working [WPB-11473] (#3492)
Browse files Browse the repository at this point in the history
  • Loading branch information
saleniuk authored Oct 9, 2024
1 parent 98234f1 commit db79f55
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 38 deletions.
38 changes: 21 additions & 17 deletions app/src/main/kotlin/com/wire/android/ui/home/HomeStateHolder.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ import androidx.compose.material3.DrawerState
import androidx.compose.material3.DrawerValue
import androidx.compose.material3.rememberDrawerState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
Expand All @@ -42,12 +44,15 @@ class HomeStateHolder(
val coroutineScope: CoroutineScope,
val navController: NavHostController,
val drawerState: DrawerState,
val currentNavigationItem: HomeDestination,
val searchBarState: SearchBarState,
val navigator: Navigator,
lazyListStates: Map<HomeDestination, LazyListState>,
private val currentNavigationItemState: State<HomeDestination>,
private val lazyListStates: Map<HomeDestination, LazyListState>,
) {
val currentLazyListState = lazyListStates[currentNavigationItem] ?: error("No LazyListState found for $currentNavigationItem")
val currentNavigationItem: HomeDestination
get() = currentNavigationItemState.value
val currentLazyListState: LazyListState
get() = lazyListStates[currentNavigationItem] ?: error("No LazyListState found for $currentNavigationItem")

fun closeDrawer() {
coroutineScope.launch {
Expand All @@ -73,23 +78,22 @@ fun rememberHomeScreenState(
): HomeStateHolder {
val searchBarState = rememberSearchbarState()
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentRoute = navBackStackEntry?.destination?.route
val currentNavigationItem = currentRoute?.let { HomeDestination.fromRoute(it) } ?: HomeDestination.Conversations
val currentNavigationItemState = remember {
derivedStateOf {
navBackStackEntry?.destination?.route?.let { HomeDestination.fromRoute(it) } ?: HomeDestination.Conversations
}
}
val lazyListStates = HomeDestination.values().associateWith { rememberLazyListState() }

val homeState = remember(
currentNavigationItem
) {
return remember {
HomeStateHolder(
coroutineScope,
navController,
drawerState,
currentNavigationItem,
searchBarState,
navigator,
lazyListStates
coroutineScope = coroutineScope,
navController = navController,
drawerState = drawerState,
currentNavigationItemState = currentNavigationItemState,
searchBarState = searchBarState,
navigator = navigator,
lazyListStates = lazyListStates
)
}

return homeState
}
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,8 @@ import dagger.assisted.AssistedInject
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.collections.immutable.ImmutableMap
import kotlinx.collections.immutable.toImmutableMap
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.flow.debounce
Expand Down Expand Up @@ -113,6 +113,7 @@ interface ConversationListViewModel {
fun muteConversation(conversationId: ConversationId?, mutedConversationStatus: MutedConversationStatus) {}
fun addConversationToFavourites() {}
fun moveConversationToFolder() {}
fun searchQueryChanged(searchQuery: String) {}
}

class ConversationListViewModelPreview(
Expand All @@ -126,7 +127,6 @@ class ConversationListViewModelPreview(
@HiltViewModel(assistedFactory = ConversationListViewModelImpl.Factory::class)
class ConversationListViewModelImpl @AssistedInject constructor(
@Assisted val conversationsSource: ConversationsSource,
@Assisted val searchQueryFlow: Flow<String>,
private val dispatcher: DispatcherProvider,
private val updateConversationMutedStatus: UpdateConversationMutedStatusUseCase,
private val observeConversationListDetails: ObserveConversationListDetailsUseCase,
Expand All @@ -144,7 +144,7 @@ class ConversationListViewModelImpl @AssistedInject constructor(

@AssistedFactory
interface Factory {
fun create(conversationsSource: ConversationsSource, searchQueryFlow: Flow<String>): ConversationListViewModelImpl
fun create(conversationsSource: ConversationsSource): ConversationListViewModelImpl
}

private var _conversationListState by mutableStateOf(ConversationListState())
Expand All @@ -158,6 +158,8 @@ class ConversationListViewModelImpl @AssistedInject constructor(

override val closeBottomSheet = MutableSharedFlow<Unit>()

private val searchQueryFlow: MutableStateFlow<String> = MutableStateFlow("")

init {
viewModelScope.launch {
searchQueryFlow
Expand Down Expand Up @@ -199,6 +201,12 @@ class ConversationListViewModelImpl @AssistedInject constructor(
}
}

override fun searchQueryChanged(searchQuery: String) {
viewModelScope.launch {
searchQueryFlow.emit(searchQuery)
}
}

// Mateusz : First iteration, just filter stuff
// next iteration : SQL- query ?
private fun searchConversation(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ import com.wire.android.ui.common.dialogs.BlockUserDialogContent
import com.wire.android.ui.common.dialogs.PermissionPermanentlyDeniedDialog
import com.wire.android.ui.common.dialogs.UnblockUserDialogContent
import com.wire.android.ui.common.dialogs.calling.JoinAnywayDialog
import com.wire.android.ui.common.textfield.textAsFlow
import com.wire.android.ui.common.topappbar.search.SearchBarState
import com.wire.android.ui.common.topappbar.search.rememberSearchbarState
import com.wire.android.ui.common.visbility.rememberVisibilityState
Expand All @@ -69,7 +68,6 @@ import com.wire.android.util.ui.PreviewMultipleThemes
import com.wire.android.util.ui.SnackBarMessageHandler
import com.wire.kalium.logic.data.id.ConversationId
import com.wire.kalium.logic.data.user.UserId
import kotlinx.coroutines.flow.map

/**
* This is a base for creating screens for displaying list of conversations.
Expand All @@ -88,10 +86,7 @@ fun ConversationsScreenContent(
else -> hiltViewModel<ConversationListViewModelImpl, ConversationListViewModelImpl.Factory>(
key = "list_${conversationsSource.name}",
creationCallback = { factory ->
factory.create(
conversationsSource = conversationsSource,
searchQueryFlow = searchBarState.searchQueryTextState.textAsFlow().map { it.toString() }
)
factory.create(conversationsSource = conversationsSource)
}
)
},
Expand Down Expand Up @@ -128,6 +123,10 @@ fun ConversationsScreenContent(
}
}

LaunchedEffect(searchBarState.searchQueryTextState.text) {
conversationListViewModel.searchQueryChanged(searchBarState.searchQueryTextState.text.toString())
}

fun showConfirmationDialogOrUnarchive(): (DialogState) -> Unit {
return { dialogState ->
if (dialogState.isArchived) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.impl.annotations.MockK
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.test.advanceUntilIdle
import kotlinx.coroutines.test.runTest
Expand All @@ -69,11 +68,11 @@ class ConversationListViewModelTest {
fun `given empty search query, when collecting, then update state with all conversations`() = runTest(dispatcherProvider.main()) {
// Given
val searchQueryText = ""
val (arrangement, conversationListViewModel) = Arrangement().arrange()
val (_, conversationListViewModel) = Arrangement().arrange()

// When
advanceUntilIdle()
arrangement.searchQueryChanged(searchQueryText)
conversationListViewModel.searchQueryChanged(searchQueryText)
advanceUntilIdle()

// Then
Expand All @@ -89,11 +88,11 @@ class ConversationListViewModelTest {
runTest(dispatcherProvider.main()) {
// Given
val searchQueryText = TestConversationDetails.CONVERSATION_ONE_ONE.conversation.name.orDefault("test")
val (arrangement, conversationListViewModel) = Arrangement().arrange()
val (_, conversationListViewModel) = Arrangement().arrange()

// When
advanceUntilIdle()
arrangement.searchQueryChanged(searchQueryText)
conversationListViewModel.searchQueryChanged(searchQueryText)
advanceUntilIdle()

// Then
Expand Down Expand Up @@ -185,8 +184,6 @@ class ConversationListViewModelTest {
@MockK
private lateinit var updateConversationArchivedStatus: UpdateConversationArchivedStatusUseCase

private val searchQueryFlow = MutableStateFlow("")

init {
MockKAnnotations.init(this, relaxUnitFun = true)
coEvery { observeConversationListDetailsUseCase.invoke(false) } returns flowOf(
Expand All @@ -199,10 +196,6 @@ class ConversationListViewModelTest {
mockUri()
}

fun searchQueryChanged(searchQuery: String) = apply {
searchQueryFlow.value = searchQuery
}

fun updateConversationMutedStatusSuccess() = apply {
coEvery {
updateConversationMutedStatus(any(), any(), any())
Expand Down Expand Up @@ -232,7 +225,6 @@ class ConversationListViewModelTest {
refreshConversationsWithoutMetadata = refreshConversationsWithoutMetadata,
userTypeMapper = UserTypeMapper(),
updateConversationArchivedStatus = updateConversationArchivedStatus,
searchQueryFlow = searchQueryFlow
)
}

Expand Down

0 comments on commit db79f55

Please sign in to comment.