feat: enhance RequestsSection layout and add full-screen avatar viewer in ProfileScreen

This commit is contained in:
2026-02-13 13:39:00 +05:00
parent 899d79c9fd
commit e17b03c1c5
6 changed files with 660 additions and 234 deletions

View File

@@ -627,6 +627,7 @@ fun ChatsListScreen(
iconColor = menuIconColor,
textColor = textColor,
badge = if (topLevelRequestsCount > 0) topLevelRequestsCount.toString() else null,
badgeColor = accentColor,
onClick = {
scope.launch {
drawerState.close()
@@ -913,7 +914,7 @@ fun ChatsListScreen(
.offset(x = 2.dp, y = (-2).dp)
.size(8.dp)
.clip(CircleShape)
.background(Color(0xFFE53935))
.background(if (isDarkTheme) PrimaryBlueDark else PrimaryBlue)
)
}
}
@@ -2870,7 +2871,7 @@ fun TypingIndicatorSmall() {
}
}
/** 📬 Секция Requests — Telegram-style chat item (как Archived Chats) */
/** 📬 Секция Requests — Telegram Archived Chats style */
@Composable
fun RequestsSection(
count: Int,
@@ -2883,6 +2884,7 @@ fun RequestsSection(
remember(isDarkTheme) { if (isDarkTheme) Color(0xFF8E8E93) else Color(0xFF666666) }
val iconBgColor =
remember(isDarkTheme) { if (isDarkTheme) Color(0xFF3A3A3C) else Color(0xFFC7C7CC) }
val accentColor = if (isDarkTheme) PrimaryBlueDark else PrimaryBlue
// Последний запрос — показываем имя отправителя как subtitle
val lastRequest = remember(requests) { requests.firstOrNull() }
@@ -2899,74 +2901,58 @@ fun RequestsSection(
}
}
Row(
modifier =
Modifier.fillMaxWidth()
.clickable(onClick = onClick)
.padding(horizontal = 16.dp, vertical = 12.dp),
verticalAlignment = Alignment.CenterVertically
) {
// Иконка — круглый аватар как в Telegram Archived Chats
Box(
Column {
Row(
modifier =
Modifier.size(56.dp)
.clip(CircleShape)
.background(iconBgColor),
contentAlignment = Alignment.Center
Modifier.fillMaxWidth()
.clickable(onClick = onClick)
.padding(horizontal = 16.dp, vertical = 12.dp),
verticalAlignment = Alignment.CenterVertically
) {
Icon(
imageVector = TablerIcons.MailForward,
contentDescription = null,
tint = Color.White,
modifier = Modifier.size(26.dp)
)
}
Spacer(modifier = Modifier.width(12.dp))
// Текст: название + последний отправитель
Column(modifier = Modifier.weight(1f)) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
// Иконка — круглый аватар как Archived Chats в Telegram
Box(
modifier =
Modifier.size(56.dp)
.clip(CircleShape)
.background(iconBgColor),
contentAlignment = Alignment.Center
) {
Text(
text = "Requests",
fontWeight = FontWeight.SemiBold,
fontSize = 16.sp,
color = textColor,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
modifier = Modifier.weight(1f)
Icon(
imageVector = TablerIcons.MailForward,
contentDescription = null,
tint = Color.White,
modifier = Modifier.size(26.dp)
)
}
if (subtitle.isNotEmpty()) {
Spacer(modifier = Modifier.height(4.dp))
Spacer(modifier = Modifier.width(12.dp))
Column(modifier = Modifier.weight(1f)) {
// Верхняя строка: название + badge
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
Text(
text = subtitle,
fontSize = 14.sp,
color = secondaryTextColor,
text = "Requests",
fontWeight = FontWeight.SemiBold,
fontSize = 16.sp,
color = textColor,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
modifier = Modifier.weight(1f)
)
// Badge с количеством
// Badge справа на уровне заголовка
if (count > 0) {
Spacer(modifier = Modifier.width(8.dp))
Box(
modifier =
Modifier
.defaultMinSize(minWidth = 22.dp, minHeight = 22.dp)
.clip(RoundedCornerShape(11.dp))
.background(Color(0xFFE53935)),
.clip(CircleShape)
.background(accentColor),
contentAlignment = Alignment.Center
) {
Text(
@@ -2974,37 +2960,33 @@ fun RequestsSection(
fontSize = 12.sp,
fontWeight = FontWeight.Bold,
color = Color.White,
modifier = Modifier.padding(horizontal = 5.dp, vertical = 1.dp)
lineHeight = 12.sp,
modifier = Modifier.padding(horizontal = 5.dp, vertical = 3.dp)
)
}
}
}
} else if (count > 0) {
// Если нет subtitle но есть count
Spacer(modifier = Modifier.height(4.dp))
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.End
) {
Box(
modifier =
Modifier
.defaultMinSize(minWidth = 22.dp, minHeight = 22.dp)
.clip(RoundedCornerShape(11.dp))
.background(Color(0xFFE53935)),
contentAlignment = Alignment.Center
) {
Text(
text = if (count > 99) "99+" else count.toString(),
fontSize = 12.sp,
fontWeight = FontWeight.Bold,
color = Color.White,
modifier = Modifier.padding(horizontal = 5.dp, vertical = 1.dp)
)
}
// Нижняя строка: subtitle (последний запрос)
if (subtitle.isNotEmpty()) {
Spacer(modifier = Modifier.height(4.dp))
Text(
text = subtitle,
fontSize = 14.sp,
color = secondaryTextColor,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
}
}
}
// Разделитель как у обычных чатов
Divider(
color = if (isDarkTheme) Color(0xFF3A3A3A) else Color(0xFFE8E8E8),
thickness = 0.5.dp,
modifier = Modifier.padding(start = 84.dp)
)
}
}
@@ -3208,6 +3190,7 @@ fun DrawerMenuItemEnhanced(
iconColor: Color,
textColor: Color,
badge: String? = null,
badgeColor: Color = Color(0xFFE53935),
onClick: () -> Unit
) {
Row(
@@ -3237,17 +3220,21 @@ fun DrawerMenuItemEnhanced(
badge?.let {
Box(
modifier =
Modifier.background(
color = Color(0xFFE53935),
shape = RoundedCornerShape(10.dp)
)
.padding(horizontal = 8.dp, vertical = 2.dp)
Modifier
.defaultMinSize(minWidth = 22.dp, minHeight = 22.dp)
.background(
color = badgeColor,
shape = CircleShape
),
contentAlignment = Alignment.Center
) {
Text(
text = it,
fontSize = 12.sp,
fontWeight = FontWeight.Medium,
color = Color.White
fontWeight = FontWeight.Bold,
color = Color.White,
lineHeight = 12.sp,
modifier = Modifier.padding(horizontal = 5.dp, vertical = 3.dp)
)
}
}

View File

@@ -42,6 +42,7 @@ fun RequestsListScreen(
val blockedUsers by chatsViewModel.blockedUsers.collectAsState()
val scope = rememberCoroutineScope()
val backgroundColor = if (isDarkTheme) Color(0xFF1A1A1A) else Color(0xFFF2F2F7)
val headerColor = if (isDarkTheme) Color(0xFF2A2A2A) else Color(0xFF0D8CF4)
val textColor = if (isDarkTheme) Color.White else Color.Black
Scaffold(
@@ -61,15 +62,16 @@ fun RequestsListScreen(
text = "Requests",
fontWeight = FontWeight.Bold,
fontSize = 20.sp,
color = textColor
color = Color.White
)
},
colors =
TopAppBarDefaults.topAppBarColors(
containerColor = backgroundColor,
scrolledContainerColor = backgroundColor,
navigationIconContentColor = textColor,
titleContentColor = textColor
containerColor = headerColor,
scrolledContainerColor = headerColor,
navigationIconContentColor = Color.White,
titleContentColor = Color.White,
actionIconContentColor = Color.White
)
)
},