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
sealed interface RoomSelectEvents {
data class SetSelectedRoom(val room: SelectRoomInfo) : RoomSelectEvents
// TODO remove to restore multi-selection
data object RemoveSelectedRoom : RoomSelectEvents
data class ToggleSelectedRoom(val room: SelectRoomInfo) : RoomSelectEvents
data object ToggleSearchActive : RoomSelectEvents
data class UpdateVisibleRange(val range: IntRange) : RoomSelectEvents
}
@@ -69,17 +69,14 @@ class RoomSelectPresenter(
fun handleEvent(event: RoomSelectEvents) {
when (event) {
is RoomSelectEvents.SetSelectedRoom -> {
selectedRooms = persistentListOf(event.room)
// Restore for multi-selection
// val index = selectedRooms.indexOfFirst { it.roomId == event.room.roomId }
// selectedRooms = if (index >= 0) {
// selectedRooms.removeAt(index)
// } else {
// selectedRooms.add(event.room)
// }
is RoomSelectEvents.ToggleSelectedRoom -> {
val index = selectedRooms.indexOfFirst { it.roomId == event.room.roomId }
selectedRooms = if (index >= 0) {
selectedRooms.removeAt(index)
} else {
selectedRooms.add(event.room)
}
}
RoomSelectEvents.RemoveSelectedRoom -> selectedRooms = persistentListOf()
RoomSelectEvents.ToggleSearchActive -> isSearchActive = !isSearchActive
is RoomSelectEvents.UpdateVisibleRange -> coroutineScope.launch {
dataSource.updateVisibleRange(event.range)
@@ -71,15 +71,12 @@ fun RoomSelectView(
onSubmit: (List<RoomId>) -> Unit,
modifier: Modifier = Modifier,
) {
@Suppress("UNUSED_PARAMETER")
fun onRoomRemoved(roomInfo: SelectRoomInfo) {
// TODO toggle selection when multi-selection is enabled
state.eventSink(RoomSelectEvents.RemoveSelectedRoom)
state.eventSink(RoomSelectEvents.ToggleSelectedRoom(roomInfo))
}
@Composable
fun SelectedRoomsHelper(isForwarding: Boolean, selectedRooms: ImmutableList<SelectRoomInfo>) {
if (isForwarding) return
fun SelectedRoomsHelper(selectedRooms: ImmutableList<SelectRoomInfo>) {
SelectedRooms(
selectedRooms = selectedRooms,
onRemoveRoom = ::onRoomRemoved,
@@ -148,8 +145,6 @@ fun RoomSelectView(
LazyColumn(state = lazyListState) {
item {
SelectedRoomsHelper(
// TODO state.isForwarding
isForwarding = false,
selectedRooms = state.selectedRooms
)
}
@@ -159,7 +154,7 @@ fun RoomSelectView(
roomSummary,
isSelected = state.selectedRooms.any { it.roomId == roomSummary.roomId },
onSelection = { roomSummary ->
state.eventSink(RoomSelectEvents.SetSelectedRoom(roomSummary))
state.eventSink(RoomSelectEvents.ToggleSelectedRoom(roomSummary))
}
)
HorizontalDivider(modifier = Modifier.fillMaxWidth())
@@ -169,11 +164,9 @@ fun RoomSelectView(
}
if (!state.isSearchActive) {
// TODO restore for multi-selection
// SelectedRoomsHelper(
// isForwarding = state.isForwarding,
// selectedRooms = state.selectedRooms
// )
SelectedRoomsHelper(
selectedRooms = state.selectedRooms
)
Spacer(modifier = Modifier.height(20.dp))
if (state.resultState is SearchBarResultState.Results) {
@@ -184,7 +177,7 @@ fun RoomSelectView(
roomSummary,
isSelected = state.selectedRooms.any { it.roomId == roomSummary.roomId },
onSelection = { roomSummary ->
state.eventSink(RoomSelectEvents.SetSelectedRoom(roomSummary))
state.eventSink(RoomSelectEvents.ToggleSelectedRoom(roomSummary))
}
)
HorizontalDivider(modifier = Modifier.fillMaxWidth())
@@ -117,9 +117,9 @@ class RoomSelectPresenterTest {
}.test {
val initialState = awaitItem()
val roomInfo = roomSummary.toSelectRoomInfo()
initialState.eventSink(RoomSelectEvents.SetSelectedRoom(roomInfo))
initialState.eventSink(RoomSelectEvents.ToggleSelectedRoom(roomInfo))
assertThat(awaitItem().selectedRooms).isEqualTo(persistentListOf(roomInfo))
initialState.eventSink(RoomSelectEvents.RemoveSelectedRoom)
initialState.eventSink(RoomSelectEvents.ToggleSelectedRoom(roomInfo))
assertThat(awaitItem().selectedRooms).isEmpty()
cancel()
}