feat: enhance versioning and avatar handling with dynamic properties and improved UI interactions
This commit is contained in:
@@ -39,6 +39,7 @@ import com.rosetta.messenger.ui.auth.AccountInfo
|
||||
import com.rosetta.messenger.ui.auth.AuthFlow
|
||||
import com.rosetta.messenger.ui.chats.ChatDetailScreen
|
||||
import com.rosetta.messenger.ui.chats.ChatsListScreen
|
||||
import com.rosetta.messenger.ui.chats.RequestsListScreen
|
||||
import com.rosetta.messenger.ui.chats.SearchScreen
|
||||
import com.rosetta.messenger.ui.components.OptimizedEmojiCache
|
||||
import com.rosetta.messenger.ui.components.SwipeBackContainer
|
||||
@@ -484,6 +485,7 @@ class MainActivity : FragmentActivity() {
|
||||
*/
|
||||
sealed class Screen {
|
||||
data object Profile : Screen()
|
||||
data object Requests : Screen()
|
||||
data object Search : Screen()
|
||||
data class ChatDetail(val user: SearchUser) : Screen()
|
||||
data class OtherProfile(val user: SearchUser) : Screen()
|
||||
@@ -564,6 +566,7 @@ fun MainScreen(
|
||||
|
||||
// Derived visibility — only triggers recomposition when THIS screen changes
|
||||
val isProfileVisible by remember { derivedStateOf { navStack.any { it is Screen.Profile } } }
|
||||
val isRequestsVisible by remember { derivedStateOf { navStack.any { it is Screen.Requests } } }
|
||||
val isSearchVisible by remember { derivedStateOf { navStack.any { it is Screen.Search } } }
|
||||
val chatDetailScreen by remember {
|
||||
derivedStateOf { navStack.filterIsInstance<Screen.ChatDetail>().lastOrNull() }
|
||||
@@ -616,6 +619,8 @@ fun MainScreen(
|
||||
val profileViewModel: com.rosetta.messenger.ui.settings.ProfileViewModel =
|
||||
androidx.lifecycle.viewmodel.compose.viewModel()
|
||||
val profileState by profileViewModel.state.collectAsState()
|
||||
val chatsListViewModel: com.rosetta.messenger.ui.chats.ChatsListViewModel =
|
||||
androidx.lifecycle.viewmodel.compose.viewModel()
|
||||
|
||||
// Appearance: background blur color preference
|
||||
val prefsManager = remember { com.rosetta.messenger.data.PreferencesManager(context) }
|
||||
@@ -682,6 +687,7 @@ fun MainScreen(
|
||||
// TODO: Share invite link
|
||||
},
|
||||
onSearchClick = { pushScreen(Screen.Search) },
|
||||
onRequestsClick = { pushScreen(Screen.Requests) },
|
||||
onNewChat = {
|
||||
// TODO: Show new chat screen
|
||||
},
|
||||
@@ -693,10 +699,29 @@ fun MainScreen(
|
||||
onTogglePin = { opponentKey ->
|
||||
mainScreenScope.launch { prefsManager.togglePinChat(opponentKey) }
|
||||
},
|
||||
chatsViewModel = chatsListViewModel,
|
||||
avatarRepository = avatarRepository,
|
||||
onLogout = onLogout
|
||||
)
|
||||
|
||||
SwipeBackContainer(
|
||||
isVisible = isRequestsVisible,
|
||||
onBack = { navStack = navStack.filterNot { it is Screen.Requests } },
|
||||
isDarkTheme = isDarkTheme
|
||||
) {
|
||||
RequestsListScreen(
|
||||
isDarkTheme = isDarkTheme,
|
||||
chatsViewModel = chatsListViewModel,
|
||||
onBack = { navStack = navStack.filterNot { it is Screen.Requests } },
|
||||
onUserSelect = { selectedRequestUser ->
|
||||
navStack =
|
||||
navStack.filterNot {
|
||||
it is Screen.Requests || it is Screen.ChatDetail
|
||||
} + Screen.ChatDetail(selectedRequestUser)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
// Profile Screen — MUST be before sub-screens so it stays
|
||||
// visible beneath them during swipe-back animation
|
||||
|
||||
Reference in New Issue
Block a user