Use produceState and fetch profile only if necessary.

This commit is contained in:
Benoit Marty 2024-04-17 16:15:36 +02:00
parent 57072c3e6a
commit 291983f6bc

View file

@ -21,6 +21,7 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableState import androidx.compose.runtime.MutableState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.produceState
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
@ -74,9 +75,10 @@ class RoomMemberDetailsPresenter @AssistedInject constructor(
// Update room member info when opening this screen // Update room member info when opening this screen
// We don't need to assign the result as it will be automatically propagated by `room.getRoomMemberAsState` // We don't need to assign the result as it will be automatically propagated by `room.getRoomMemberAsState`
room.getUpdatedMember(roomMemberId) room.getUpdatedMember(roomMemberId)
} .onFailure {
LaunchedEffect(Unit) { // Not a member of the room, try to get the user profile
userProfile = client.getProfile(roomMemberId).getOrNull() userProfile = client.getProfile(roomMemberId).getOrNull()
}
} }
fun handleEvents(event: RoomMemberDetailsEvents) { fun handleEvents(event: RoomMemberDetailsEvents) {
@ -112,9 +114,12 @@ class RoomMemberDetailsPresenter @AssistedInject constructor(
} }
} }
var userName: String? by remember { mutableStateOf(roomMember?.displayName ?: userProfile?.displayName) } val userName: String? by produceState(
LaunchedEffect(roomMember, userProfile) { initialValue = roomMember?.displayName ?: userProfile?.displayName,
userName = room.userDisplayName(roomMemberId) key1 = roomMember,
key2 = userProfile,
) {
value = room.userDisplayName(roomMemberId)
.fold( .fold(
onSuccess = { it }, onSuccess = { it },
onFailure = { onFailure = {
@ -124,9 +129,12 @@ class RoomMemberDetailsPresenter @AssistedInject constructor(
) )
} }
var userAvatar: String? by remember { mutableStateOf(roomMember?.avatarUrl ?: userProfile?.avatarUrl) } val userAvatar: String? by produceState(
LaunchedEffect(roomMember, userProfile) { initialValue = roomMember?.avatarUrl ?: userProfile?.avatarUrl,
userAvatar = room.userAvatarUrl(roomMemberId) key1 = roomMember,
key2 = userProfile,
) {
value = room.userAvatarUrl(roomMemberId)
.fold( .fold(
onSuccess = { it }, onSuccess = { it },
onFailure = { onFailure = {