change(room members): remove useless call to updateMembers

This commit is contained in:
ganfra 2025-11-13 16:48:43 +01:00
parent 3086d1e8e3
commit 1623651ca8
2 changed files with 24 additions and 39 deletions

View file

@ -25,6 +25,7 @@ import im.vector.app.features.analytics.plan.RoomModeration
import io.element.android.features.rolesandpermissions.impl.RoomMemberListDataSource import io.element.android.features.rolesandpermissions.impl.RoomMemberListDataSource
import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.architecture.Presenter 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.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.designsystem.theme.components.SearchBarResultState import io.element.android.libraries.designsystem.theme.components.SearchBarResultState
import io.element.android.libraries.di.annotations.RoomCoroutineScope import io.element.android.libraries.di.annotations.RoomCoroutineScope
@ -193,37 +194,27 @@ class ChangeRolesPresenter(
selectedUsers: MutableState<ImmutableList<MatrixUser>>, selectedUsers: MutableState<ImmutableList<MatrixUser>>,
saveState: MutableState<AsyncAction<Boolean>>, saveState: MutableState<AsyncAction<Boolean>>,
) = launch { ) = launch {
saveState.value = AsyncAction.Loading runUpdatingState(saveState) {
val toAdd = selectedUsers.value - usersWithRole
val toAdd = selectedUsers.value - usersWithRole val toRemove = usersWithRole - selectedUsers.value
val toRemove = usersWithRole - selectedUsers.value val changes: List<UserRoleChange> = buildList {
for (selectedUser in toAdd) {
val changes: List<UserRoleChange> = buildList { analyticsService.capture(RoomModeration(RoomModeration.Action.ChangeMemberRole, role.toAnalyticsMemberRole()))
for (selectedUser in toAdd) { add(UserRoleChange(selectedUser.userId, role))
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))
for (selectedUser in toRemove) { add(UserRoleChange(selectedUser.userId, RoomMember.Role.User))
analyticsService.capture(RoomModeration(RoomModeration.Action.ChangeMemberRole, RoomModeration.Role.User)) }
add(UserRoleChange(selectedUser.userId, RoomMember.Role.User))
} }
room.updateUsersRoles(changes).map { true }
} }
}
room.updateUsersRoles(changes) internal fun RoomMember.Role.toAnalyticsMemberRole(): RoomModeration.Role = when (this) {
.onFailure { is RoomMember.Role.Owner -> RoomModeration.Role.Administrator // TODO - distinguish creator from admin
saveState.value = AsyncAction.Failure(it) RoomMember.Role.Admin -> RoomModeration.Role.Administrator
} RoomMember.Role.Moderator -> RoomModeration.Role.Moderator
.onSuccess { RoomMember.Role.User -> RoomModeration.Role.User
// 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
}

View file

@ -39,11 +39,8 @@ import kotlinx.collections.immutable.ImmutableMap
import kotlinx.collections.immutable.persistentMapOf import kotlinx.collections.immutable.persistentMapOf
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
import kotlinx.collections.immutable.toImmutableMap import kotlinx.collections.immutable.toImmutableMap
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@ -55,9 +52,10 @@ class RoomMemberListPresenter(
private val roomMembersModerationPresenter: Presenter<RoomMemberModerationState>, private val roomMembersModerationPresenter: Presenter<RoomMemberModerationState>,
private val encryptionService: EncryptionService, private val encryptionService: EncryptionService,
) : Presenter<RoomMemberListState> { ) : Presenter<RoomMemberListState> {
var roomMembers: AsyncData<RoomMembers> by mutableStateOf(AsyncData.Loading())
@Composable @Composable
override fun present(): RoomMemberListState { override fun present(): RoomMemberListState {
var roomMembers: AsyncData<RoomMembers> by remember { mutableStateOf(AsyncData.Loading()) }
var searchQuery by rememberSaveable { mutableStateOf("") } var searchQuery by rememberSaveable { mutableStateOf("") }
var searchResults by remember { var searchResults by remember {
mutableStateOf<SearchBarResultState<AsyncData<RoomMembers>>>(SearchBarResultState.Initial()) mutableStateOf<SearchBarResultState<AsyncData<RoomMembers>>>(SearchBarResultState.Initial())
@ -77,13 +75,9 @@ class RoomMemberListPresenter(
.launchIn(this) .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) { LaunchedEffect(Unit) {
room.roomInfoFlow.map { it.activeMembersCount } room.updateMembers()
.distinctUntilChanged()
.collectLatest {
room.updateMembers()
}
} }
LaunchedEffect(membersState, roomMemberIdentityStates) { LaunchedEffect(membersState, roomMemberIdentityStates) {