Files
forkmessager/client-mobile/core/presentation/components/GlassNavigationBar.kt
T

156 lines
5.3 KiB
Kotlin

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.ChatBubble
import androidx.compose.material.icons.filled.People
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.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 = 24.dp, vertical = 16.dp)
.height(72.dp)
.clip(RoundedCornerShape(32.dp))
.background(
Brush.verticalGradient(
colors = listOf(
MaterialTheme.colorScheme.surface.copy(alpha = 0.7f),
MaterialTheme.colorScheme.surface.copy(alpha = 0.5f)
)
)
)
.border(
1.dp,
Brush.verticalGradient(
colors = listOf(
Color.White.copy(alpha = 0.2f),
Color.Transparent
)
),
RoundedCornerShape(32.dp)
),
contentAlignment = Alignment.Center
) {
Row(
modifier = Modifier.fillMaxSize(),
horizontalArrangement = Arrangement.SpaceEvenly,
verticalAlignment = Alignment.CenterVertically
) {
NavItem(
icon = Icons.Default.ChatBubble,
label = stringResource(R.string.chats),
isSelected = currentRoute == "chat_list",
onClick = { onNavigate("chat_list") }
)
NavItem(
icon = Icons.Default.People,
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 NavItem(
icon: ImageVector,
label: String,
isSelected: Boolean,
onClick: () -> Unit
) {
val contentColor = if (isSelected) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant
val backgroundColor = if (isSelected) MaterialTheme.colorScheme.primary.copy(alpha = 0.1f) else Color.Transparent
Column(
modifier = Modifier
.clip(RoundedCornerShape(20.dp))
.background(backgroundColor)
.clickable(onClick = onClick)
.padding(horizontal = 12.dp, vertical = 8.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Icon(icon, contentDescription = label, tint = contentColor, modifier = Modifier.size(24.dp))
Text(text = label, color = contentColor, fontSize = 10.sp, modifier = Modifier.padding(top = 2.dp))
}
}
@Composable
private fun ProfileNavItem(
avatarUrl: String?,
username: String,
isSelected: Boolean,
onClick: () -> Unit
) {
val borderColor = if (isSelected) MaterialTheme.colorScheme.primary else Color.Transparent
Column(
modifier = Modifier
.clip(RoundedCornerShape(20.dp))
.clickable(onClick = onClick)
.padding(horizontal = 12.dp, vertical = 8.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Box(
modifier = Modifier
.size(28.dp)
.border(2.dp, borderColor, CircleShape)
.padding(2.dp)
) {
AppAvatar(
url = avatarUrl,
name = username,
size = 24.dp
)
}
Text(
text = stringResource(R.string.profile_tab),
color = if (isSelected) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant,
fontSize = 10.sp,
modifier = Modifier.padding(top = 2.dp)
)
}
}