feat: Replace custom header with TopAppBar for improved layout and smoother transitions in ChatsListScreen

This commit is contained in:
k1ngsterr1
2026-01-12 16:24:23 +05:00
parent f6c2fd5e1e
commit 718c2e705f
3 changed files with 329 additions and 381 deletions

View File

@@ -24,10 +24,12 @@ import androidx.compose.ui.unit.sp
import com.rosetta.messenger.data.AccountManager
import com.rosetta.messenger.data.DecryptedAccount
import com.rosetta.messenger.data.PreferencesManager
import com.rosetta.messenger.network.ProtocolManager
import com.rosetta.messenger.ui.auth.AccountInfo
import com.rosetta.messenger.ui.auth.AuthFlow
import com.rosetta.messenger.ui.chats.ChatsListScreen
import com.rosetta.messenger.ui.chats.ChatDetailScreen
import com.rosetta.messenger.ui.chats.SearchScreen
import com.rosetta.messenger.network.SearchUser
import com.rosetta.messenger.ui.onboarding.OnboardingScreen
import com.rosetta.messenger.ui.splash.SplashScreen
@@ -218,12 +220,16 @@ fun MainScreen(
val accountPrivateKey = account?.privateKey ?: ""
val privateKeyHash = account?.privateKeyHash ?: ""
// Состояние протокола для передачи в SearchScreen
val protocolState by ProtocolManager.state.collectAsState()
// Навигация между экранами
var selectedUser by remember { mutableStateOf<SearchUser?>(null) }
var showSearchScreen by remember { mutableStateOf(false) }
// Анимированный переход между чатами - плавный crossfade без прыжков
// Анимированный переход между экранами
AnimatedContent(
targetState = selectedUser,
targetState = Triple(selectedUser, showSearchScreen, Unit),
transitionSpec = {
// Плавный crossfade для избежания "прыжков" header'а
val enterAnim = fadeIn(
@@ -232,7 +238,7 @@ fun MainScreen(
easing = FastOutSlowInEasing
)
) + slideInHorizontally(
initialOffsetX = { if (targetState != null) it / 4 else -it / 4 },
initialOffsetX = { it / 4 },
animationSpec = tween(
durationMillis = 300,
easing = FastOutSlowInEasing
@@ -245,7 +251,7 @@ fun MainScreen(
easing = FastOutSlowInEasing
)
) + slideOutHorizontally(
targetOffsetX = { if (targetState != null) -it / 6 else it / 6 },
targetOffsetX = { -it / 6 },
animationSpec = tween(
durationMillis = 300,
easing = FastOutSlowInEasing
@@ -254,58 +260,75 @@ fun MainScreen(
enterAnim togetherWith exitAnim using SizeTransform(clip = false)
},
label = "chatNavigation"
) { user ->
if (user != null) {
// Экран чата
ChatDetailScreen(
user = user,
currentUserPublicKey = accountPublicKey,
currentUserPrivateKey = accountPrivateKey,
isDarkTheme = isDarkTheme,
onBack = { selectedUser = null }
)
} else {
// Список чатов
ChatsListScreen(
isDarkTheme = isDarkTheme,
accountName = accountName,
accountPhone = accountPhone,
accountPublicKey = accountPublicKey,
privateKeyHash = privateKeyHash,
onToggleTheme = onToggleTheme,
onProfileClick = {
// TODO: Navigate to profile
},
onNewGroupClick = {
// TODO: Navigate to new group
},
onContactsClick = {
// TODO: Navigate to contacts
},
onCallsClick = {
// TODO: Navigate to calls
},
onSavedMessagesClick = {
// TODO: Navigate to saved messages
},
onSettingsClick = {
// TODO: Navigate to settings
},
onInviteFriendsClick = {
// TODO: Share invite link
},
onSearchClick = {
// TODO: Show search
},
onNewChat = {
// TODO: Show new chat screen
},
onUserSelect = { user ->
selectedUser = user
},
onLogout = onLogout
)
label = "screenNavigation"
) { (user, isSearchOpen, _) ->
when {
user != null -> {
// Экран чата
ChatDetailScreen(
user = user,
currentUserPublicKey = accountPublicKey,
currentUserPrivateKey = accountPrivateKey,
isDarkTheme = isDarkTheme,
onBack = { selectedUser = null }
)
}
isSearchOpen -> {
// Экран поиска
SearchScreen(
privateKeyHash = privateKeyHash,
currentUserPublicKey = accountPublicKey,
isDarkTheme = isDarkTheme,
protocolState = protocolState,
onBackClick = { showSearchScreen = false },
onUserSelect = { user ->
showSearchScreen = false
selectedUser = user
}
)
}
else -> {
// Список чатов
ChatsListScreen(
isDarkTheme = isDarkTheme,
accountName = accountName,
accountPhone = accountPhone,
accountPublicKey = accountPublicKey,
privateKeyHash = privateKeyHash,
onToggleTheme = onToggleTheme,
onProfileClick = {
// TODO: Navigate to profile
},
onNewGroupClick = {
// TODO: Navigate to new group
},
onContactsClick = {
// TODO: Navigate to contacts
},
onCallsClick = {
// TODO: Navigate to calls
},
onSavedMessagesClick = {
// TODO: Navigate to saved messages
},
onSettingsClick = {
// TODO: Navigate to settings
},
onInviteFriendsClick = {
// TODO: Share invite link
},
onSearchClick = {
showSearchScreen = true
},
onNewChat = {
// TODO: Show new chat screen
},
onUserSelect = { user ->
selectedUser = user
},
onLogout = onLogout
)
}
}
}
}