diff --git a/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesPresenter.kt b/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesPresenter.kt index 3207543e0f..2b02cdfdb2 100644 --- a/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesPresenter.kt +++ b/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesPresenter.kt @@ -25,6 +25,7 @@ import im.vector.app.features.analytics.plan.RoomModeration import io.element.android.features.rolesandpermissions.impl.RoomMemberListDataSource 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.core.coroutine.CoroutineDispatchers import io.element.android.libraries.designsystem.theme.components.SearchBarResultState import io.element.android.libraries.di.annotations.RoomCoroutineScope @@ -193,37 +194,27 @@ class ChangeRolesPresenter( selectedUsers: MutableState>, saveState: MutableState>, ) = launch { - saveState.value = AsyncAction.Loading - - val toAdd = selectedUsers.value - usersWithRole - val toRemove = usersWithRole - selectedUsers.value - - val changes: List = buildList { - for (selectedUser in toAdd) { - analyticsService.capture(RoomModeration(RoomModeration.Action.ChangeMemberRole, role.toAnalyticsMemberRole())) - add(UserRoleChange(selectedUser.userId, role)) - } - for (selectedUser in toRemove) { - analyticsService.capture(RoomModeration(RoomModeration.Action.ChangeMemberRole, RoomModeration.Role.User)) - add(UserRoleChange(selectedUser.userId, RoomMember.Role.User)) + runUpdatingState(saveState) { + val toAdd = selectedUsers.value - usersWithRole + val toRemove = usersWithRole - selectedUsers.value + val changes: List = buildList { + for (selectedUser in toAdd) { + analyticsService.capture(RoomModeration(RoomModeration.Action.ChangeMemberRole, role.toAnalyticsMemberRole())) + add(UserRoleChange(selectedUser.userId, role)) + } + for (selectedUser in toRemove) { + analyticsService.capture(RoomModeration(RoomModeration.Action.ChangeMemberRole, RoomModeration.Role.User)) + add(UserRoleChange(selectedUser.userId, RoomMember.Role.User)) + } } + room.updateUsersRoles(changes).map { true } } + } - room.updateUsersRoles(changes) - .onFailure { - saveState.value = AsyncAction.Failure(it) - } - .onSuccess { - // Asynchronously reload the room members - launch { room.updateMembers() } - saveState.value = AsyncAction.Success(true) - } + internal fun RoomMember.Role.toAnalyticsMemberRole(): RoomModeration.Role = when (this) { + is RoomMember.Role.Owner -> RoomModeration.Role.Administrator // TODO - distinguish creator from admin + RoomMember.Role.Admin -> RoomModeration.Role.Administrator + RoomMember.Role.Moderator -> RoomModeration.Role.Moderator + RoomMember.Role.User -> RoomModeration.Role.User } } - -internal fun RoomMember.Role.toAnalyticsMemberRole(): RoomModeration.Role = when (this) { - is RoomMember.Role.Owner -> RoomModeration.Role.Administrator // TODO - distinguish creator from admin - RoomMember.Role.Admin -> RoomModeration.Role.Administrator - RoomMember.Role.Moderator -> RoomModeration.Role.Moderator - RoomMember.Role.User -> RoomModeration.Role.User -} diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListPresenter.kt index 8f5053bd2a..92705b1775 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListPresenter.kt @@ -39,11 +39,8 @@ import kotlinx.collections.immutable.ImmutableMap import kotlinx.collections.immutable.persistentMapOf import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableMap -import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.withContext @@ -55,9 +52,10 @@ class RoomMemberListPresenter( private val roomMembersModerationPresenter: Presenter, private val encryptionService: EncryptionService, ) : Presenter { + var roomMembers: AsyncData by mutableStateOf(AsyncData.Loading()) + @Composable override fun present(): RoomMemberListState { - var roomMembers: AsyncData by remember { mutableStateOf(AsyncData.Loading()) } var searchQuery by rememberSaveable { mutableStateOf("") } var searchResults by remember { mutableStateOf>>(SearchBarResultState.Initial()) @@ -77,13 +75,9 @@ class RoomMemberListPresenter( .launchIn(this) } - // Update the room members when the screen is loaded or the active member count changes + // Update the room members when the screen is loaded LaunchedEffect(Unit) { - room.roomInfoFlow.map { it.activeMembersCount } - .distinctUntilChanged() - .collectLatest { - room.updateMembers() - } + room.updateMembers() } LaunchedEffect(membersState, roomMemberIdentityStates) {