Files
forkmessager/client-mobile/core/presentation/components/GlassNavigationBar.kt
Халимов Рустам 58bbdae26c Настройки
2026-04-14 11:46:55 +03:00

153 lines
4.9 KiB
Kotlin
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package core.presentation.components
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.AccountCircle
import androidx.compose.material.icons.filled.QuestionAnswer
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.draw.blur
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import ru.knot.messager.R
@Composable
fun GlassNavigationBar(
currentRoute: String,
onNavigate: (String) -> Unit,
userAvatarUrl: String? = null,
username: String = ""
) {
// Контейнер с эффектом стекла
Box(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp, vertical = 12.dp)
.height(64.dp)
.clip(RoundedCornerShape(32.dp))
.background(Color(0xFF1C1C1E).copy(alpha = 0.95f))
.border(
0.5.dp,
Color.White.copy(alpha = 0.1f),
RoundedCornerShape(32.dp)
),
contentAlignment = Alignment.Center
) {
Row(
modifier = Modifier.fillMaxSize(),
horizontalArrangement = Arrangement.SpaceEvenly,
verticalAlignment = Alignment.CenterVertically
) {
NavItem(
icon = Icons.Default.QuestionAnswer,
label = stringResource(R.string.chats),
isSelected = currentRoute == "chat_list",
onClick = { onNavigate("chat_list") }
)
NavItem(
icon = Icons.Default.AccountCircle,
label = stringResource(R.string.contacts_tab),
isSelected = currentRoute == "contacts",
onClick = { onNavigate("contacts") }
)
NavItem(
icon = Icons.Default.Settings,
label = stringResource(R.string.settings),
isSelected = currentRoute == "settings",
onClick = { onNavigate("settings") }
)
// Профиль с аватаром
ProfileNavItem(
avatarUrl = userAvatarUrl,
username = username,
isSelected = currentRoute.startsWith("profile"),
onClick = { onNavigate("profile") }
)
}
}
}
@Composable
private fun RowScope.NavItem(
icon: ImageVector,
label: String,
isSelected: Boolean,
onClick: () -> Unit
) {
val contentColor = if (isSelected) Color(0xFF3390EC) else Color(0xFF94A3B8)
Column(
modifier = Modifier
.weight(1f)
.clickable(onClick = onClick)
.padding(vertical = 4.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Icon(
icon,
contentDescription = label,
tint = contentColor,
modifier = Modifier.size(26.dp)
)
Text(
text = label,
color = contentColor,
fontSize = 10.sp,
fontWeight = if (isSelected) FontWeight.Bold else FontWeight.Normal,
modifier = Modifier.padding(top = 2.dp)
)
}
}
@Composable
private fun RowScope.ProfileNavItem(
avatarUrl: String?,
username: String,
isSelected: Boolean,
onClick: () -> Unit
) {
val contentColor = if (isSelected) Color(0xFF3390EC) else Color(0xFF94A3B8)
Column(
modifier = Modifier
.weight(1f)
.clickable(onClick = onClick)
.padding(vertical = 4.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Box(
modifier = Modifier
.size(26.dp)
.clip(CircleShape)
) {
AppAvatar(
url = avatarUrl,
name = username,
size = 26.dp
)
}
Text(
text = stringResource(R.string.profile_tab),
color = contentColor,
fontSize = 10.sp,
fontWeight = if (isSelected) FontWeight.Bold else FontWeight.Normal,
modifier = Modifier.padding(top = 2.dp)
)
}
}