153 lines
4.9 KiB
Kotlin
153 lines
4.9 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.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)
|
||
)
|
||
}
|
||
}
|