Refactor: Update UI elements and navigation

- Removed bottom padding for the logout button in `SettingsScreen`.
- Replaced `Scaffold` with `Column` and removed padding from its content in `SettingsScreen`.
- Removed `Spacer` for status bar height in `ChannelSideDrawer`.
- Updated padding for the server list in `DiscoverServersList`.
- Removed unused `Spacer` at the end of the server list in `DiscoverServersList`.
- Applied inner padding to the `Column` in `ChatRouterScreen`.
- Reordered "Discover" and "Add Server" buttons and updated their styling in `ChannelSideDrawer`.
- Adjusted the server banner height and removed the offset for server info in `ChannelSideDrawer`.
This commit is contained in:
AbronStudio 2025-08-06 11:57:28 +03:30
parent e2efb6b8fa
commit 2c173087a5
4 changed files with 79 additions and 89 deletions

View File

@ -45,7 +45,7 @@ fun DiscoverServersList(
) {
val viewModel = hiltViewModel<DiscoverServersListViewModel>()
val uiState by viewModel.uiState.collectAsState()
// Handle server invite dialog
uiState.selectedInviteCode?.let { inviteCode ->
// Find the server with this invite code
@ -63,10 +63,10 @@ fun DiscoverServersList(
)
}
}
Column(
modifier = Modifier
.padding(vertical = 24.dp, horizontal = 16.dp),
.padding(top = 24.dp, start = 16.dp, end = 16.dp),
horizontalAlignment = Alignment.CenterHorizontally,
) {
Image(
@ -99,12 +99,15 @@ fun DiscoverServersList(
.align(Alignment.CenterHorizontally)
)
}
uiState.error != null -> {
Text(stringResource(R.string.error))
}
uiState.servers.isEmpty() -> {
Text(stringResource(R.string.no_servers_found))
}
else -> {
LazyColumn(
modifier = Modifier
@ -114,25 +117,25 @@ fun DiscoverServersList(
items(uiState.servers) { server ->
// Check if the server is already joined
val isJoined = isServerAlreadyJoined(server.id)
ServerItem(
server = server,
isProcessing = uiState.processingServerId == server.id,
isJoined = isServerAlreadyJoined(server.id),
onClick = {
onClick = {
if (isJoined) {
// If already joined, navigate directly to server channels
onJoinToServerSuccess(server.id)
} else if (server.inviteCode.isNotEmpty()) {
// If not joined, load server data and show invite dialog
viewModel.loadServerDataAndShowDialog(server.inviteCode, server.id)
viewModel.loadServerDataAndShowDialog(
server.inviteCode,
server.id
)
}
}
)
}
item {
Spacer(modifier = Modifier.height(96.dp))
}
}
}
}
@ -145,7 +148,7 @@ private fun isServerAlreadyJoined(serverId: String): Boolean {
}
@Composable
fun ServerItem(
fun ServerItem(
server: ServerData,
isJoined: Boolean,
onClick: () -> Unit,
@ -154,7 +157,7 @@ private fun isServerAlreadyJoined(serverId: String): Boolean {
// Calculate alpha values based on disabled state
val contentAlpha = if (server.disabled) 0.5f else 1.0f
val descriptionAlpha = if (server.disabled) 0.4f else 0.7f
Card(
modifier = Modifier
.fillMaxWidth()
@ -175,7 +178,7 @@ private fun isServerAlreadyJoined(serverId: String): Boolean {
)
)
Spacer(modifier = Modifier.width(12.dp))
Column(
modifier = Modifier.weight(1f)
) {
@ -186,9 +189,9 @@ private fun isServerAlreadyJoined(serverId: String): Boolean {
alpha = contentAlpha
)
)
Spacer(modifier = Modifier.height(4.dp))
Text(
text = server.description,
style = MaterialTheme.typography.bodyMedium,
@ -200,7 +203,7 @@ private fun isServerAlreadyJoined(serverId: String): Boolean {
)
}
Spacer(modifier = Modifier.height(12.dp))
if (isProcessing) {
CircularProgressIndicator(
modifier = Modifier
@ -268,6 +271,7 @@ private fun ServerItemPreview() {
isProcessing = false
)
}
@Preview
@Composable
private fun JoinedServerItemPreview() {

View File

@ -37,6 +37,7 @@ import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.CornerSize
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
@ -96,6 +97,7 @@ import chat.revolt.composables.screens.chat.discover.DiscoverServersList
import chat.revolt.screens.chat.ChatRouterDestination
import chat.revolt.screens.chat.LocalIsConnected
import chat.revolt.sheets.ChannelContextSheet
import com.google.android.material.color.MaterialColors
@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class)
@Composable
@ -203,21 +205,9 @@ fun ChannelSideDrawer(
Modifier.width(64.dp),
verticalArrangement = Arrangement.spacedBy(6.dp),
horizontalAlignment = Alignment.CenterHorizontally,
contentPadding = PaddingValues(
bottom = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding()
)
) {
stickyHeader(key = "self") {
Column(Modifier.background(MaterialTheme.colorScheme.background)) {
AnimatedVisibility(LocalIsConnected.current) {
Spacer(
Modifier
.height(
WindowInsets.statusBars.asPaddingValues()
.calculateTopPadding()
)
)
}
UserAvatar(
username = RevoltAPI.userCache[RevoltAPI.selfId]?.let {
User.resolveDefaultName(
@ -311,6 +301,47 @@ fun ChannelSideDrawer(
)
}
item(key = "discover") {
Box(
Modifier
.padding(8.dp)
.clip(RoundedCornerShape(16.dp))
.clickable {
onDestinationChanged(
ChatRouterDestination.Discover
)
}
.size(48.dp)
.background(MaterialTheme.colorScheme.onPrimary),
contentAlignment = Alignment.Center
) {
Icon(
painter = painterResource(R.drawable.icn_explore_24dp),
contentDescription = stringResource(R.string.discover_alt)
)
}
}
item(key = "add_server") {
Box(
Modifier
.padding(8.dp)
.clip(CircleShape)
.clickable {
onShowAddServerSheet()
}
.size(48.dp)
.background(MaterialTheme.colorScheme.onPrimary),
contentAlignment = Alignment.Center
) {
Icon(
painter = painterResource(R.drawable.icn_add_24dp),
contentDescription = stringResource(R.string.server_plus_alt)
)
}
}
items(
serverList.size,
key = { serverList[it].id ?: it }
@ -385,44 +416,6 @@ fun ChannelSideDrawer(
}
}
item(key = "add_server") {
Box(
Modifier
.padding(8.dp)
.clip(CircleShape)
.clickable {
onShowAddServerSheet()
}
.size(48.dp),
contentAlignment = Alignment.Center
) {
Icon(
painter = painterResource(R.drawable.icn_add_24dp),
contentDescription = stringResource(R.string.server_plus_alt)
)
}
}
item(key = "discover") {
Box(
Modifier
.padding(8.dp)
.clip(CircleShape)
.clickable {
onDestinationChanged(
ChatRouterDestination.Discover
)
}
.size(48.dp),
contentAlignment = Alignment.Center
) {
Icon(
painter = painterResource(R.drawable.icn_explore_24dp),
contentDescription = stringResource(R.string.discover_alt)
)
}
}
if (showSettingsIcon) {
item(key = "settings") {
Box(
@ -457,10 +450,7 @@ fun ChannelSideDrawer(
topEnd = CornerSize(0.dp)
)
)
.height(
serverBannerHeight + WindowInsets.statusBars.asPaddingValues()
.calculateTopPadding()
)
.height(serverBannerHeight)
) {
if (server?.banner != null) {
RemoteImage(
@ -492,8 +482,7 @@ fun ChannelSideDrawer(
Row(
Modifier
.padding(16.dp)
.offset(y = serverInfoOffset),
.padding(16.dp),
verticalAlignment = Alignment.CenterVertically
) {
CompositionLocalProvider(

View File

@ -16,6 +16,7 @@ import androidx.compose.foundation.layout.WindowInsetsSides
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.only
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.systemBars
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.material.icons.Icons
@ -928,7 +929,7 @@ fun ChannelNavigator(
}
}
) { innerPadding ->
Column {
Column(modifier = Modifier.padding(innerPadding)) {
when (dest) {
is ChatRouterDestination.Settings -> {
SettingsScreen(

View File

@ -14,7 +14,6 @@ import androidx.compose.material3.LargeTopAppBar
import androidx.compose.material3.ListItem
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
@ -65,22 +64,20 @@ fun SettingsScreen(
val context = LocalContext.current
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
Scaffold(
Column(
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = {
LargeTopAppBar(
scrollBehavior = scrollBehavior,
title = {
Text(
text = stringResource(R.string.settings),
maxLines = 1,
overflow = TextOverflow.Ellipsis,
)
},
)
},
) { pv ->
Box(Modifier.padding(pv)) {
) {
LargeTopAppBar(
scrollBehavior = scrollBehavior,
title = {
Text(
text = stringResource(R.string.settings),
maxLines = 1,
overflow = TextOverflow.Ellipsis,
)
},
)
Box {
Column(
modifier = Modifier
.fillMaxSize()
@ -377,7 +374,6 @@ fun SettingsScreen(
}
},
modifier = Modifier
.padding(bottom =92.dp)
.testTag("settings_view_logout")
.clickable {
viewModel.logout()