feat: Simplify animations across multiple screens by replacing slide transitions with fade animations for improved user experience

This commit is contained in:
k1ngsterr1
2026-01-18 17:26:04 +05:00
parent 89e5f3cfa2
commit 61995e9286
16 changed files with 506 additions and 399 deletions

View File

@@ -23,8 +23,12 @@ import androidx.compose.animation.core.spring
import androidx.compose.animation.core.tween
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
@@ -350,13 +354,33 @@ fun MainScreen(
onToggleTheme: () -> Unit = {},
onLogout: () -> Unit = {}
) {
val accountName = account?.name ?: "Account"
val accountPhone = account?.publicKey?.take(16)?.let {
// 🔥 КРИТИЧНО: Если account == null, показываем загрузку вместо мокового аккаунта
if (account == null) {
Box(
modifier = Modifier
.fillMaxSize()
.background(if (isDarkTheme) Color(0xFF1B1B1B) else Color.White),
contentAlignment = Alignment.Center
) {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
CircularProgressIndicator()
Spacer(modifier = Modifier.height(16.dp))
Text(
"Loading account...",
color = if (isDarkTheme) Color.White else Color.Black
)
}
}
return
}
val accountName = account.name
val accountPhone = account.publicKey.take(16).let {
"+${it.take(1)} ${it.substring(1, 4)} ${it.substring(4, 7)}${it.substring(7)}"
} ?: "+7 775 9932587"
val accountPublicKey = account?.publicKey ?: "04c266b98ae5"
val accountPrivateKey = account?.privateKey ?: ""
val privateKeyHash = account?.privateKeyHash ?: ""
}
val accountPublicKey = account.publicKey
val accountPrivateKey = account.privateKey
val privateKeyHash = account.privateKeyHash
// Состояние протокола для передачи в SearchScreen
val protocolState by ProtocolManager.state.collectAsState()
@@ -375,72 +399,48 @@ fun MainScreen(
val isExitingSearch = !targetState.second && initialState.second
when {
// 🚀 Вход в чат - быстрый slide справа (как Telegram/iOS)
// Новый экран полностью покрывает старый, никакой прозрачности
// 🚀 Вход в чат - плавный fade
isEnteringChat -> {
slideInHorizontally(
initialOffsetX = { fullWidth -> fullWidth },
animationSpec = spring(
dampingRatio = Spring.DampingRatioNoBouncy,
stiffness = Spring.StiffnessHigh // 🔥 Быстрее для плавности
)
) togetherWith slideOutHorizontally(
targetOffsetX = { fullWidth -> -fullWidth / 5 }, // Меньше смещение
animationSpec = spring(
dampingRatio = Spring.DampingRatioNoBouncy,
stiffness = Spring.StiffnessHigh
)
fadeIn(
animationSpec = tween(200)
) togetherWith fadeOut(
animationSpec = tween(150)
)
}
// 🔙 Выход из чата - обратный slide
// 🔙 Выход из чата - плавный fade
isExitingChat -> {
slideInHorizontally(
initialOffsetX = { fullWidth -> -fullWidth / 5 },
animationSpec = spring(
dampingRatio = Spring.DampingRatioNoBouncy,
stiffness = Spring.StiffnessHigh
)
) togetherWith slideOutHorizontally(
targetOffsetX = { fullWidth -> fullWidth },
animationSpec = spring(
dampingRatio = Spring.DampingRatioNoBouncy,
stiffness = Spring.StiffnessHigh
)
fadeIn(
animationSpec = tween(200)
) togetherWith fadeOut(
animationSpec = tween(150)
)
}
// 🔍 Вход в поиск - быстрый slide справа
// 🔍 Вход в Search - плавный fade
isEnteringSearch -> {
slideInHorizontally(
initialOffsetX = { fullWidth -> fullWidth },
animationSpec = spring(
dampingRatio = Spring.DampingRatioNoBouncy,
stiffness = Spring.StiffnessHigh // 🔥 Быстрее для плавности
)
) togetherWith slideOutHorizontally(
targetOffsetX = { fullWidth -> -fullWidth / 5 }, // Меньше смещение
animationSpec = spring(
dampingRatio = Spring.DampingRatioNoBouncy,
stiffness = Spring.StiffnessHigh
)
fadeIn(
animationSpec = tween(200)
) togetherWith fadeOut(
animationSpec = tween(150)
)
}
// Выход из поиска - обратный slide
// 🔙 Выход из Search - плавный fade
isEnteringSearch -> {
fadeIn(
animationSpec = tween(200)
) togetherWith fadeOut(
animationSpec = tween(150)
)
}
// 🔙 Выход из Search - плавный fade
isExitingSearch -> {
slideInHorizontally(
initialOffsetX = { fullWidth -> -fullWidth / 5 },
animationSpec = spring(
dampingRatio = Spring.DampingRatioNoBouncy,
stiffness = Spring.StiffnessHigh
)
) togetherWith slideOutHorizontally(
targetOffsetX = { fullWidth -> fullWidth },
animationSpec = spring(
dampingRatio = Spring.DampingRatioNoBouncy,
stiffness = Spring.StiffnessHigh
)
fadeIn(
animationSpec = tween(200)
) togetherWith fadeOut(
animationSpec = tween(150)
)
}