Clear selection when selected space is removed from filters
This commit is contained in:
parent
dcc2776cd1
commit
0f668370b7
2 changed files with 47 additions and 7 deletions
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue