Refine UI

This commit is contained in:
ganfra 2022-11-03 12:57:49 +01:00
parent eb2fd13518
commit 5984ffc960
8 changed files with 82 additions and 41 deletions

View file

@ -1,3 +1,5 @@
@file:OptIn(ExperimentalMaterial3Api::class)
package io.element.android.x.features.roomlist
import Avatar
@ -19,6 +21,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
@ -63,40 +66,48 @@ fun RoomListContent(
onRoomClicked: (RoomId) -> Unit,
onLogoutClicked: () -> Unit,
) {
val appBarState = rememberTopAppBarState()
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(appBarState)
LogCompositions(tag = "RoomListScreen", msg = "Content")
Surface(color = MaterialTheme.colorScheme.background) {
Column(
modifier = Modifier.fillMaxSize()
) {
RoomListTopBar(
matrixUser = matrixUser,
onLogoutClicked = onLogoutClicked
)
LazyColumn {
items(roomSummaries, key = { it.id }) { room ->
Scaffold(
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = {
RoomListTopBar(matrixUser, onLogoutClicked, scrollBehavior)
},
content = { padding ->
LazyColumn(modifier = Modifier.padding(padding)) {
items(roomSummaries) { room ->
RoomItem(room = room) {
onRoomClicked(it)
}
}
}
}
}
)
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun RoomListTopBar(matrixUser: MatrixUser?, onLogoutClicked: () -> Unit) {
fun RoomListTopBar(
matrixUser: MatrixUser?,
onLogoutClicked: () -> Unit,
scrollBehavior: TopAppBarScrollBehavior
) {
LogCompositions(tag = "RoomListScreen", msg = "TopBar")
if (matrixUser == null) return
TopAppBar(
MediumTopAppBar(
modifier = Modifier
.nestedScroll(scrollBehavior.nestedScrollConnection),
title = {
Row(
modifier = Modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically
) {
Text(
fontWeight = FontWeight.Bold,
text = "All Chats"
)
},
navigationIcon = {
IconButton(onClick = {}) {
Avatar(matrixUser.avatarData)
Spacer(modifier = Modifier.width(8.dp))
Text("${matrixUser.username}")
}
},
actions = {
@ -105,7 +116,8 @@ fun RoomListTopBar(matrixUser: MatrixUser?, onLogoutClicked: () -> Unit) {
) {
Icon(Icons.Default.ExitToApp, contentDescription = "logout")
}
}
},
scrollBehavior = scrollBehavior,
)
}
@ -121,6 +133,7 @@ private fun RoomItem(
Column(
modifier = modifier
.fillMaxWidth()
.height(72.dp)
.clickable(
onClick = { onClick(room.roomId) },
indication = rememberRipple(),
@ -141,7 +154,7 @@ private fun RoomItem(
) {
Text(
fontSize = 16.sp,
fontWeight = FontWeight.Bold,
fontWeight = FontWeight.SemiBold,
text = room.name,
maxLines = 1,
overflow = TextOverflow.Ellipsis
@ -149,6 +162,7 @@ private fun RoomItem(
Text(
text = room.lastMessage?.toString().orEmpty(),
color = MaterialTheme.colorScheme.secondary,
fontSize = 15.sp,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)

View file

@ -1,5 +1,6 @@
package io.element.android.x.features.roomlist
import androidx.compose.ui.unit.dp
import com.airbnb.mvrx.Fail
import com.airbnb.mvrx.Loading
import com.airbnb.mvrx.MavericksViewModel
@ -46,7 +47,7 @@ class RoomListViewModel(initialState: RoomListViewState) :
val userAvatarUrl = client.loadUserAvatarURLString().getOrNull()
val userDisplayName = client.loadUserDisplayName().getOrNull()
val avatarData =
loadAvatarData(client, userDisplayName ?: client.userId().value, userAvatarUrl)
loadAvatarData(client, userDisplayName ?: client.userId().value, userAvatarUrl, 32)
MatrixUser(
username = userDisplayName ?: client.userId().value,
avatarUrl = userAvatarUrl,

View file

@ -3,12 +3,12 @@ package io.element.android.x.features.roomlist.model
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 io.element.android.x.matrix.core.RoomId
data class RoomListViewState(
val user: Async<MatrixUser> = Uninitialized,
val rooms: Async<List<RoomListRoomSummary>> = Uninitialized,
val canLoadMore: Boolean = false,
val logoutAction: Async<Unit> = Uninitialized,
val roomsById: Map<RoomId, RoomListRoomSummary> = emptyMap()
) : MavericksState