forked from melod1n/fast-messenger
m3 expressive theme and full screen loader
revert pre-loading non-main screens
This commit is contained in:
@@ -3,12 +3,15 @@ package dev.meloda.fast.ui.components
|
|||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.navigationBarsPadding
|
import androidx.compose.foundation.layout.navigationBarsPadding
|
||||||
import androidx.compose.material3.CircularProgressIndicator
|
import androidx.compose.material3.ContainedLoadingIndicator
|
||||||
|
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
|
||||||
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
|
||||||
|
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun FullScreenLoader(modifier: Modifier = Modifier) {
|
fun FullScreenLoader(modifier: Modifier = Modifier) {
|
||||||
Box(
|
Box(
|
||||||
@@ -17,7 +20,10 @@ fun FullScreenLoader(modifier: Modifier = Modifier) {
|
|||||||
.navigationBarsPadding(),
|
.navigationBarsPadding(),
|
||||||
contentAlignment = Alignment.Center
|
contentAlignment = Alignment.Center
|
||||||
) {
|
) {
|
||||||
CircularProgressIndicator()
|
ContainedLoadingIndicator(
|
||||||
|
containerColor = MaterialTheme.colorScheme.primary,
|
||||||
|
indicatorColor = MaterialTheme.colorScheme.primaryContainer
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import android.app.Activity
|
|||||||
import android.os.Build
|
import android.os.Build
|
||||||
import androidx.compose.animation.animateColorAsState
|
import androidx.compose.animation.animateColorAsState
|
||||||
import androidx.compose.material3.ColorScheme
|
import androidx.compose.material3.ColorScheme
|
||||||
|
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
|
||||||
|
import androidx.compose.material3.MaterialExpressiveTheme
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material3.darkColorScheme
|
import androidx.compose.material3.darkColorScheme
|
||||||
import androidx.compose.material3.dynamicDarkColorScheme
|
import androidx.compose.material3.dynamicDarkColorScheme
|
||||||
@@ -142,6 +144,7 @@ fun <T: NavController> ProvidableCompositionLocal<T?>.getOrThrow(): T {
|
|||||||
return requireNotNull(current)
|
return requireNotNull(current)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun AppTheme(
|
fun AppTheme(
|
||||||
predefinedColorScheme: ColorScheme? = null,
|
predefinedColorScheme: ColorScheme? = null,
|
||||||
@@ -213,7 +216,7 @@ fun AppTheme(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MaterialTheme(
|
MaterialExpressiveTheme(
|
||||||
colorScheme = (predefinedColorScheme ?: colorScheme)
|
colorScheme = (predefinedColorScheme ?: colorScheme)
|
||||||
.copy(
|
.copy(
|
||||||
primary = colorPrimary,
|
primary = colorPrimary,
|
||||||
|
|||||||
+5
-5
@@ -36,10 +36,6 @@ fun NavGraphBuilder.conversationsGraph(
|
|||||||
val conversationsViewModel: ConversationsViewModelImpl = with(activity) {
|
val conversationsViewModel: ConversationsViewModelImpl = with(activity) {
|
||||||
getViewModel(qualifier = named(ConversationsFilter.ALL))
|
getViewModel(qualifier = named(ConversationsFilter.ALL))
|
||||||
}
|
}
|
||||||
val archiveViewModel: ConversationsViewModelImpl = with(activity) {
|
|
||||||
getViewModel(qualifier = named(ConversationsFilter.ARCHIVE))
|
|
||||||
}
|
|
||||||
|
|
||||||
composable<Conversations> {
|
composable<Conversations> {
|
||||||
val navController = LocalNavController.getOrThrow()
|
val navController = LocalNavController.getOrThrow()
|
||||||
|
|
||||||
@@ -56,7 +52,11 @@ fun NavGraphBuilder.conversationsGraph(
|
|||||||
val navController = LocalNavController.getOrThrow()
|
val navController = LocalNavController.getOrThrow()
|
||||||
|
|
||||||
ConversationsRoute(
|
ConversationsRoute(
|
||||||
viewModel = archiveViewModel,
|
viewModel = with(activity) {
|
||||||
|
getViewModel<ConversationsViewModelImpl>(
|
||||||
|
qualifier = named(ConversationsFilter.ARCHIVE)
|
||||||
|
)
|
||||||
|
},
|
||||||
onBack = navController::navigateUp,
|
onBack = navController::navigateUp,
|
||||||
onError = onError,
|
onError = onError,
|
||||||
onNavigateToMessagesHistory = onNavigateToMessagesHistory,
|
onNavigateToMessagesHistory = onNavigateToMessagesHistory,
|
||||||
|
|||||||
+3
-4
@@ -25,6 +25,7 @@ import androidx.compose.material.icons.rounded.Refresh
|
|||||||
import androidx.compose.material3.DropdownMenu
|
import androidx.compose.material3.DropdownMenu
|
||||||
import androidx.compose.material3.DropdownMenuItem
|
import androidx.compose.material3.DropdownMenuItem
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
|
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
|
||||||
import androidx.compose.material3.FloatingActionButton
|
import androidx.compose.material3.FloatingActionButton
|
||||||
import androidx.compose.material3.HorizontalDivider
|
import androidx.compose.material3.HorizontalDivider
|
||||||
import androidx.compose.material3.Icon
|
import androidx.compose.material3.Icon
|
||||||
@@ -62,7 +63,6 @@ import dev.chrisbanes.haze.hazeSource
|
|||||||
import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
|
import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
|
||||||
import dev.chrisbanes.haze.materials.HazeMaterials
|
import dev.chrisbanes.haze.materials.HazeMaterials
|
||||||
import dev.meloda.fast.conversations.model.ConversationsScreenState
|
import dev.meloda.fast.conversations.model.ConversationsScreenState
|
||||||
import dev.meloda.fast.conversations.navigation.Conversations
|
|
||||||
import dev.meloda.fast.conversations.navigation.ConversationsGraph
|
import dev.meloda.fast.conversations.navigation.ConversationsGraph
|
||||||
import dev.meloda.fast.model.BaseError
|
import dev.meloda.fast.model.BaseError
|
||||||
import dev.meloda.fast.ui.components.FullScreenLoader
|
import dev.meloda.fast.ui.components.FullScreenLoader
|
||||||
@@ -79,12 +79,11 @@ import dev.meloda.fast.ui.util.emptyImmutableList
|
|||||||
import dev.meloda.fast.ui.util.isScrollingUp
|
import dev.meloda.fast.ui.util.isScrollingUp
|
||||||
import kotlinx.coroutines.flow.collectLatest
|
import kotlinx.coroutines.flow.collectLatest
|
||||||
import kotlinx.coroutines.flow.debounce
|
import kotlinx.coroutines.flow.debounce
|
||||||
|
|
||||||
import dev.meloda.fast.ui.R as UiR
|
import dev.meloda.fast.ui.R as UiR
|
||||||
|
|
||||||
@OptIn(
|
@OptIn(
|
||||||
ExperimentalMaterial3Api::class,
|
ExperimentalMaterial3Api::class,
|
||||||
ExperimentalHazeMaterialsApi::class,
|
ExperimentalHazeMaterialsApi::class, ExperimentalMaterial3ExpressiveApi::class,
|
||||||
)
|
)
|
||||||
@Composable
|
@Composable
|
||||||
fun ConversationsScreen(
|
fun ConversationsScreen(
|
||||||
@@ -117,7 +116,7 @@ fun ConversationsScreen(
|
|||||||
initialFirstVisibleItemScrollOffset = screenState.scrollOffset
|
initialFirstVisibleItemScrollOffset = screenState.scrollOffset
|
||||||
)
|
)
|
||||||
|
|
||||||
val currentTabReselected = LocalReselectedTab.current[ConversationsGraph] ?: false
|
val currentTabReselected = LocalReselectedTab.current[ConversationsGraph] == true
|
||||||
LaunchedEffect(currentTabReselected) {
|
LaunchedEffect(currentTabReselected) {
|
||||||
if (currentTabReselected) {
|
if (currentTabReselected) {
|
||||||
if (screenState.isArchive) {
|
if (screenState.isArchive) {
|
||||||
|
|||||||
+1
-5
@@ -5,7 +5,6 @@ import androidx.navigation.NavGraphBuilder
|
|||||||
import androidx.navigation.compose.composable
|
import androidx.navigation.compose.composable
|
||||||
import dev.meloda.fast.friends.FriendsViewModel
|
import dev.meloda.fast.friends.FriendsViewModel
|
||||||
import dev.meloda.fast.friends.FriendsViewModelImpl
|
import dev.meloda.fast.friends.FriendsViewModelImpl
|
||||||
import dev.meloda.fast.friends.OnlineFriendsViewModelImpl
|
|
||||||
import dev.meloda.fast.friends.presentation.FriendsRoute
|
import dev.meloda.fast.friends.presentation.FriendsRoute
|
||||||
import dev.meloda.fast.model.BaseError
|
import dev.meloda.fast.model.BaseError
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
@@ -24,14 +23,11 @@ fun NavGraphBuilder.friendsScreen(
|
|||||||
val friendsViewModel: FriendsViewModel = with(activity) {
|
val friendsViewModel: FriendsViewModel = with(activity) {
|
||||||
getViewModel<FriendsViewModelImpl>()
|
getViewModel<FriendsViewModelImpl>()
|
||||||
}
|
}
|
||||||
val onlineFriendsViewModel: FriendsViewModel = with(activity) {
|
|
||||||
getViewModel<OnlineFriendsViewModelImpl>()
|
|
||||||
}
|
|
||||||
|
|
||||||
composable<Friends> {
|
composable<Friends> {
|
||||||
FriendsRoute(
|
FriendsRoute(
|
||||||
|
activity = activity,
|
||||||
friendsViewModel = friendsViewModel,
|
friendsViewModel = friendsViewModel,
|
||||||
onlineFriendsViewModel = onlineFriendsViewModel,
|
|
||||||
onError = onError,
|
onError = onError,
|
||||||
onPhotoClicked = onPhotoClicked,
|
onPhotoClicked = onPhotoClicked,
|
||||||
onMessageClicked = onMessageClicked,
|
onMessageClicked = onMessageClicked,
|
||||||
|
|||||||
+7
-2
@@ -1,5 +1,6 @@
|
|||||||
package dev.meloda.fast.friends.presentation
|
package dev.meloda.fast.friends.presentation
|
||||||
|
|
||||||
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.compose.animation.animateColorAsState
|
import androidx.compose.animation.animateColorAsState
|
||||||
import androidx.compose.animation.core.FastOutLinearInEasing
|
import androidx.compose.animation.core.FastOutLinearInEasing
|
||||||
import androidx.compose.animation.core.animateFloatAsState
|
import androidx.compose.animation.core.animateFloatAsState
|
||||||
@@ -41,6 +42,7 @@ import dev.chrisbanes.haze.hazeEffect
|
|||||||
import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
|
import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
|
||||||
import dev.chrisbanes.haze.materials.HazeMaterials
|
import dev.chrisbanes.haze.materials.HazeMaterials
|
||||||
import dev.meloda.fast.friends.FriendsViewModel
|
import dev.meloda.fast.friends.FriendsViewModel
|
||||||
|
import dev.meloda.fast.friends.OnlineFriendsViewModelImpl
|
||||||
import dev.meloda.fast.model.BaseError
|
import dev.meloda.fast.model.BaseError
|
||||||
import dev.meloda.fast.ui.R
|
import dev.meloda.fast.ui.R
|
||||||
import dev.meloda.fast.ui.components.ActionInvokeDismiss
|
import dev.meloda.fast.ui.components.ActionInvokeDismiss
|
||||||
@@ -51,13 +53,14 @@ import dev.meloda.fast.ui.theme.LocalHazeState
|
|||||||
import dev.meloda.fast.ui.theme.LocalThemeConfig
|
import dev.meloda.fast.ui.theme.LocalThemeConfig
|
||||||
import dev.meloda.fast.ui.util.ImmutableList
|
import dev.meloda.fast.ui.util.ImmutableList
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
import org.koin.androidx.viewmodel.ext.android.getViewModel
|
||||||
import dev.meloda.fast.ui.R as UiR
|
import dev.meloda.fast.ui.R as UiR
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class, ExperimentalHazeMaterialsApi::class)
|
@OptIn(ExperimentalMaterial3Api::class, ExperimentalHazeMaterialsApi::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun FriendsRoute(
|
fun FriendsRoute(
|
||||||
|
activity: AppCompatActivity,
|
||||||
friendsViewModel: FriendsViewModel,
|
friendsViewModel: FriendsViewModel,
|
||||||
onlineFriendsViewModel: FriendsViewModel,
|
|
||||||
onError: (BaseError) -> Unit,
|
onError: (BaseError) -> Unit,
|
||||||
onPhotoClicked: (url: String) -> Unit,
|
onPhotoClicked: (url: String) -> Unit,
|
||||||
onMessageClicked: (userid: Long) -> Unit,
|
onMessageClicked: (userid: Long) -> Unit,
|
||||||
@@ -234,7 +237,9 @@ fun FriendsRoute(
|
|||||||
modifier = Modifier.fillMaxSize(),
|
modifier = Modifier.fillMaxSize(),
|
||||||
) { index ->
|
) { index ->
|
||||||
FriendsScreen(
|
FriendsScreen(
|
||||||
viewModel = if (index == 0) friendsViewModel else onlineFriendsViewModel,
|
viewModel = if (index == 0) friendsViewModel else with(activity) {
|
||||||
|
getViewModel<OnlineFriendsViewModelImpl>()
|
||||||
|
},
|
||||||
orderType = orderType,
|
orderType = orderType,
|
||||||
padding = padding,
|
padding = padding,
|
||||||
tabIndex = index,
|
tabIndex = index,
|
||||||
|
|||||||
Reference in New Issue
Block a user