RoomList: avoid to many recompositions

This commit is contained in:
ganfra 2022-10-30 13:48:06 +01:00
parent 485b38efad
commit fcf7e8d7f1
8 changed files with 88 additions and 41 deletions

View file

@ -16,53 +16,57 @@ import androidx.compose.ui.unit.sp
import com.airbnb.mvrx.Success
import com.airbnb.mvrx.compose.collectAsState
import com.airbnb.mvrx.compose.mavericksViewModel
import io.element.android.x.core.data.LogCompositions
import io.element.android.x.designsystem.components.Avatar
import io.element.android.x.features.roomlist.model.MatrixUser
import io.element.android.x.matrix.core.RoomId
import io.element.android.x.matrix.room.RoomSummary
@Composable
fun RoomListScreen(
viewModel: RoomListViewModel = mavericksViewModel(),
onSuccessLogout: () -> Unit = { },
onRoomClicked: (RoomId) -> Unit = { }
) {
val state by viewModel.collectAsState()
if (state.logoutAction is Success) {
val viewModel: RoomListViewModel = mavericksViewModel()
val logoutAction by viewModel.collectAsState(RoomListViewState::logoutAction)
if (logoutAction is Success) {
onSuccessLogout()
return
}
LogCompositions(tag = "RoomListScreen", msg = "Root")
val roomSummaries by viewModel.collectAsState(RoomListViewState::rooms)
val matrixUser by viewModel.collectAsState(RoomListViewState::user)
RoomListContent(
state = state,
roomSummaries = roomSummaries().orEmpty(),
matrixUser = matrixUser,
onRoomClicked = onRoomClicked,
onLogoutClicked = {
viewModel.handle(RoomListActions.Logout)
}
onLogoutClicked = viewModel::logout
)
}
@Composable
fun RoomListContent(
state: RoomListViewState,
roomSummaries: List<RoomSummary>,
matrixUser: MatrixUser,
onRoomClicked: (RoomId) -> Unit,
onLogoutClicked: () -> Unit,
) {
LogCompositions(tag = "RoomListScreen", msg = "Content")
Surface(color = MaterialTheme.colorScheme.background) {
Column(
modifier = Modifier.fillMaxSize()
) {
RoomListTopBar(
state = state,
matrixUser = matrixUser,
onLogoutClicked = onLogoutClicked
)
val rooms = state.rooms
if (rooms is Success) {
LazyColumn {
items(rooms()) { room ->
RoomItem(room = room) {
onRoomClicked(it)
}
LazyColumn {
items(roomSummaries, key = { it.identifier() }) { room ->
RoomItem(room = room) {
onRoomClicked(it)
}
}
}
}
}
@ -70,14 +74,14 @@ fun RoomListContent(
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun RoomListTopBar(state: RoomListViewState, onLogoutClicked: () -> Unit) {
fun RoomListTopBar(matrixUser: MatrixUser, onLogoutClicked: () -> Unit) {
LogCompositions(tag = "RoomListScreen", msg = "TopBar")
TopAppBar(
title = {
Row(
modifier = Modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically
) {
val matrixUser = state.user
Avatar(data = matrixUser.avatarData)
Spacer(modifier = Modifier.width(8.dp))
Text("${matrixUser.username}")

View file

@ -4,6 +4,7 @@ import com.airbnb.mvrx.Fail
import com.airbnb.mvrx.Loading
import com.airbnb.mvrx.MavericksViewModel
import com.airbnb.mvrx.Success
import io.element.android.x.features.roomlist.model.MatrixUser
import io.element.android.x.matrix.MatrixClient
import io.element.android.x.matrix.MatrixInstance
import kotlinx.coroutines.launch
@ -25,6 +26,10 @@ class RoomListViewModel(initialState: RoomListViewState) :
}
}
fun logout(){
handleLogout()
}
private fun handleInit() {
viewModelScope.launch {
val client = getClient()

View file

@ -3,9 +3,8 @@ package io.element.android.x.features.roomlist
import com.airbnb.mvrx.Async
import com.airbnb.mvrx.MavericksState
import com.airbnb.mvrx.Uninitialized
import io.element.android.x.features.roomlist.model.MatrixUser
import io.element.android.x.matrix.room.RoomSummary
import org.matrix.rustcomponents.sdk.Room
import org.matrix.rustcomponents.sdk.UpdateSummary
data class RoomListViewState(
val user: MatrixUser = MatrixUser(),

View file

@ -1,5 +1,8 @@
package io.element.android.x.features.roomlist
package io.element.android.x.features.roomlist.model
import androidx.compose.runtime.Stable
@Stable
data class MatrixUser(
val username: String? = null,
val avatarUrl: String? = null,