156 lines
5.3 KiB
Kotlin
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)
|
|
)
|
|
}
|
|
}
|