mirror of
https://github.com/Novaloop-AG/element-x-android.git
synced 2026-11-02 21:32:34 +00:00
Clear selection when selected space is removed from filters
This commit is contained in:
+10
-7
@@ -9,8 +9,8 @@ package io.element.android.features.home.impl.spacefilters
|
|||||||
|
|
||||||
import androidx.compose.foundation.text.input.rememberTextFieldState
|
import androidx.compose.foundation.text.input.rememberTextFieldState
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
import androidx.compose.runtime.collectAsState
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.runtime.derivedStateOf
|
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
@@ -86,12 +86,15 @@ class SpaceFiltersPresenter(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
is SelectionMode.Selected -> {
|
is SelectionMode.Selected -> {
|
||||||
// Keep in sync with the available filters if rooms are added/removed
|
var selectedFilter by remember { mutableStateOf(mode.filter) }
|
||||||
val selectedFilter by remember {
|
// Makes sure the selectedFilter stays in sync with the available filters
|
||||||
derivedStateOf {
|
LaunchedEffect(availableFilters) {
|
||||||
availableFilters
|
val upToDateFilter = availableFilters
|
||||||
.firstOrNull { it.spaceRoom.roomId == mode.filter.spaceRoom.roomId }
|
.firstOrNull { it.spaceRoom.roomId == mode.filter.spaceRoom.roomId }
|
||||||
?: mode.filter
|
if (upToDateFilter == null) {
|
||||||
|
selectionMode = SelectionMode.Unselected
|
||||||
|
} else {
|
||||||
|
selectedFilter = upToDateFilter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SpaceFiltersState.Selected(
|
SpaceFiltersState.Selected(
|
||||||
|
|||||||
+37
@@ -164,6 +164,43 @@ class SpaceFiltersPresenterTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `present - selected filter is cleared when space is removed from available filters`() = runTest {
|
||||||
|
val spaceFilter = aSpaceServiceFilter(displayName = "Work", roomId = RoomId("!work:example.com"))
|
||||||
|
val otherSpaceFilter = aSpaceServiceFilter(displayName = "Personal", roomId = RoomId("!personal:example.com"))
|
||||||
|
|
||||||
|
val spaceService = FakeSpaceService()
|
||||||
|
val matrixClient = FakeMatrixClient(spaceService = spaceService)
|
||||||
|
|
||||||
|
val presenter = createSpaceFiltersPresenter(
|
||||||
|
featureFlagService = FakeFeatureFlagService(
|
||||||
|
initialState = mapOf(FeatureFlags.RoomListSpaceFilters.key to true)
|
||||||
|
),
|
||||||
|
matrixClient = matrixClient,
|
||||||
|
)
|
||||||
|
presenter.test {
|
||||||
|
// Go to Selecting and emit filters
|
||||||
|
val unselectedState = awaitLastSequentialItem() as SpaceFiltersState.Unselected
|
||||||
|
unselectedState.eventSink(SpaceFiltersEvent.Unselected.ShowFilters)
|
||||||
|
spaceService.emitSpaceFilters(listOf(spaceFilter, otherSpaceFilter))
|
||||||
|
|
||||||
|
// Select the filter
|
||||||
|
val selectingState = awaitLastSequentialItem() as SpaceFiltersState.Selecting
|
||||||
|
selectingState.eventSink(SpaceFiltersEvent.Selecting.SelectFilter(spaceFilter))
|
||||||
|
|
||||||
|
// Verify in Selected state
|
||||||
|
val selectedState = awaitLastSequentialItem() as SpaceFiltersState.Selected
|
||||||
|
assertThat(selectedState.selectedFilter).isEqualTo(spaceFilter)
|
||||||
|
|
||||||
|
// Remove the selected space from available filters (but keep other spaces)
|
||||||
|
spaceService.emitSpaceFilters(listOf(otherSpaceFilter))
|
||||||
|
|
||||||
|
// Should auto-transition to Unselected
|
||||||
|
val finalState = awaitLastSequentialItem()
|
||||||
|
assertThat(finalState).isInstanceOf(SpaceFiltersState.Unselected::class.java)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `present - selected filter stays in sync when available filters update`() = runTest {
|
fun `present - selected filter stays in sync when available filters update`() = runTest {
|
||||||
val originalFilter = aSpaceServiceFilter(
|
val originalFilter = aSpaceServiceFilter(
|
||||||
|
|||||||
Reference in New Issue
Block a user