Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ package io.element.android.features.space.impl.leave

import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.core.bool.orFalse
import kotlinx.collections.immutable.ImmutableList

data class LeaveSpaceState(
Expand All @@ -18,18 +17,34 @@ data class LeaveSpaceState(
val leaveSpaceAction: AsyncAction<Unit>,
val eventSink: (LeaveSpaceEvents) -> Unit,
) {
val showQuickAction = selectableSpaceRooms.dataOrNull().orEmpty().any { !it.isLastAdmin }
val hasOnlyLastAdminRoom = selectableSpaceRooms.dataOrNull()
?.let { rooms ->
rooms.isNotEmpty() && rooms.all { it.isLastAdmin }
}
.orFalse()
val numberOfSelectRooms = selectableSpaceRooms.dataOrNull().orEmpty().count { it.isSelected }
private val rooms = selectableSpaceRooms.dataOrNull().orEmpty()

val areAllSelected = selectableSpaceRooms.dataOrNull()
?.filter { !it.isLastAdmin }
?.let { rooms ->
/**
* True if we should show the quick action to select/deselect all rooms.
*/
val showQuickAction = rooms
.any { !it.isLastAdmin }

/**
* True if there are rooms and they are all selected.
*/
val areAllSelected = rooms
.filter { !it.isLastAdmin }
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not a big deal, but maybe we could reuse the rooms.filter here for the .any above and the .all below instead of filtering the list 3 times? Since it'll be a small list (probably) maybe it's not worth it.

.let { rooms ->
rooms.isNotEmpty() && rooms.all { it.isSelected }
}
.orFalse()

/**
* True if there are rooms but the user is the last admin in all of them.
*/
val hasOnlyLastAdminRoom = rooms
.let { rooms ->
rooms.isNotEmpty() && rooms.all { it.isLastAdmin }
}

/**
* Number of selected rooms.
*/
val numberOfSelectRooms = rooms
.count { it.isSelected }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
/*
* Copyright 2025 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
* Please see LICENSE files in the repository root for full details.
*/

package io.element.android.features.space.impl.leave

import com.google.common.truth.Truth.assertThat
import io.element.android.libraries.architecture.AsyncData
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toPersistentList
import org.junit.Test

class LeaveSpaceStateTest {
@Test
fun `test loading`() {
val sut = aLeaveSpaceState(
selectableSpaceRooms = AsyncData.Loading()
)
assertThat(sut.showQuickAction).isFalse()
assertThat(sut.areAllSelected).isFalse()
assertThat(sut.hasOnlyLastAdminRoom).isFalse()
assertThat(sut.numberOfSelectRooms).isEqualTo(0)
}

@Test
fun `test no rooms`() {
val sut = aLeaveSpaceState(
selectableSpaceRooms = AsyncData.Success(
persistentListOf()
)
)
assertThat(sut.showQuickAction).isFalse()
assertThat(sut.areAllSelected).isFalse()
assertThat(sut.hasOnlyLastAdminRoom).isFalse()
assertThat(sut.numberOfSelectRooms).isEqualTo(0)
}

@Test
fun `test no last admin, 1 selected, 1 not selected`() {
val sut = aLeaveSpaceState(
selectableSpaceRooms = AsyncData.Success(
listOf(
aSelectableSpaceRoom(isLastAdmin = false, isSelected = true),
aSelectableSpaceRoom(isLastAdmin = false, isSelected = false),
).toPersistentList()
)
)
assertThat(sut.showQuickAction).isTrue()
assertThat(sut.areAllSelected).isFalse()
assertThat(sut.hasOnlyLastAdminRoom).isFalse()
assertThat(sut.numberOfSelectRooms).isEqualTo(1)
}

@Test
fun `test no last admin, 2 selected`() {
val sut = aLeaveSpaceState(
selectableSpaceRooms = AsyncData.Success(
listOf(
aSelectableSpaceRoom(isLastAdmin = false, isSelected = true),
aSelectableSpaceRoom(isLastAdmin = false, isSelected = true),
).toPersistentList()
)
)
assertThat(sut.showQuickAction).isTrue()
assertThat(sut.areAllSelected).isTrue()
assertThat(sut.hasOnlyLastAdminRoom).isFalse()
assertThat(sut.numberOfSelectRooms).isEqualTo(2)
}

@Test
fun `test 1 last admin, 2 selected`() {
val sut = aLeaveSpaceState(
selectableSpaceRooms = AsyncData.Success(
listOf(
aSelectableSpaceRoom(isLastAdmin = true, isSelected = false),
aSelectableSpaceRoom(isLastAdmin = false, isSelected = true),
aSelectableSpaceRoom(isLastAdmin = false, isSelected = true),
).toPersistentList()
)
)
assertThat(sut.showQuickAction).isTrue()
assertThat(sut.areAllSelected).isTrue()
assertThat(sut.hasOnlyLastAdminRoom).isFalse()
assertThat(sut.numberOfSelectRooms).isEqualTo(2)
}

@Test
fun `test only last admin`() {
val sut = aLeaveSpaceState(
selectableSpaceRooms = AsyncData.Success(
listOf(
aSelectableSpaceRoom(isLastAdmin = true, isSelected = false),
aSelectableSpaceRoom(isLastAdmin = true, isSelected = false),
).toPersistentList()
)
)
assertThat(sut.showQuickAction).isFalse()
assertThat(sut.areAllSelected).isFalse()
assertThat(sut.hasOnlyLastAdminRoom).isTrue()
assertThat(sut.numberOfSelectRooms).isEqualTo(0)
}
}