diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/addroom/AddRoomToSpacePresenter.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/addroom/AddRoomToSpacePresenter.kt index 0516b102e5..143cecd203 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/addroom/AddRoomToSpacePresenter.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/addroom/AddRoomToSpacePresenter.kt @@ -24,13 +24,12 @@ import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runUpdatingState import io.element.android.libraries.designsystem.theme.components.SearchBarResultState -import io.element.android.libraries.di.annotations.SessionCoroutineScope import io.element.android.libraries.matrix.api.spaces.SpaceRoomList import io.element.android.libraries.matrix.api.spaces.SpaceService import io.element.android.libraries.matrix.ui.model.SelectRoomInfo import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf -import kotlinx.collections.immutable.toPersistentList +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll @@ -42,10 +41,9 @@ class AddRoomToSpacePresenter( private val spaceService: SpaceService, private val dataSourceFactory: AddRoomToSpaceSearchDataSource.Factory, ) : Presenter { - @Composable override fun present(): AddRoomToSpaceState { - var selectedRooms by remember { mutableStateOf(persistentListOf()) } + var selectedRooms: ImmutableList by remember { mutableStateOf(persistentListOf()) } var searchQuery by remember { mutableStateOf("") } var isSearchActive by remember { mutableStateOf(false) } val saveAction = remember { mutableStateOf>(AsyncAction.Uninitialized) } @@ -78,9 +76,9 @@ class AddRoomToSpacePresenter( when (event) { is AddRoomToSpaceEvent.ToggleRoom -> { selectedRooms = if (selectedRooms.any { it.roomId == event.room.roomId }) { - selectedRooms.filterNot { it.roomId == event.room.roomId }.toPersistentList() + selectedRooms.filterNot { it.roomId == event.room.roomId }.toImmutableList() } else { - (selectedRooms + event.room).toPersistentList() + (selectedRooms + event.room).toImmutableList() } } is AddRoomToSpaceEvent.UpdateSearchQuery -> { diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/addroom/AddRoomToSpaceSearchDataSource.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/addroom/AddRoomToSpaceSearchDataSource.kt index 64603faaca..3d5722816c 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/addroom/AddRoomToSpaceSearchDataSource.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/addroom/AddRoomToSpaceSearchDataSource.kt @@ -11,7 +11,6 @@ package io.element.android.features.space.impl.addroom import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedFactory import dev.zacsweers.metro.AssistedInject -import dev.zacsweers.metro.Inject import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.RoomId @@ -52,7 +51,6 @@ class AddRoomToSpaceSearchDataSource( private val matrixClient: MatrixClient, private val coroutineDispatchers: CoroutineDispatchers, ) { - @AssistedFactory interface Factory { fun create(coroutineScope: CoroutineScope): AddRoomToSpaceSearchDataSource diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/addroom/AddRoomToSpaceView.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/addroom/AddRoomToSpaceView.kt index 79e8a2b511..0ea2bb7c70 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/addroom/AddRoomToSpaceView.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/addroom/AddRoomToSpaceView.kt @@ -171,8 +171,8 @@ fun AddRoomToSpaceView( } SaveActionView( saveAction = state.saveAction, - onRetry = { state.eventSink(AddRoomToSpaceEvent.Save)}, - onDismiss = {state.eventSink(AddRoomToSpaceEvent.ResetSaveAction)} + onRetry = { state.eventSink(AddRoomToSpaceEvent.Save) }, + onDismiss = { state.eventSink(AddRoomToSpaceEvent.ResetSaveAction) } ) } diff --git a/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/addroom/AddRoomToSpacePresenterTest.kt b/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/addroom/AddRoomToSpacePresenterTest.kt index 17451cb492..0448bae7af 100644 --- a/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/addroom/AddRoomToSpacePresenterTest.kt +++ b/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/addroom/AddRoomToSpacePresenterTest.kt @@ -15,17 +15,14 @@ import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.designsystem.theme.components.SearchBarResultState import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.room.CurrentUserMembership -import io.element.android.libraries.matrix.test.A_ROOM_ID -import io.element.android.libraries.matrix.test.A_ROOM_ID_2 import io.element.android.libraries.matrix.test.AN_EXCEPTION +import io.element.android.libraries.matrix.test.A_ROOM_ID import io.element.android.libraries.matrix.test.FakeMatrixClient -import io.element.android.libraries.matrix.test.room.aRoomInfo import io.element.android.libraries.matrix.test.room.aRoomSummary import io.element.android.libraries.matrix.test.roomlist.FakeRoomListService import io.element.android.libraries.matrix.test.spaces.FakeSpaceRoomList import io.element.android.libraries.matrix.test.spaces.FakeSpaceService import io.element.android.tests.testutils.lambda.lambdaRecorder -import io.element.android.tests.testutils.lambda.value import io.element.android.tests.testutils.test import io.element.android.tests.testutils.testCoroutineDispatchers import kotlinx.coroutines.CoroutineScope @@ -38,7 +35,7 @@ import org.junit.Test class AddRoomToSpacePresenterTest { @Test fun `present - initial state has empty selection and no search`() = runTest { - val presenter = createPresenter() + val presenter = createAddRoomToSpacePresenter() presenter.test { val state = awaitItem() assertThat(state.selectedRooms).isEmpty() @@ -51,7 +48,7 @@ class AddRoomToSpacePresenterTest { @Test fun `present - ToggleRoom adds room to selection`() = runTest { - val presenter = createPresenter() + val presenter = createAddRoomToSpacePresenter() presenter.test { val state = awaitItem() val room = aSelectRoomInfoList().first() @@ -65,7 +62,7 @@ class AddRoomToSpacePresenterTest { @Test fun `present - ToggleRoom removes already selected room`() = runTest { - val presenter = createPresenter() + val presenter = createAddRoomToSpacePresenter() presenter.test { val state = awaitItem() val room = aSelectRoomInfoList().first() @@ -83,7 +80,7 @@ class AddRoomToSpacePresenterTest { @Test fun `present - UpdateSearchQuery updates query`() = runTest { - val presenter = createPresenter() + val presenter = createAddRoomToSpacePresenter() presenter.test { val state = awaitItem() state.eventSink(AddRoomToSpaceEvent.UpdateSearchQuery("test")) @@ -94,7 +91,7 @@ class AddRoomToSpacePresenterTest { @Test fun `present - OnSearchActiveChanged activates search`() = runTest { - val presenter = createPresenter() + val presenter = createAddRoomToSpacePresenter() presenter.test { val state = awaitItem() state.eventSink(AddRoomToSpaceEvent.OnSearchActiveChanged(true)) @@ -105,7 +102,7 @@ class AddRoomToSpacePresenterTest { @Test fun `present - OnSearchActiveChanged deactivates search and clears query`() = runTest { - val presenter = createPresenter() + val presenter = createAddRoomToSpacePresenter() presenter.test { val state = awaitItem() // Activate search and set query @@ -124,7 +121,7 @@ class AddRoomToSpacePresenterTest { @Test fun `present - CloseSearch deactivates and clears query`() = runTest { - val presenter = createPresenter() + val presenter = createAddRoomToSpacePresenter() presenter.test { val state = awaitItem() // Activate search and set query @@ -144,7 +141,7 @@ class AddRoomToSpacePresenterTest { @Test fun `present - searchResults shows Results when rooms available`() = runTest { val roomListService = FakeRoomListService() - val presenter = createPresenter(roomListService = roomListService) + val presenter = createAddRoomToSpacePresenter(roomListService = roomListService) presenter.test { awaitItem() // Initial state // Post rooms to the service @@ -167,7 +164,7 @@ class AddRoomToSpacePresenterTest { @Test fun `present - searchResults shows NoResultsFound when search active with query but no results`() = runTest { - val presenter = createPresenter() + val presenter = createAddRoomToSpacePresenter() presenter.test { val state = awaitItem() state.eventSink(AddRoomToSpaceEvent.OnSearchActiveChanged(true)) @@ -189,7 +186,7 @@ class AddRoomToSpacePresenterTest { val spaceService = FakeSpaceService( addChildToSpaceResult = addChildToSpaceResult, ) - val presenter = createPresenter(spaceService = spaceService) + val presenter = createAddRoomToSpacePresenter(spaceService = spaceService) presenter.test { val state = awaitItem() // Select two rooms @@ -215,7 +212,7 @@ class AddRoomToSpacePresenterTest { val spaceService = FakeSpaceService( addChildToSpaceResult = { _, _ -> Result.success(Unit) }, ) - val presenter = createPresenter(spaceService = spaceService) + val presenter = createAddRoomToSpacePresenter(spaceService = spaceService) presenter.test { val state = awaitItem() val room = aSelectRoomInfoList().first() @@ -237,7 +234,7 @@ class AddRoomToSpacePresenterTest { val spaceService = FakeSpaceService( addChildToSpaceResult = { _, _ -> Result.failure(AN_EXCEPTION) }, ) - val presenter = createPresenter(spaceService = spaceService) + val presenter = createAddRoomToSpacePresenter(spaceService = spaceService) presenter.test { val state = awaitItem() val room = aSelectRoomInfoList().first() @@ -259,7 +256,7 @@ class AddRoomToSpacePresenterTest { val spaceService = FakeSpaceService( addChildToSpaceResult = { _, _ -> Result.success(Unit) }, ) - val presenter = createPresenter(spaceService = spaceService) + val presenter = createAddRoomToSpacePresenter(spaceService = spaceService) presenter.test { val state = awaitItem() val room = aSelectRoomInfoList().first() @@ -279,7 +276,7 @@ class AddRoomToSpacePresenterTest { @Test fun `canSave is false when no rooms selected`() = runTest { - val presenter = createPresenter() + val presenter = createAddRoomToSpacePresenter() presenter.test { val state = awaitItem() assertThat(state.selectedRooms).isEmpty() @@ -292,7 +289,7 @@ class AddRoomToSpacePresenterTest { val spaceService = FakeSpaceService( addChildToSpaceResult = { _, _ -> Result.success(Unit) }, ) - val presenter = createPresenter(spaceService = spaceService) + val presenter = createAddRoomToSpacePresenter(spaceService = spaceService) presenter.test { val state = awaitItem() val room = aSelectRoomInfoList().first() @@ -306,7 +303,7 @@ class AddRoomToSpacePresenterTest { } } - private fun TestScope.createPresenter( + private fun TestScope.createAddRoomToSpacePresenter( spaceRoomList: FakeSpaceRoomList = FakeSpaceRoomList( paginateResult = { Result.success(Unit) }, ), diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/SelectRoomInfo.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/SelectRoomInfo.kt index cf66d040a9..d6981f62fd 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/SelectRoomInfo.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/SelectRoomInfo.kt @@ -43,4 +43,3 @@ fun RoomInfo.toSelectRoomInfo() = SelectRoomInfo( canonicalAlias = canonicalAlias, isTombstoned = successorRoom != null, ) -