From bec65c46fcabc6c60c27fe1e5107da1dce702fca Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 17 Apr 2024 11:44:28 +0200 Subject: [PATCH] RoomMemberDetailsPresenter: fallback to user profile data if the user is not a member of the room. This can be displayed when the user click on a non-member user permalink. --- .../details/RoomMemberDetailsPresenter.kt | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsPresenter.kt index 04c59c866f..81263b504c 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsPresenter.kt @@ -21,7 +21,6 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MutableState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.produceState import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue @@ -37,6 +36,7 @@ import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.room.MatrixRoom +import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.ui.room.getRoomMemberAsState import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.distinctUntilChanged @@ -60,6 +60,7 @@ class RoomMemberDetailsPresenter @AssistedInject constructor( val coroutineScope = rememberCoroutineScope() var confirmationDialog by remember { mutableStateOf(null) } val roomMember by room.getRoomMemberAsState(roomMemberId) + var userProfile by remember { mutableStateOf(null) } val startDmActionState: MutableState> = remember { mutableStateOf(AsyncAction.Uninitialized) } val isBlocked: MutableState> = remember { mutableStateOf(AsyncData.Uninitialized) } LaunchedEffect(Unit) { @@ -74,6 +75,9 @@ class RoomMemberDetailsPresenter @AssistedInject constructor( // We don't need to assign the result as it will be automatically propagated by `room.getRoomMemberAsState` room.getUpdatedMember(roomMemberId) } + LaunchedEffect(Unit) { + userProfile = client.getProfile(roomMemberId).getOrNull() + } fun handleEvents(event: RoomMemberDetailsEvents) { when (event) { @@ -108,16 +112,26 @@ class RoomMemberDetailsPresenter @AssistedInject constructor( } } - val userName by produceState(initialValue = roomMember?.displayName) { - room.userDisplayName(roomMemberId).onSuccess { displayName -> - if (displayName != null) value = displayName - } + var userName: String? by remember { mutableStateOf(roomMember?.displayName ?: userProfile?.displayName) } + LaunchedEffect(roomMember, userProfile) { + userName = room.userDisplayName(roomMemberId) + .fold( + onSuccess = { it }, + onFailure = { + // Fallback to user profile + userProfile?.displayName + }) } - val userAvatar by produceState(initialValue = roomMember?.avatarUrl) { - room.userAvatarUrl(roomMemberId).onSuccess { avatarUrl -> - if (avatarUrl != null) value = avatarUrl - } + var userAvatar: String? by remember { mutableStateOf(roomMember?.avatarUrl ?: userProfile?.avatarUrl) } + LaunchedEffect(roomMember, userProfile) { + userAvatar = room.userAvatarUrl(roomMemberId) + .fold( + onSuccess = { it }, + onFailure = { + // Fallback to user profile + userProfile?.avatarUrl + }) } return RoomMemberDetailsState( @@ -127,7 +141,7 @@ class RoomMemberDetailsPresenter @AssistedInject constructor( isBlocked = isBlocked.value, startDmActionState = startDmActionState.value, displayConfirmationDialog = confirmationDialog, - isCurrentUser = client.isMe(roomMember?.userId), + isCurrentUser = client.isMe(roomMemberId), eventSink = ::handleEvents ) }