Forward message to multiple rooms

This commit is contained in:
Benoit Marty
2026-06-11 16:36:52 +02:00
parent 48e5d1b2f4
commit bda24a1175
4 changed files with 17 additions and 30 deletions
@@ -11,10 +11,7 @@ package io.element.android.libraries.roomselect.impl
import io.element.android.libraries.matrix.ui.model.SelectRoomInfo import io.element.android.libraries.matrix.ui.model.SelectRoomInfo
sealed interface RoomSelectEvents { sealed interface RoomSelectEvents {
data class SetSelectedRoom(val room: SelectRoomInfo) : RoomSelectEvents data class ToggleSelectedRoom(val room: SelectRoomInfo) : RoomSelectEvents
// TODO remove to restore multi-selection
data object RemoveSelectedRoom : RoomSelectEvents
data object ToggleSearchActive : RoomSelectEvents data object ToggleSearchActive : RoomSelectEvents
data class UpdateVisibleRange(val range: IntRange) : RoomSelectEvents data class UpdateVisibleRange(val range: IntRange) : RoomSelectEvents
} }
@@ -69,17 +69,14 @@ class RoomSelectPresenter(
fun handleEvent(event: RoomSelectEvents) { fun handleEvent(event: RoomSelectEvents) {
when (event) { when (event) {
is RoomSelectEvents.SetSelectedRoom -> { is RoomSelectEvents.ToggleSelectedRoom -> {
selectedRooms = persistentListOf(event.room) val index = selectedRooms.indexOfFirst { it.roomId == event.room.roomId }
// Restore for multi-selection selectedRooms = if (index >= 0) {
// val index = selectedRooms.indexOfFirst { it.roomId == event.room.roomId } selectedRooms.removeAt(index)
// selectedRooms = if (index >= 0) { } else {
// selectedRooms.removeAt(index) selectedRooms.add(event.room)
// } else { }
// selectedRooms.add(event.room)
// }
} }
RoomSelectEvents.RemoveSelectedRoom -> selectedRooms = persistentListOf()
RoomSelectEvents.ToggleSearchActive -> isSearchActive = !isSearchActive RoomSelectEvents.ToggleSearchActive -> isSearchActive = !isSearchActive
is RoomSelectEvents.UpdateVisibleRange -> coroutineScope.launch { is RoomSelectEvents.UpdateVisibleRange -> coroutineScope.launch {
dataSource.updateVisibleRange(event.range) dataSource.updateVisibleRange(event.range)
@@ -71,15 +71,12 @@ fun RoomSelectView(
onSubmit: (List<RoomId>) -> Unit, onSubmit: (List<RoomId>) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
@Suppress("UNUSED_PARAMETER")
fun onRoomRemoved(roomInfo: SelectRoomInfo) { fun onRoomRemoved(roomInfo: SelectRoomInfo) {
// TODO toggle selection when multi-selection is enabled state.eventSink(RoomSelectEvents.ToggleSelectedRoom(roomInfo))
state.eventSink(RoomSelectEvents.RemoveSelectedRoom)
} }
@Composable @Composable
fun SelectedRoomsHelper(isForwarding: Boolean, selectedRooms: ImmutableList<SelectRoomInfo>) { fun SelectedRoomsHelper(selectedRooms: ImmutableList<SelectRoomInfo>) {
if (isForwarding) return
SelectedRooms( SelectedRooms(
selectedRooms = selectedRooms, selectedRooms = selectedRooms,
onRemoveRoom = ::onRoomRemoved, onRemoveRoom = ::onRoomRemoved,
@@ -148,8 +145,6 @@ fun RoomSelectView(
LazyColumn(state = lazyListState) { LazyColumn(state = lazyListState) {
item { item {
SelectedRoomsHelper( SelectedRoomsHelper(
// TODO state.isForwarding
isForwarding = false,
selectedRooms = state.selectedRooms selectedRooms = state.selectedRooms
) )
} }
@@ -159,7 +154,7 @@ fun RoomSelectView(
roomSummary, roomSummary,
isSelected = state.selectedRooms.any { it.roomId == roomSummary.roomId }, isSelected = state.selectedRooms.any { it.roomId == roomSummary.roomId },
onSelection = { roomSummary -> onSelection = { roomSummary ->
state.eventSink(RoomSelectEvents.SetSelectedRoom(roomSummary)) state.eventSink(RoomSelectEvents.ToggleSelectedRoom(roomSummary))
} }
) )
HorizontalDivider(modifier = Modifier.fillMaxWidth()) HorizontalDivider(modifier = Modifier.fillMaxWidth())
@@ -169,11 +164,9 @@ fun RoomSelectView(
} }
if (!state.isSearchActive) { if (!state.isSearchActive) {
// TODO restore for multi-selection SelectedRoomsHelper(
// SelectedRoomsHelper( selectedRooms = state.selectedRooms
// isForwarding = state.isForwarding, )
// selectedRooms = state.selectedRooms
// )
Spacer(modifier = Modifier.height(20.dp)) Spacer(modifier = Modifier.height(20.dp))
if (state.resultState is SearchBarResultState.Results) { if (state.resultState is SearchBarResultState.Results) {
@@ -184,7 +177,7 @@ fun RoomSelectView(
roomSummary, roomSummary,
isSelected = state.selectedRooms.any { it.roomId == roomSummary.roomId }, isSelected = state.selectedRooms.any { it.roomId == roomSummary.roomId },
onSelection = { roomSummary -> onSelection = { roomSummary ->
state.eventSink(RoomSelectEvents.SetSelectedRoom(roomSummary)) state.eventSink(RoomSelectEvents.ToggleSelectedRoom(roomSummary))
} }
) )
HorizontalDivider(modifier = Modifier.fillMaxWidth()) HorizontalDivider(modifier = Modifier.fillMaxWidth())
@@ -117,9 +117,9 @@ class RoomSelectPresenterTest {
}.test { }.test {
val initialState = awaitItem() val initialState = awaitItem()
val roomInfo = roomSummary.toSelectRoomInfo() val roomInfo = roomSummary.toSelectRoomInfo()
initialState.eventSink(RoomSelectEvents.SetSelectedRoom(roomInfo)) initialState.eventSink(RoomSelectEvents.ToggleSelectedRoom(roomInfo))
assertThat(awaitItem().selectedRooms).isEqualTo(persistentListOf(roomInfo)) assertThat(awaitItem().selectedRooms).isEqualTo(persistentListOf(roomInfo))
initialState.eventSink(RoomSelectEvents.RemoveSelectedRoom) initialState.eventSink(RoomSelectEvents.ToggleSelectedRoom(roomInfo))
assertThat(awaitItem().selectedRooms).isEmpty() assertThat(awaitItem().selectedRooms).isEmpty()
cancel() cancel()
} }