pre-warm up the main screens when the application is launched

This commit is contained in:
2025-05-11 22:36:41 +03:00
parent 628b93e4ab
commit b63cc86e48
6 changed files with 43 additions and 32 deletions
@@ -1,8 +1,6 @@
package dev.meloda.fast.conversations.navigation
import androidx.activity.compose.LocalActivity
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.ui.platform.LocalContext
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import androidx.navigation.navigation
@@ -13,7 +11,7 @@ import dev.meloda.fast.model.ConversationsFilter
import dev.meloda.fast.ui.theme.LocalNavController
import dev.meloda.fast.ui.theme.getOrThrow
import kotlinx.serialization.Serializable
import org.koin.androidx.compose.koinViewModel
import org.koin.androidx.viewmodel.ext.android.getViewModel
import org.koin.core.qualifier.named
@Serializable
@@ -26,6 +24,7 @@ object Conversations
object Archive
fun NavGraphBuilder.conversationsGraph(
activity: AppCompatActivity,
onError: (BaseError) -> Unit,
onNavigateToMessagesHistory: (id: Long) -> Unit,
onNavigateToCreateChat: () -> Unit,
@@ -34,17 +33,18 @@ fun NavGraphBuilder.conversationsGraph(
navigation<ConversationsGraph>(
startDestination = Conversations
) {
val conversationsViewModel: ConversationsViewModelImpl = with(activity) {
getViewModel(qualifier = named(ConversationsFilter.ALL))
}
val archiveViewModel: ConversationsViewModelImpl = with(activity) {
getViewModel(qualifier = named(ConversationsFilter.ARCHIVE))
}
composable<Conversations> {
val context = LocalContext.current
val navController = LocalNavController.getOrThrow()
val viewModel: ConversationsViewModelImpl = koinViewModel(
qualifier = named(ConversationsFilter.ALL),
viewModelStoreOwner = context as AppCompatActivity
)
ConversationsRoute(
viewModel = viewModel,
viewModel = conversationsViewModel,
onError = onError,
onNavigateToMessagesHistory = onNavigateToMessagesHistory,
onNavigateToCreateChat = onNavigateToCreateChat,
@@ -53,16 +53,10 @@ fun NavGraphBuilder.conversationsGraph(
)
}
composable<Archive> {
val context = LocalContext.current
val navController = LocalNavController.getOrThrow()
val viewModel: ConversationsViewModelImpl = koinViewModel(
qualifier = named(ConversationsFilter.ARCHIVE),
viewModelStoreOwner = context as AppCompatActivity
)
ConversationsRoute(
viewModel = viewModel,
viewModel = archiveViewModel,
onBack = navController::navigateUp,
onError = onError,
onNavigateToMessagesHistory = onNavigateToMessagesHistory,
@@ -1,22 +1,37 @@
package dev.meloda.fast.friends.navigation
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import dev.meloda.fast.friends.FriendsViewModel
import dev.meloda.fast.friends.FriendsViewModelImpl
import dev.meloda.fast.friends.OnlineFriendsViewModelImpl
import dev.meloda.fast.friends.presentation.FriendsRoute
import dev.meloda.fast.model.BaseError
import kotlinx.serialization.Serializable
import org.koin.androidx.viewmodel.ext.android.getViewModel
@Serializable
object Friends
fun NavGraphBuilder.friendsScreen(
activity: AppCompatActivity,
onError: (BaseError) -> Unit,
onPhotoClicked: (url: String) -> Unit,
onMessageClicked: (userid: Long) -> Unit,
onMessageClicked: (userId: Long) -> Unit,
onScrolledToTop: () -> Unit
) {
val friendsViewModel: FriendsViewModel = with(activity) {
getViewModel<FriendsViewModelImpl>()
}
val onlineFriendsViewModel: FriendsViewModel = with(activity) {
getViewModel<OnlineFriendsViewModelImpl>()
}
composable<Friends> {
FriendsRoute(
friendsViewModel = friendsViewModel,
onlineFriendsViewModel = onlineFriendsViewModel,
onError = onError,
onPhotoClicked = onPhotoClicked,
onMessageClicked = onMessageClicked,
@@ -46,6 +46,7 @@ import org.koin.androidx.compose.koinViewModel
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun FriendsScreen(
viewModel: FriendsViewModel,
modifier: Modifier = Modifier,
orderType: String,
padding: PaddingValues,
@@ -57,12 +58,6 @@ fun FriendsScreen(
onScrolledToTop: () -> Unit = {}
) {
val context: Context = LocalContext.current
val viewModel: FriendsViewModel =
if (tabIndex == 0) {
koinViewModel<FriendsViewModelImpl>(viewModelStoreOwner = context as AppCompatActivity)
} else {
koinViewModel<OnlineFriendsViewModelImpl>(viewModelStoreOwner = context as AppCompatActivity)
}
LaunchedEffect(orderType) {
viewModel.onOrderTypeChanged(orderType)
@@ -40,6 +40,7 @@ import androidx.compose.ui.unit.dp
import dev.chrisbanes.haze.hazeEffect
import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
import dev.chrisbanes.haze.materials.HazeMaterials
import dev.meloda.fast.friends.FriendsViewModel
import dev.meloda.fast.model.BaseError
import dev.meloda.fast.ui.R
import dev.meloda.fast.ui.components.ActionInvokeDismiss
@@ -55,6 +56,8 @@ import dev.meloda.fast.ui.R as UiR
@OptIn(ExperimentalMaterial3Api::class, ExperimentalHazeMaterialsApi::class)
@Composable
fun FriendsRoute(
friendsViewModel: FriendsViewModel,
onlineFriendsViewModel: FriendsViewModel,
onError: (BaseError) -> Unit,
onPhotoClicked: (url: String) -> Unit,
onMessageClicked: (userid: Long) -> Unit,
@@ -231,6 +234,7 @@ fun FriendsRoute(
modifier = Modifier.fillMaxSize(),
) { index ->
FriendsScreen(
viewModel = if (index == 0) friendsViewModel else onlineFriendsViewModel,
orderType = orderType,
padding = padding,
tabIndex = index,
@@ -1,7 +1,6 @@
package dev.meloda.fast.profile.navigation
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.ui.platform.LocalContext
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import dev.meloda.fast.model.BaseError
@@ -9,22 +8,21 @@ import dev.meloda.fast.profile.ProfileViewModel
import dev.meloda.fast.profile.ProfileViewModelImpl
import dev.meloda.fast.profile.presentation.ProfileRoute
import kotlinx.serialization.Serializable
import org.koin.androidx.compose.koinViewModel
import org.koin.androidx.viewmodel.ext.android.getViewModel
@Serializable
object Profile
fun NavGraphBuilder.profileScreen(
activity: AppCompatActivity,
onError: (BaseError) -> Unit,
onSettingsButtonClicked: () -> Unit,
onPhotoClicked: (url: String) -> Unit
) {
val viewModel: ProfileViewModel = with(activity) {
getViewModel<ProfileViewModelImpl>()
}
composable<Profile> {
val context = LocalContext.current
val viewModel: ProfileViewModel = koinViewModel<ProfileViewModelImpl>(
viewModelStoreOwner = context as AppCompatActivity
)
ProfileRoute(
onError = onError,
onSettingsButtonClicked = onSettingsButtonClicked,