From 1a8bfd36e49953cf649aa38e9e8e39f6852b2fca Mon Sep 17 00:00:00 2001 From: Konstantin Tskhovrebov Date: Sat, 8 Mar 2025 19:16:37 +0100 Subject: [PATCH 1/3] Update Compose to 1.8.0-alpha04 --- .../kotlin/com/daniebeler/pfpixelix/App.kt | 132 ++++++++---------- gradle/libs.versions.toml | 6 +- 2 files changed, 60 insertions(+), 78 deletions(-) diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/App.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/App.kt index bfda2d85..deff3c6b 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/App.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/App.kt @@ -1,9 +1,5 @@ package com.daniebeler.pfpixelix -import androidx.compose.animation.AnimatedContentTransitionScope -import androidx.compose.animation.ExitTransition -import androidx.compose.animation.core.tween -import androidx.compose.animation.fadeIn import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.interaction.PressInteraction import androidx.compose.foundation.layout.Row @@ -56,7 +52,8 @@ import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.dialog import androidx.navigation.compose.rememberNavController import androidx.navigation.navArgument -import co.touchlab.kermit.Logger +import androidx.savedstate.SavedStateReader +import androidx.savedstate.read import coil3.compose.AsyncImage import com.daniebeler.pfpixelix.di.AppComponent import com.daniebeler.pfpixelix.di.LocalAppComponent @@ -264,10 +261,9 @@ private fun NavGraphBuilder.navigationGraph( } composable(Destinations.Profile.route) { navBackStackEntry -> - /* val uId = navBackStackEntry.arguments?.read { - if (hasValue("userid")) getString("userid") else null - }*/ - val uId = navBackStackEntry.arguments?.getString("userid") + val uId = navBackStackEntry.arguments?.read { + if (hasValue("userid")) getString("userid") else null + } uId?.let { id -> OtherProfileComposable(navController, userId = id, byUsername = null) @@ -276,11 +272,9 @@ private fun NavGraphBuilder.navigationGraph( } composable(Destinations.ProfileByUsername.route) { navBackStackEntry -> - /*val username = navBackStackEntry.arguments?.read { + val username = navBackStackEntry.arguments?.read { if (hasValue("username")) getString("username") else null } -*/ - val username = navBackStackEntry.arguments?.getString("username") username?.let { OtherProfileComposable(navController, userId = "", byUsername = it) @@ -288,10 +282,9 @@ private fun NavGraphBuilder.navigationGraph( } composable(Destinations.Hashtag.route) { navBackStackEntry -> - /*val uId = navBackStackEntry.arguments?.read { + val uId = navBackStackEntry.arguments?.read { if (hasValue("hashtag")) getString("hashtag") else null - }*/ - val uId = navBackStackEntry.arguments?.getString("hashtag") + } uId?.let { id -> HashtagTimelineComposable(navController, id) @@ -307,11 +300,10 @@ private fun NavGraphBuilder.navigationGraph( } composable("${Destinations.NewPost.route}?uris={uris}") { navBackStackEntry -> - /*val urisJson = navBackStackEntry.arguments?.read { + val urisJson = navBackStackEntry.arguments?.read { if (hasValue("uris")) getString("uris") else null } -*/ - val urisJson = navBackStackEntry.arguments?.getString("uris") + val imageUris: List? = urisJson?.let { json -> Json.decodeFromString>(json).map { it.toKmpUri() } @@ -320,11 +312,9 @@ private fun NavGraphBuilder.navigationGraph( } composable(Destinations.EditPost.route) { navBackStackEntry -> - /*val postId = navBackStackEntry.arguments?.read { + val postId = navBackStackEntry.arguments?.read { if (hasValue("postId")) getString("postId") else null } -*/ - val postId = navBackStackEntry.arguments?.getString("postId") postId?.let { id -> EditPostComposable(postId, navController) } @@ -363,14 +353,12 @@ private fun NavGraphBuilder.navigationGraph( } composable(Destinations.Followers.route) { navBackStackEntry -> - /*val uId = navBackStackEntry.arguments?.read { + val uId = navBackStackEntry.arguments?.read { if (hasValue("userid")) getString("userid") else null } val page = navBackStackEntry.arguments?.read { if (hasValue("page")) getString("page") else null - }*/ - val uId = navBackStackEntry.arguments?.getString("userid") - val page = navBackStackEntry.arguments?.getString("page") + } if (uId != null && page != null) { FollowersMainComposable(navController, accountId = uId, page = page) } @@ -384,25 +372,21 @@ private fun NavGraphBuilder.navigationGraph( defaultValue = false }) ) { navBackStackEntry -> - /*val uId = navBackStackEntry.arguments?.read { + val uId = navBackStackEntry.arguments?.read { if (hasValue("postid")) getString("postid") else null } val refresh = navBackStackEntry.arguments?.read { getBoolean("refresh") }!! val openReplies = navBackStackEntry.arguments?.read { getBoolean("openReplies") }!! - */ - val uId = navBackStackEntry.arguments?.getString("postid") - val refresh = navBackStackEntry.arguments?.getBoolean("refresh")!! - val openReplies = navBackStackEntry.arguments?.getBoolean("openReplies")!! + uId?.let { id -> SinglePostComposable(navController, postId = id, refresh, openReplies) } } composable(Destinations.Collection.route) { navBackStackEntry -> - /* val uId = navBackStackEntry.arguments?.read { - if (hasValue("collectionid")) getString("collectionid") else null - }*/ - val uId = navBackStackEntry.arguments?.getString("collectionid") + val uId = navBackStackEntry.arguments?.read { + if (hasValue("collectionid")) getString("collectionid") else null + } uId?.let { id -> CollectionComposable(navController, collectionId = id) @@ -410,10 +394,9 @@ private fun NavGraphBuilder.navigationGraph( } composable(Destinations.Search.route) { navBackStackEntry -> - /*val initialPage = navBackStackEntry.arguments?.read { + val initialPage = navBackStackEntry.arguments?.read { if (hasValue("initialPage")) getInt("initialPage") else 0 - }*/ - val initialPage = navBackStackEntry.arguments?.getInt("initialPage") ?: 0 + } initialPage?.let { ExploreComposable(navController, initialPage) @@ -425,10 +408,9 @@ private fun NavGraphBuilder.navigationGraph( } composable(Destinations.Chat.route) { navBackStackEntry -> - /* val uId = navBackStackEntry.arguments?.read { - if (hasValue("userid")) getString("userid") else null - }*/ - val uId = navBackStackEntry.arguments?.getString("userid") + val uId = navBackStackEntry.arguments?.read { + if (hasValue("userid")) getString("userid") else null + } uId?.let { id -> ChatComposable(navController = navController, accountId = id) @@ -436,10 +418,9 @@ private fun NavGraphBuilder.navigationGraph( } composable(Destinations.Mention.route) { navBackStackEntry -> - /* val mentionId = navBackStackEntry.arguments?.read { - if (hasValue("mentionid")) getString("mentionid") else null - }*/ - val mentionId = navBackStackEntry.arguments?.getString("mentionid") + val mentionId = navBackStackEntry.arguments?.read { + if (hasValue("mentionid")) getString("mentionid") else null + } mentionId?.let { id -> MentionComposable(navController = navController, mentionId = id) @@ -447,7 +428,7 @@ private fun NavGraphBuilder.navigationGraph( } } -//private fun SavedStateReader.hasValue(key: String) = contains(key) && !isNull(key) +private fun SavedStateReader.hasValue(key: String) = contains(key) && !isNull(key) @Composable private fun BottomBar( @@ -506,39 +487,40 @@ private fun BottomBar( } } } - NavigationBarItem(icon = { - - - if (screen.route == Destinations.OwnProfile.route && avatar != null) { - Row(verticalAlignment = Alignment.CenterVertically) { - AsyncImage( - model = avatar, - error = painterResource(Res.drawable.default_avatar), - contentDescription = "", - modifier = Modifier - .height(30.dp) - .width(30.dp) - .clip(CircleShape) + NavigationBarItem( + icon = { + + + if (screen.route == Destinations.OwnProfile.route && avatar != null) { + Row(verticalAlignment = Alignment.CenterVertically) { + AsyncImage( + model = avatar, + error = painterResource(Res.drawable.default_avatar), + contentDescription = "", + modifier = Modifier + .height(30.dp) + .width(30.dp) + .clip(CircleShape) + ) + Icon( + Icons.Outlined.UnfoldMore, + contentDescription = "long press to switch account" + ) + } + } else if (currentRoute?.startsWith(screen.route) == true) { + Icon( + imageVector = vectorResource(screen.activeIcon), + modifier = Modifier.size(30.dp), + contentDescription = stringResource(screen.label) ) + } else { Icon( - Icons.Outlined.UnfoldMore, - contentDescription = "long press to switch account" + imageVector = vectorResource(screen.icon), + modifier = Modifier.size(30.dp), + contentDescription = stringResource(screen.label) ) } - } else if (currentRoute?.startsWith(screen.route) == true) { - Icon( - imageVector = vectorResource(screen.activeIcon), - modifier = Modifier.size(30.dp), - contentDescription = stringResource(screen.label) - ) - } else { - Icon( - imageVector = vectorResource(screen.icon), - modifier = Modifier.size(30.dp), - contentDescription = stringResource(screen.label) - ) - } - }, + }, selected = currentRoute == screen.route, colors = NavigationBarItemDefaults.colors( selectedIconColor = MaterialTheme.colorScheme.inverseSurface, diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 264d76fa..ec8bc67c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,9 +4,9 @@ ksp = "2.1.10-1.0.29" agp = "8.8.2" #https://github.com/JetBrains/compose-multiplatform/releases -composeMultiplatform = "1.8.0-alpha03" -lifecycleMultiplatform = "2.9.0-alpha03" -navigationMultiplatform = "2.8.0-alpha13" +composeMultiplatform = "1.8.0-alpha04" +lifecycleMultiplatform = "2.9.0-alpha04" +navigationMultiplatform = "2.9.0-alpha14" #JetBrains kotlinx-coroutines = "1.10.1" From ad61b102b5a14edfdd91df59de2eeb27568eed10 Mon Sep 17 00:00:00 2001 From: Konstantin Tskhovrebov Date: Sat, 8 Mar 2025 22:28:03 +0100 Subject: [PATCH 2/3] Global refactoring the navigation. Use a type safe navigation and fix main screen tab's behaviour. Now a first click on tab selects tab, a second click navigates to the tab root --- .../kotlin/com/daniebeler/pfpixelix/App.kt | 355 ++++-------------- .../pfpixelix/ui/composables/CustomHashtag.kt | 4 +- .../pfpixelix/ui/composables/CustomPost.kt | 6 +- .../ui/composables/HomeComposable.kt | 10 +- .../custom_account/CustomAccount.kt | 5 +- .../direct_messages/chat/ChatComposable.kt | 4 +- .../ConversationElementComposable.kt | 4 +- .../conversations/ConversationsComposable.kt | 6 +- .../composables/explore/ExploreComposable.kt | 10 +- .../TrendingAccountElement.kt | 4 +- .../TrendingHashtagElement.kt | 4 +- .../followers/FollowerElementComposable.kt | 4 +- .../followers/FollowersMainComposable.kt | 5 +- .../followers/FollowingComposable.kt | 8 +- ...hClickableHashtagsAndMentionsComposable.kt | 29 +- .../composables/mention/MentionComposable.kt | 13 +- .../composables/newpost/NewPostViewModel.kt | 4 +- .../notifications/CustomNotification.kt | 32 +- .../composables/post/CommentsBottomSheet.kt | 10 +- .../ui/composables/post/LikesBottomSheet.kt | 4 +- .../ui/composables/post/PostComposable.kt | 15 +- .../ui/composables/post/ShareBottomSheet.kt | 4 +- .../profile/CollectionsComposable.kt | 4 +- .../profile/MutualFollowersComposable.kt | 5 +- .../composables/profile/ProfileTopSection.kt | 13 +- .../other_profile/OtherProfileComposable.kt | 6 +- .../own_profile/AccountSwitchBottomSheet.kt | 4 +- .../own_profile/AccountSwitchViewModel.kt | 2 - .../own_profile/ModalBottomSheetContent.kt | 18 +- .../own_profile/OwnProfileComposable.kt | 6 +- .../about_instance/AboutInstanceComposable.kt | 6 +- .../about_pixelix/AboutPixelixComposable.kt | 10 +- .../CustomBlockedAccountRow.kt | 4 +- .../FollowedHashtagsComposable.kt | 4 +- .../muted_accounts/CustomMutedAccountRow.kt | 4 +- .../prefs/prefs/CustomizeAppIconPref.kt | 7 +- .../single_post/SinglePostComposable.kt | 6 +- .../HashtagTimelineComposable.kt | 29 -- .../home_timeline/HomeTimelineComposable.kt | 5 +- .../pfpixelix/ui/navigation/Navigation.kt | 216 +++++++++++ .../pfpixelix/utils/Destinations.kt | 143 ------- .../daniebeler/pfpixelix/utils/Navigate.kt | 61 --- 42 files changed, 407 insertions(+), 686 deletions(-) create mode 100644 app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/navigation/Navigation.kt delete mode 100644 app/src/commonMain/kotlin/com/daniebeler/pfpixelix/utils/Destinations.kt delete mode 100644 app/src/commonMain/kotlin/com/daniebeler/pfpixelix/utils/Navigate.kt diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/App.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/App.kt index deff3c6b..cd56b8e1 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/App.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/App.kt @@ -32,6 +32,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -44,62 +45,45 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.unit.dp import androidx.compose.ui.window.DialogProperties -import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavDestination.Companion.hasRoute +import androidx.navigation.NavDestination.Companion.hierarchy import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable import androidx.navigation.compose.currentBackStackEntryAsState -import androidx.navigation.compose.dialog import androidx.navigation.compose.rememberNavController -import androidx.navigation.navArgument -import androidx.savedstate.SavedStateReader -import androidx.savedstate.read import coil3.compose.AsyncImage import com.daniebeler.pfpixelix.di.AppComponent import com.daniebeler.pfpixelix.di.LocalAppComponent -import com.daniebeler.pfpixelix.ui.composables.HomeComposable import com.daniebeler.pfpixelix.ui.composables.ReverseModalNavigationDrawer -import com.daniebeler.pfpixelix.ui.composables.collection.CollectionComposable -import com.daniebeler.pfpixelix.ui.composables.direct_messages.chat.ChatComposable -import com.daniebeler.pfpixelix.ui.composables.direct_messages.conversations.ConversationsComposable -import com.daniebeler.pfpixelix.ui.composables.edit_post.EditPostComposable -import com.daniebeler.pfpixelix.ui.composables.edit_profile.EditProfileComposable -import com.daniebeler.pfpixelix.ui.composables.explore.ExploreComposable -import com.daniebeler.pfpixelix.ui.composables.followers.FollowersMainComposable -import com.daniebeler.pfpixelix.ui.composables.mention.MentionComposable -import com.daniebeler.pfpixelix.ui.composables.newpost.NewPostComposable -import com.daniebeler.pfpixelix.ui.composables.notifications.NotificationsComposable -import com.daniebeler.pfpixelix.ui.composables.profile.other_profile.OtherProfileComposable import com.daniebeler.pfpixelix.ui.composables.profile.own_profile.AccountSwitchBottomSheet -import com.daniebeler.pfpixelix.ui.composables.profile.own_profile.OwnProfileComposable -import com.daniebeler.pfpixelix.ui.composables.session.LoginComposable -import com.daniebeler.pfpixelix.ui.composables.settings.about_instance.AboutInstanceComposable -import com.daniebeler.pfpixelix.ui.composables.settings.about_pixelix.AboutPixelixComposable -import com.daniebeler.pfpixelix.ui.composables.settings.blocked_accounts.BlockedAccountsComposable -import com.daniebeler.pfpixelix.ui.composables.settings.bookmarked_posts.BookmarkedPostsComposable -import com.daniebeler.pfpixelix.ui.composables.settings.followed_hashtags.FollowedHashtagsComposable -import com.daniebeler.pfpixelix.ui.composables.settings.icon_selection.IconSelectionComposable -import com.daniebeler.pfpixelix.ui.composables.settings.liked_posts.LikedPostsComposable -import com.daniebeler.pfpixelix.ui.composables.settings.muted_accounts.MutedAccountsComposable import com.daniebeler.pfpixelix.ui.composables.settings.preferences.PreferencesComposable -import com.daniebeler.pfpixelix.ui.composables.single_post.SinglePostComposable -import com.daniebeler.pfpixelix.ui.composables.timelines.hashtag_timeline.HashtagTimelineComposable +import com.daniebeler.pfpixelix.ui.navigation.Destination +import com.daniebeler.pfpixelix.ui.navigation.navigationGraph import com.daniebeler.pfpixelix.ui.theme.PixelixTheme -import com.daniebeler.pfpixelix.utils.Destinations -import com.daniebeler.pfpixelix.utils.KmpUri -import com.daniebeler.pfpixelix.utils.Navigate import com.daniebeler.pfpixelix.utils.end -import com.daniebeler.pfpixelix.utils.toKmpUri import kotlinx.coroutines.cancelChildren import kotlinx.coroutines.delay import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch -import kotlinx.serialization.json.Json +import org.jetbrains.compose.resources.DrawableResource +import org.jetbrains.compose.resources.StringResource import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource import org.jetbrains.compose.resources.vectorResource import pixelix.app.generated.resources.Res +import pixelix.app.generated.resources.add_circle +import pixelix.app.generated.resources.add_circle_outline +import pixelix.app.generated.resources.bookmark_outline import pixelix.app.generated.resources.default_avatar +import pixelix.app.generated.resources.home +import pixelix.app.generated.resources.house +import pixelix.app.generated.resources.house_fill +import pixelix.app.generated.resources.new_post +import pixelix.app.generated.resources.notifications +import pixelix.app.generated.resources.notifications_outline +import pixelix.app.generated.resources.profile +import pixelix.app.generated.resources.search +import pixelix.app.generated.resources.search_outline @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -167,7 +151,7 @@ fun App( modifier = Modifier.fillMaxSize().padding(paddingValues) .consumeWindowInsets(WindowInsets.navigationBars), navController = navController, - startDestination = Destinations.FirstLogin.route, + startDestination = Destination.FirstLogin, builder = { navigationGraph( navController, @@ -177,11 +161,8 @@ fun App( } ) LaunchedEffect(activeUser) { - val rootScreen = if (activeUser == null) { - Destinations.FirstLogin.route - } else { - Destinations.HomeScreen.route - } + val rootScreen = + if (activeUser == null) Destination.FirstLogin else Destination.Feeds navController.navigate(rootScreen) { val root = navController.currentBackStack.value .firstOrNull { it.destination.route != null } @@ -193,11 +174,8 @@ fun App( if (activeUser != null) { appComponent.systemFileShare.shareFilesRequests.collect { uris -> - val urisJson = Json.encodeToString( - uris.map { uri -> uri.toString() } - ) - Navigate.navigate( - "new_post_screen?uris=$urisJson", navController + navController.navigate( + Destination.NewPost(uris.map { it.toString() }) ) } } @@ -222,226 +200,44 @@ fun App( } } -private fun NavGraphBuilder.navigationGraph( - navController: NavHostController, - openPreferencesDrawer: () -> Unit, - exitApp: () -> Unit +private enum class HomeTab( + val destination: Destination, + val icon: DrawableResource, + val activeIcon: DrawableResource, + val label: StringResource ) { - dialog( - route = Destinations.FirstLogin.route, - ) { - EdgeToEdgeDialog( - onDismissRequest = exitApp, - properties = DialogProperties( - dismissOnClickOutside = false, - usePlatformDefaultWidth = false, - ) - ) { - LoginComposable(navController = navController) - } - } - dialog(route = Destinations.NewLogin.route) { - EdgeToEdgeDialog( - onDismissRequest = { navController.popBackStack() }, - properties = DialogProperties( - dismissOnClickOutside = false, - usePlatformDefaultWidth = false, - ) - ) { - LoginComposable(true, navController) - } - } - - composable(Destinations.HomeScreen.route) { - HomeComposable(navController, openPreferencesDrawer) - } - - composable(Destinations.NotificationsScreen.route) { - NotificationsComposable(navController) - } - - composable(Destinations.Profile.route) { navBackStackEntry -> - val uId = navBackStackEntry.arguments?.read { - if (hasValue("userid")) getString("userid") else null - } - - uId?.let { id -> - OtherProfileComposable(navController, userId = id, byUsername = null) - - } - } - - composable(Destinations.ProfileByUsername.route) { navBackStackEntry -> - val username = navBackStackEntry.arguments?.read { - if (hasValue("username")) getString("username") else null - } - - username?.let { - OtherProfileComposable(navController, userId = "", byUsername = it) - } - } - - composable(Destinations.Hashtag.route) { navBackStackEntry -> - val uId = navBackStackEntry.arguments?.read { - if (hasValue("hashtag")) getString("hashtag") else null - } - - uId?.let { id -> - HashtagTimelineComposable(navController, id) - } - } - - composable(Destinations.EditProfile.route) { - EditProfileComposable(navController) - } - - composable(Destinations.IconSelection.route) { - IconSelectionComposable(navController) - } - - composable("${Destinations.NewPost.route}?uris={uris}") { navBackStackEntry -> - val urisJson = navBackStackEntry.arguments?.read { - if (hasValue("uris")) getString("uris") else null - } - - - val imageUris: List? = urisJson?.let { json -> - Json.decodeFromString>(json).map { it.toKmpUri() } - } - NewPostComposable(navController, imageUris) - } - - composable(Destinations.EditPost.route) { navBackStackEntry -> - val postId = navBackStackEntry.arguments?.read { - if (hasValue("postId")) getString("postId") else null - } - postId?.let { id -> - EditPostComposable(postId, navController) - } - } - - composable(Destinations.MutedAccounts.route) { - MutedAccountsComposable(navController) - } - - composable(Destinations.BlockedAccounts.route) { - BlockedAccountsComposable(navController) - } - - composable(Destinations.LikedPosts.route) { - LikedPostsComposable(navController) - } - - composable(Destinations.BookmarkedPosts.route) { - BookmarkedPostsComposable(navController) - } - - composable(Destinations.FollowedHashtags.route) { - FollowedHashtagsComposable(navController) - } - - composable(Destinations.AboutInstance.route) { - AboutInstanceComposable(navController) - } - - composable(Destinations.AboutPixelix.route) { - AboutPixelixComposable(navController) - } - - composable(Destinations.OwnProfile.route) { - OwnProfileComposable(navController, openPreferencesDrawer) - } - - composable(Destinations.Followers.route) { navBackStackEntry -> - val uId = navBackStackEntry.arguments?.read { - if (hasValue("userid")) getString("userid") else null - } - val page = navBackStackEntry.arguments?.read { - if (hasValue("page")) getString("page") else null - } - if (uId != null && page != null) { - FollowersMainComposable(navController, accountId = uId, page = page) - } - } - - composable( - "${Destinations.SinglePost.route}?refresh={refresh}&openReplies={openReplies}", - arguments = listOf(navArgument("refresh") { - defaultValue = false - }, navArgument("openReplies") { - defaultValue = false - }) - ) { navBackStackEntry -> - val uId = navBackStackEntry.arguments?.read { - if (hasValue("postid")) getString("postid") else null - } - val refresh = navBackStackEntry.arguments?.read { getBoolean("refresh") }!! - val openReplies = navBackStackEntry.arguments?.read { getBoolean("openReplies") }!! - - uId?.let { id -> - SinglePostComposable(navController, postId = id, refresh, openReplies) - } - } - - composable(Destinations.Collection.route) { navBackStackEntry -> - val uId = navBackStackEntry.arguments?.read { - if (hasValue("collectionid")) getString("collectionid") else null - } - - uId?.let { id -> - CollectionComposable(navController, collectionId = id) - } - } - - composable(Destinations.Search.route) { navBackStackEntry -> - val initialPage = navBackStackEntry.arguments?.read { - if (hasValue("initialPage")) getInt("initialPage") else 0 - } - - initialPage?.let { - ExploreComposable(navController, initialPage) - } - } - - composable(Destinations.Conversation.route) { - ConversationsComposable(navController = navController) - } - - composable(Destinations.Chat.route) { navBackStackEntry -> - val uId = navBackStackEntry.arguments?.read { - if (hasValue("userid")) getString("userid") else null - } - - uId?.let { id -> - ChatComposable(navController = navController, accountId = id) - } - } - - composable(Destinations.Mention.route) { navBackStackEntry -> - val mentionId = navBackStackEntry.arguments?.read { - if (hasValue("mentionid")) getString("mentionid") else null - } - - mentionId?.let { id -> - MentionComposable(navController = navController, mentionId = id) - } - } + Feeds(Destination.Feeds, Res.drawable.house, Res.drawable.house_fill, Res.string.home), + Search( + Destination.Search(), + Res.drawable.search_outline, + Res.drawable.search, + Res.string.search + ), + NewPost( + Destination.NewPost(), + Res.drawable.add_circle_outline, + Res.drawable.add_circle, + Res.string.new_post + ), + Notifications( + Destination.Notifications, + Res.drawable.notifications_outline, + Res.drawable.notifications, + Res.string.notifications + ), + OwnProfile( + Destination.OwnProfile, + Res.drawable.bookmark_outline, + Res.drawable.bookmark_outline, + Res.string.profile + ) } -private fun SavedStateReader.hasValue(key: String) = contains(key) && !isNull(key) - @Composable private fun BottomBar( navController: NavHostController, openAccountSwitchBottomSheet: () -> Unit ) { - val screens = listOf( - Destinations.HomeScreen, - Destinations.Search, - Destinations.NewPost, - Destinations.NotificationsScreen, - Destinations.OwnProfile - ) val systemNavigationBarHeight = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() @@ -459,10 +255,13 @@ private fun BottomBar( NavigationBar( modifier = Modifier.height(60.dp + systemNavigationBarHeight) ) { - val navBackStackEntry by navController.currentBackStackEntryAsState() - val currentRoute = navBackStackEntry?.destination?.route + val currentStack by navController.currentBackStack.collectAsState() + + HomeTab.entries.forEach { tab -> + val isSelected = currentStack.any { it.destination.hasRoute(tab.destination::class) } + val isCurrentDestination = + currentStack.lastOrNull()?.destination?.hasRoute(tab.destination::class) == true - screens.forEach { screen -> val interactionSource = remember { MutableInteractionSource() } val coroutineScope = rememberCoroutineScope() var isLongPress by remember { mutableStateOf(false) } @@ -474,7 +273,7 @@ private fun BottomBar( isLongPress = false // Reset flag before starting detection coroutineScope.launch { delay(500L) // Long-press threshold - if (screen.route == Destinations.OwnProfile.route) { + if (tab == HomeTab.OwnProfile) { openAccountSwitchBottomSheet() } isLongPress = true @@ -489,9 +288,7 @@ private fun BottomBar( } NavigationBarItem( icon = { - - - if (screen.route == Destinations.OwnProfile.route && avatar != null) { + if (tab == HomeTab.OwnProfile && avatar != null) { Row(verticalAlignment = Alignment.CenterVertically) { AsyncImage( model = avatar, @@ -507,29 +304,35 @@ private fun BottomBar( contentDescription = "long press to switch account" ) } - } else if (currentRoute?.startsWith(screen.route) == true) { - Icon( - imageVector = vectorResource(screen.activeIcon), - modifier = Modifier.size(30.dp), - contentDescription = stringResource(screen.label) - ) } else { Icon( - imageVector = vectorResource(screen.icon), + imageVector = vectorResource( + if (isSelected) tab.activeIcon else tab.icon + ), modifier = Modifier.size(30.dp), - contentDescription = stringResource(screen.label) + contentDescription = stringResource(tab.label) ) } }, - selected = currentRoute == screen.route, + selected = isSelected, colors = NavigationBarItemDefaults.colors( selectedIconColor = MaterialTheme.colorScheme.inverseSurface, indicatorColor = Color.Transparent ), interactionSource = interactionSource, onClick = { - if (!isLongPress) { - Navigate.navigateWithPopUp(screen.route, navController) + if (!isLongPress && !isCurrentDestination) { + navController.navigate(tab.destination) { + if (!isSelected) { + popUpTo(0) { + saveState = true + } + restoreState = true + } else { + popUpTo(0) + } + launchSingleTop = true + } } }) } diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/CustomHashtag.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/CustomHashtag.kt index 43748003..db16cf89 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/CustomHashtag.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/CustomHashtag.kt @@ -23,7 +23,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavController import com.daniebeler.pfpixelix.domain.model.Tag -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination @Composable fun CustomHashtag(hashtag: Tag, navController: NavController) { @@ -43,7 +43,7 @@ private fun CustomHashtagPrivate(hashtag: Tag, onClick: () -> Unit, navControlle .fillMaxWidth() .clickable { onClick() - Navigate.navigate("hashtag_timeline_screen/${hashtag.name}", navController) + navController.navigate(Destination.HashtagTimeline(hashtag.name)) }, verticalAlignment = Alignment.CenterVertically ) { Box( diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/CustomPost.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/CustomPost.kt index a6e1008c..d1cf56c6 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/CustomPost.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/CustomPost.kt @@ -22,8 +22,8 @@ import androidx.compose.ui.unit.dp import androidx.navigation.NavController import coil3.compose.AsyncImage import com.daniebeler.pfpixelix.domain.model.Post +import com.daniebeler.pfpixelix.ui.navigation.Destination import com.daniebeler.pfpixelix.utils.BlurHashDecoder -import com.daniebeler.pfpixelix.utils.Navigate import org.jetbrains.compose.resources.vectorResource import pixelix.app.generated.resources.Res import pixelix.app.generated.resources.stack @@ -64,7 +64,7 @@ fun CustomPost( .aspectRatio(1f) .clickable(onClick = { if (!edit && onClick == null) { - Navigate.navigate("single_post_screen/" + post.id, navController) + navController.navigate(Destination.Post(post.id)) } else if (onClick != null){ onClick(post.id) } @@ -83,7 +83,7 @@ fun CustomPost( customModifier .clickable(onClick = { if (!edit && onClick == null) { - Navigate.navigate("single_post_screen/" + post.id, navController) + navController.navigate(Destination.Post(post.id)) } else if (onClick != null){ onClick(post.id) } diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/HomeComposable.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/HomeComposable.kt index 707ac8fa..33286ab8 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/HomeComposable.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/HomeComposable.kt @@ -6,13 +6,10 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.WindowInsetsSides import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.navigationBars -import androidx.compose.foundation.layout.only import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState @@ -41,7 +38,7 @@ import androidx.navigation.NavController import com.daniebeler.pfpixelix.ui.composables.timelines.global_timeline.GlobalTimelineComposable import com.daniebeler.pfpixelix.ui.composables.timelines.home_timeline.HomeTimelineComposable import com.daniebeler.pfpixelix.ui.composables.timelines.local_timeline.LocalTimelineComposable -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import kotlinx.coroutines.launch import org.jetbrains.compose.resources.stringResource import org.jetbrains.compose.resources.vectorResource @@ -81,10 +78,7 @@ fun HomeComposable(navController: NavController, openPreferencesDrawer: () -> Un Row { IconButton(onClick = { - Navigate.navigate( - "conversations", - navController - ) + navController.navigate(Destination.Conversations) }) { Icon( imageVector = vectorResource(Res.drawable.mail_outline), diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/custom_account/CustomAccount.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/custom_account/CustomAccount.kt index f5011001..220862e3 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/custom_account/CustomAccount.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/custom_account/CustomAccount.kt @@ -29,11 +29,10 @@ import com.daniebeler.pfpixelix.di.injectViewModel import com.daniebeler.pfpixelix.domain.model.Account import com.daniebeler.pfpixelix.domain.model.Relationship import com.daniebeler.pfpixelix.ui.composables.FollowButton -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import com.daniebeler.pfpixelix.utils.StringFormat import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.pluralStringResource -import org.jetbrains.compose.resources.stringResource import pixelix.app.generated.resources.Res import pixelix.app.generated.resources.default_avatar import pixelix.app.generated.resources.follower @@ -124,7 +123,7 @@ private fun CustomAccountPrivate( Row(modifier = Modifier .clickable { onClick() - Navigate.navigate("profile_screen/" + account.id, navController) + navController.navigate(Destination.Profile(account.id)) } .padding(horizontal = 12.dp, vertical = 8.dp) .fillMaxWidth(), diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/direct_messages/chat/ChatComposable.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/direct_messages/chat/ChatComposable.kt index 10eee2d9..5ea37bd9 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/direct_messages/chat/ChatComposable.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/direct_messages/chat/ChatComposable.kt @@ -53,7 +53,7 @@ import com.daniebeler.pfpixelix.di.injectViewModel import com.daniebeler.pfpixelix.ui.composables.InfiniteListHandler import com.daniebeler.pfpixelix.ui.composables.states.EndOfListComposable import com.daniebeler.pfpixelix.ui.composables.states.ErrorComposable -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import com.daniebeler.pfpixelix.utils.imeAwareInsets import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource @@ -82,7 +82,7 @@ fun ChatComposable( if (viewModel.chatState.chat != null) { Row( modifier = Modifier.clickable { - Navigate.navigate("profile_screen/$accountId", navController) + navController.navigate(Destination.Profile(accountId)) }, verticalAlignment = Alignment.CenterVertically ) { AsyncImage( diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/direct_messages/conversations/ConversationElementComposable.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/direct_messages/conversations/ConversationElementComposable.kt index 1e9f756a..b9916177 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/direct_messages/conversations/ConversationElementComposable.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/direct_messages/conversations/ConversationElementComposable.kt @@ -21,7 +21,7 @@ import androidx.compose.ui.unit.dp import androidx.navigation.NavController import coil3.compose.AsyncImage import com.daniebeler.pfpixelix.domain.model.Conversation -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import org.jetbrains.compose.resources.painterResource import pixelix.app.generated.resources.Res import pixelix.app.generated.resources.default_avatar @@ -33,7 +33,7 @@ fun ConversationElementComposable(conversation: Conversation, navController: Nav Modifier .fillMaxWidth() .clickable { - Navigate.navigate("chat/" + conversation.accounts.first().id, navController) + navController.navigate(Destination.Chat(conversation.accounts.first().id)) } .padding(horizontal = 12.dp, vertical = 14.dp), verticalAlignment = Alignment.CenterVertically) { diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/direct_messages/conversations/ConversationsComposable.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/direct_messages/conversations/ConversationsComposable.kt index 23639131..c94651b8 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/direct_messages/conversations/ConversationsComposable.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/direct_messages/conversations/ConversationsComposable.kt @@ -56,7 +56,7 @@ import com.daniebeler.pfpixelix.ui.composables.states.EndOfListComposable import com.daniebeler.pfpixelix.ui.composables.states.ErrorComposable import com.daniebeler.pfpixelix.ui.composables.states.FullscreenEmptyStateComposable import com.daniebeler.pfpixelix.ui.composables.states.LoadingComposable -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import org.jetbrains.compose.resources.stringResource import org.jetbrains.compose.resources.vectorResource import pixelix.app.generated.resources.Res @@ -263,9 +263,7 @@ private fun CreateNewConversation( }, confirmButton = { TextButton(enabled = viewModel.newConversationSelectedAccount != null, onClick = { if (viewModel.newConversationSelectedAccount != null) { - Navigate.navigate( - "chat/" + viewModel.newConversationSelectedAccount!!.id, navController - ) + navController.navigate(Destination.Chat(viewModel.newConversationSelectedAccount!!.id)) close() } }) { diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/explore/ExploreComposable.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/explore/ExploreComposable.kt index a6f43ac7..9a9d5d48 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/explore/ExploreComposable.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/explore/ExploreComposable.kt @@ -66,7 +66,7 @@ import com.daniebeler.pfpixelix.ui.composables.CustomHashtag import com.daniebeler.pfpixelix.ui.composables.custom_account.CustomAccount import com.daniebeler.pfpixelix.ui.composables.explore.trending.TrendingComposable import com.daniebeler.pfpixelix.ui.composables.states.FullscreenLoadingComposable -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import com.daniebeler.pfpixelix.utils.imeAwareInsets import kotlinx.coroutines.launch import org.jetbrains.compose.resources.painterResource @@ -292,13 +292,9 @@ private fun PastSearchItem( .fillMaxWidth() .clickable { when (item.savedSearchType) { - SavedSearchType.Account -> Navigate.navigate( - "profile_screen/" + item.account!!.id, navController - ) + SavedSearchType.Account -> navController.navigate(Destination.Profile(item.account!!.id)) - SavedSearchType.Hashtag -> Navigate.navigate( - "hashtag_timeline_screen/${item.value}", navController - ) + SavedSearchType.Hashtag -> navController.navigate(Destination.HashtagTimeline(item.value)) SavedSearchType.Search -> setSearchText(item.value) } diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/explore/trending/trending_accounts/TrendingAccountElement.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/explore/trending/trending_accounts/TrendingAccountElement.kt index f5cb62d1..55035291 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/explore/trending/trending_accounts/TrendingAccountElement.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/explore/trending/trending_accounts/TrendingAccountElement.kt @@ -20,7 +20,7 @@ import com.daniebeler.pfpixelix.domain.model.Account import com.daniebeler.pfpixelix.ui.composables.CustomPost import com.daniebeler.pfpixelix.ui.composables.custom_account.CustomAccount import com.daniebeler.pfpixelix.ui.composables.hashtagMentionText.HashtagsMentionsTextView -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination @Composable fun TrendingAccountElement( @@ -37,7 +37,7 @@ fun TrendingAccountElement( .padding(12.dp) .fillMaxWidth() .clickable { - Navigate.navigate("profile_screen/" + account.id, navController) + navController.navigate(Destination.Profile(account.id)) }) { CustomAccount(account = account) diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/explore/trending/trending_hashtags/TrendingHashtagElement.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/explore/trending/trending_hashtags/TrendingHashtagElement.kt index 0bdf21f7..8a1e85be 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/explore/trending/trending_hashtags/TrendingHashtagElement.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/explore/trending/trending_hashtags/TrendingHashtagElement.kt @@ -29,7 +29,7 @@ import androidx.navigation.NavController import com.daniebeler.pfpixelix.di.injectViewModel import com.daniebeler.pfpixelix.domain.model.Tag import com.daniebeler.pfpixelix.ui.composables.CustomPost -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import com.daniebeler.pfpixelix.utils.StringFormat import org.jetbrains.compose.resources.stringResource import pixelix.app.generated.resources.Res @@ -52,7 +52,7 @@ fun TrendingHashtagElement( .padding(vertical = 8.dp) .fillMaxWidth() .clickable { - Navigate.navigate("hashtag_timeline_screen/${hashtag.name}", navController) + navController.navigate(Destination.HashtagTimeline(hashtag.name)) }) { Row( diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/followers/FollowerElementComposable.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/followers/FollowerElementComposable.kt index f0d888c4..0be0c2e6 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/followers/FollowerElementComposable.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/followers/FollowerElementComposable.kt @@ -20,7 +20,7 @@ import androidx.compose.ui.unit.sp import androidx.navigation.NavController import coil3.compose.AsyncImage import com.daniebeler.pfpixelix.domain.model.Account -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import org.jetbrains.compose.resources.painterResource import pixelix.app.generated.resources.Res import pixelix.app.generated.resources.default_avatar @@ -32,7 +32,7 @@ fun FollowerElementComposable( Row( modifier = Modifier .clickable { - Navigate.navigate("profile_screen/" + account.id, navController, false) + navController.navigate(Destination.Profile(account.id)) } .padding(horizontal = 12.dp, vertical = 8.dp) .fillMaxWidth() diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/followers/FollowersMainComposable.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/followers/FollowersMainComposable.kt index 0cdeec62..2b08cf37 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/followers/FollowersMainComposable.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/followers/FollowersMainComposable.kt @@ -32,7 +32,6 @@ import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.sp import androidx.navigation.NavController -import co.touchlab.kermit.Logger import com.daniebeler.pfpixelix.di.injectViewModel import kotlinx.coroutines.launch import org.jetbrains.compose.resources.stringResource @@ -47,7 +46,7 @@ import pixelix.app.generated.resources.following fun FollowersMainComposable( navController: NavController, accountId: String, - page: String, + isFollowers: Boolean, viewModel: FollowersViewModel = injectViewModel(key = "followers-viewmodel-key") { followersViewModel } ) { @@ -59,7 +58,7 @@ fun FollowersMainComposable( viewModel.setLoggedInAccountIdValue() } - val pageId = if (page == "followers") 0 else 1 + val pageId = if (isFollowers) 0 else 1 val pagerState = rememberPagerState(initialPage = pageId, pageCount = { 2 }) val scope = rememberCoroutineScope() diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/followers/FollowingComposable.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/followers/FollowingComposable.kt index 364a2712..af02847d 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/followers/FollowingComposable.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/followers/FollowingComposable.kt @@ -10,15 +10,11 @@ import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Groups import androidx.compose.material3.CircularProgressIndicator -import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.input.key.Key.Companion.R import androidx.compose.ui.unit.dp import androidx.navigation.NavController -import co.touchlab.kermit.Logger import com.daniebeler.pfpixelix.di.injectViewModel import com.daniebeler.pfpixelix.ui.composables.InfiniteListHandler import com.daniebeler.pfpixelix.ui.composables.states.EmptyState @@ -26,7 +22,7 @@ import com.daniebeler.pfpixelix.ui.composables.states.EndOfListComposable import com.daniebeler.pfpixelix.ui.composables.states.ErrorComposable import com.daniebeler.pfpixelix.ui.composables.states.FullscreenEmptyStateComposable import com.daniebeler.pfpixelix.ui.composables.states.LoadingComposable -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import org.jetbrains.compose.resources.stringResource import pixelix.app.generated.resources.Res import pixelix.app.generated.resources.empty @@ -80,7 +76,7 @@ fun FollowingComposable( message = message, buttonText = stringResource(Res.string.explore_trending_profiles), onClick = { - Navigate.navigate("search_screen/1", navController) + navController.navigate(Destination.Search(1)) }) ) } diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/hashtagMentionText/TextWithClickableHashtagsAndMentionsComposable.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/hashtagMentionText/TextWithClickableHashtagsAndMentionsComposable.kt index 4db0d739..c7243c23 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/hashtagMentionText/TextWithClickableHashtagsAndMentionsComposable.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/hashtagMentionText/TextWithClickableHashtagsAndMentionsComposable.kt @@ -24,11 +24,10 @@ import androidx.compose.ui.unit.TextUnit import androidx.navigation.NavController import com.daniebeler.pfpixelix.di.injectViewModel import com.daniebeler.pfpixelix.domain.model.Account -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import org.jetbrains.compose.resources.stringResource import pixelix.app.generated.resources.Res import pixelix.app.generated.resources.read_less @@ -131,42 +130,32 @@ fun HashtagsMentionsTextView( } }, modifier = modifier, onClick = { position -> - CoroutineScope(Dispatchers.Default).launch { + CoroutineScope(Dispatchers.Main).launch { val annotatedStringRange = annotatedStringList.firstOrNull { it.start <= position && position < it.end } if (annotatedStringRange != null) { if (annotatedStringRange.tag == "tag" || annotatedStringRange.tag == "account") { val newItem = annotatedStringRange.item.drop(1) - val route = if (annotatedStringRange.tag == "tag") { - "hashtag_timeline_screen/$newItem" + if (annotatedStringRange.tag == "tag") { + navController.navigate(Destination.HashtagTimeline(newItem)) } else { if (mentions == null) { - "profile_screen/byUsername/${annotatedStringRange.item.drop(1)}" + navController.navigate(Destination.ProfileByUsername(annotatedStringRange.item.drop(1))) } else { - var account = - mentions.find { account: Account -> account.acct == newItem } + var account = mentions.find { account: Account -> account.acct == newItem } if (account == null) { - account = - mentions.find { account: Account -> account.username == newItem } + account = mentions.find { account: Account -> account.username == newItem } } if (account != null) { //get my account id and check if it is mine account val myAccountId = viewModel.getMyAccountId() if (account.id == myAccountId) { - "own_profile_screen" + navController.navigate(Destination.OwnProfile) } else { - "profile_screen/${account.id}" + navController.navigate(Destination.Profile(account.id)) } - } else { - "" } } - - } - withContext(Dispatchers.Main) { - if (route.isNotBlank() && route.isNotEmpty()) { - Navigate.navigate(route, navController) - } } } else if (annotatedStringRange.tag == "link") { openUrl(annotatedStringRange.item) diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/mention/MentionComposable.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/mention/MentionComposable.kt index 084aab8f..fa4ea8f7 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/mention/MentionComposable.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/mention/MentionComposable.kt @@ -36,13 +36,12 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavController -import co.touchlab.kermit.Logger import com.daniebeler.pfpixelix.di.injectViewModel import com.daniebeler.pfpixelix.domain.model.Post import com.daniebeler.pfpixelix.ui.composables.post.PostComposable import com.daniebeler.pfpixelix.ui.composables.states.ErrorComposable import com.daniebeler.pfpixelix.ui.composables.states.LoadingComposable -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import kotlinx.coroutines.launch import org.jetbrains.compose.resources.stringResource import org.jetbrains.compose.resources.vectorResource @@ -115,7 +114,7 @@ fun MentionComposable( post, navController, postGetsDeleted = { - Navigate.navigateAndDeleteBackStack("own_profile_screen", navController) + navController.navigate(Destination.OwnProfile) }, setZindex = { }, openReplies = false, @@ -146,15 +145,15 @@ private fun SubPosts(posts: List, navController: NavController) { ancestor, navController, postGetsDeleted = { - Navigate.navigateAndDeleteBackStack( - "own_profile_screen", navController - ) + navController.navigate(Destination.OwnProfile) { + popUpTo(0) { inclusive = true } + } }, setZindex = { }, openReplies = false, showReplies = false, modifier = Modifier.clickable { - Navigate.navigate("mention/" + ancestor.id, navController) + navController.navigate(Destination.Mention(ancestor.id)) } ) } diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/newpost/NewPostViewModel.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/newpost/NewPostViewModel.kt index 91e61400..73995c7c 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/newpost/NewPostViewModel.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/newpost/NewPostViewModel.kt @@ -14,8 +14,8 @@ import com.daniebeler.pfpixelix.domain.service.editor.PostEditorService import com.daniebeler.pfpixelix.domain.service.file.FileService import com.daniebeler.pfpixelix.domain.service.instance.InstanceService import com.daniebeler.pfpixelix.domain.service.utils.Resource +import com.daniebeler.pfpixelix.ui.navigation.Destination import com.daniebeler.pfpixelix.utils.KmpUri -import com.daniebeler.pfpixelix.utils.Navigate import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.IO import kotlinx.coroutines.flow.flowOn @@ -283,7 +283,7 @@ class NewPostViewModel @Inject constructor( postEditorService.createPost(createPostDto).onEach { result -> createPostState = when (result) { is Resource.Success -> { - Navigate.navigateAndDeleteBackStack("own_profile_screen", navController) + navController.navigate(Destination.OwnProfile) CreatePostState(post = result.data, isLoading = true) } diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/notifications/CustomNotification.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/notifications/CustomNotification.kt index 8a2daa6b..58e22276 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/notifications/CustomNotification.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/notifications/CustomNotification.kt @@ -28,7 +28,7 @@ import androidx.navigation.NavController import coil3.compose.AsyncImage import com.daniebeler.pfpixelix.di.injectViewModel import com.daniebeler.pfpixelix.domain.model.Notification -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import com.daniebeler.pfpixelix.utils.TimeAgo import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource @@ -88,13 +88,11 @@ fun CustomNotification( .padding(horizontal = 12.dp, vertical = 8.dp) .fillMaxWidth().clickable { if (notification.post != null && notification.post.mediaAttachments.isEmpty()) { - Navigate.navigate("mention/" + notification.post.id, navController) + navController.navigate(Destination.Mention(notification.post.id)) } else if (notification.post != null && notification.post.mediaAttachments.isNotEmpty()) { - Navigate.navigate( - "single_post_screen/" + notification.post.id, navController - ) + navController.navigate(Destination.Post(notification.post.id)) } else if (notification.post == null) { - Navigate.navigate("profile_screen/" + notification.account.id, navController) + navController.navigate(Destination.Profile(notification.account.id)) } }, verticalAlignment = Alignment.CenterVertically @@ -108,7 +106,7 @@ fun CustomNotification( .width(46.dp) .clip(CircleShape) .clickable { - Navigate.navigate("profile_screen/" + notification.account?.id, navController) + navController.navigate(Destination.Profile(notification.account.id)) }) Spacer(modifier = Modifier.width(10.dp)) Column(Modifier.weight(1f)) { @@ -117,10 +115,7 @@ fun CustomNotification( text = notification.account.username, fontWeight = FontWeight.Bold, modifier = Modifier.clickable { - Navigate.navigate( - "profile_screen/" + notification.account.id, - navController - ) + navController.navigate(Destination.Profile(notification.account.id)) }) Text(text = text, overflow = TextOverflow.Ellipsis) @@ -152,12 +147,15 @@ fun CustomNotification( .aspectRatio(1f) .clip(RoundedCornerShape(4.dp)) .clickable { - Navigate.navigate( - "single_post_screen/" + if (doesMediaAttachmentExsist) { - notification.post!!.id - } else { - viewModel.ancestor!!.id + "?openReplies=true" - }, navController + navController.navigate( + Destination.Post( + id = if (doesMediaAttachmentExsist) { + notification.account.id + } else { + viewModel.ancestor!!.id + }, + openReplies = true + ) ) }) } diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/post/CommentsBottomSheet.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/post/CommentsBottomSheet.kt index fd8950ce..592704b9 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/post/CommentsBottomSheet.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/post/CommentsBottomSheet.kt @@ -65,7 +65,7 @@ import com.daniebeler.pfpixelix.ui.composables.post.reply.ReplyElementViewModel import com.daniebeler.pfpixelix.ui.composables.states.ErrorComposable import com.daniebeler.pfpixelix.ui.composables.states.FixedHeightLoadingComposable import com.daniebeler.pfpixelix.ui.composables.textfield_mentions.TextFieldMentionsComposable -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import com.daniebeler.pfpixelix.utils.TimeAgo import org.jetbrains.compose.resources.stringResource import pixelix.app.generated.resources.Res @@ -260,9 +260,7 @@ private fun ReplyElement( .width(42.dp) .clip(CircleShape) .clickable { - Navigate.navigate( - "profile_screen/" + reply.account.id, navController - ) + navController.navigate(Destination.Profile(reply.account.id)) }) Spacer(modifier = Modifier.width(12.dp)) @@ -273,9 +271,7 @@ private fun ReplyElement( fontSize = 12.sp, fontWeight = FontWeight.Bold, modifier = Modifier.clickable { - Navigate.navigate( - "profile_screen/" + reply.account.id, navController - ) + navController.navigate(Destination.Profile(reply.account.id)) }) Text( diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/post/LikesBottomSheet.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/post/LikesBottomSheet.kt index 9a3fd15d..df28d095 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/post/LikesBottomSheet.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/post/LikesBottomSheet.kt @@ -28,7 +28,7 @@ import androidx.compose.ui.unit.sp import androidx.navigation.NavController import coil3.compose.AsyncImage import com.daniebeler.pfpixelix.domain.model.Account -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import org.jetbrains.compose.resources.pluralStringResource import org.jetbrains.compose.resources.stringResource import pixelix.app.generated.resources.Res @@ -93,7 +93,7 @@ private fun LikedByAccountElement(account: Account, navController: NavController .padding(horizontal = 12.dp, vertical = 8.dp) .fillMaxWidth() .clickable { - Navigate.navigate("profile_screen/" + account.id, navController) + navController.navigate(Destination.Profile(account.id)) }, verticalAlignment = Alignment.CenterVertically ) { AsyncImage( diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/post/PostComposable.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/post/PostComposable.kt index 9636b1f8..76b97091 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/post/PostComposable.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/post/PostComposable.kt @@ -82,8 +82,8 @@ import com.daniebeler.pfpixelix.domain.model.MediaAttachment import com.daniebeler.pfpixelix.domain.model.Post import com.daniebeler.pfpixelix.ui.composables.hashtagMentionText.HashtagsMentionsTextView import com.daniebeler.pfpixelix.ui.composables.states.LoadingComposable +import com.daniebeler.pfpixelix.ui.navigation.Destination import com.daniebeler.pfpixelix.utils.BlurHashDecoder -import com.daniebeler.pfpixelix.utils.Navigate import com.daniebeler.pfpixelix.utils.TimeAgo import com.daniebeler.pfpixelix.utils.zoomable.rememberZoomState import kotlinx.coroutines.CoroutineScope @@ -208,9 +208,7 @@ fun PostComposable( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(8.dp), modifier = Modifier.padding(start = 16.dp, end = 12.dp).clickable(onClick = { - Navigate.navigate( - "profile_screen/" + reblogAccount.id, navController - ) + navController.navigate(Destination.Profile(reblogAccount.id)) }) ) { Icon(Icons.Outlined.Cached, contentDescription = "reblogged by") @@ -226,9 +224,7 @@ fun PostComposable( Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier.padding(start = 16.dp, end = 12.dp).clickable(onClick = { - Navigate.navigate( - "profile_screen/" + viewModel.post!!.account.id, navController - ) + navController.navigate(Destination.Profile(viewModel.post!!.account.id)) }) ) { AsyncImage( @@ -532,10 +528,7 @@ fun PostComposable( fontSize = 14.sp, fontWeight = FontWeight.Bold, modifier = Modifier.clickable { - Navigate.navigate( - "profile_screen/" + viewModel.post!!.likedBy!!.id, - navController - ) + navController.navigate(Destination.Profile(viewModel.post!!.likedBy!!.id!!)) }) if (post.favouritesCount > 1) { Text( diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/post/ShareBottomSheet.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/post/ShareBottomSheet.kt index cc5922b1..5e6abe3e 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/post/ShareBottomSheet.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/post/ShareBottomSheet.kt @@ -25,7 +25,7 @@ import com.daniebeler.pfpixelix.domain.model.Post import com.daniebeler.pfpixelix.domain.model.Visibility import com.daniebeler.pfpixelix.domain.service.platform.PlatformFeatures import com.daniebeler.pfpixelix.ui.composables.ButtonRowElement -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import org.jetbrains.compose.resources.getString import org.jetbrains.compose.resources.stringResource import org.jetbrains.compose.resources.vectorResource @@ -137,7 +137,7 @@ fun ShareBottomSheet( icon = Res.drawable.pencil_outline, text = stringResource(Res.string.edit_post), onClick = { - Navigate.navigate("edit_post_screen/${post.id}", navController = navController) + navController.navigate(Destination.EditPost(post.id)) } ) ButtonRowElement( diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/CollectionsComposable.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/CollectionsComposable.kt index ca511495..615c5109 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/CollectionsComposable.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/CollectionsComposable.kt @@ -34,7 +34,7 @@ import androidx.compose.ui.unit.sp import androidx.navigation.NavController import coil3.compose.AsyncImage import com.daniebeler.pfpixelix.ui.composables.InfiniteListHandler -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import org.jetbrains.compose.resources.stringResource import org.jetbrains.compose.resources.vectorResource import pixelix.app.generated.resources.Res @@ -74,7 +74,7 @@ fun CollectionsComposable( Modifier .padding(12.dp) .clickable { - Navigate.navigate("collection_screen/" + it.id, navController) + navController.navigate(Destination.Collection(it.id)) }, horizontalAlignment = Alignment.CenterHorizontally ) { AsyncImage( diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/MutualFollowersComposable.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/MutualFollowersComposable.kt index 6ad2819a..8f3bbaad 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/MutualFollowersComposable.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/MutualFollowersComposable.kt @@ -36,7 +36,7 @@ import androidx.compose.ui.unit.dp import androidx.navigation.NavController import coil3.compose.AsyncImage import com.daniebeler.pfpixelix.ui.composables.followers.FollowerElementComposable -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import org.jetbrains.compose.resources.stringResource import pixelix.app.generated.resources.Res import pixelix.app.generated.resources.and @@ -203,8 +203,7 @@ fun MutualFollowersComposable( annotatedString.getStringAnnotations("account", it, it) .firstOrNull()?.let { annotation -> - println(annotation.item) - Navigate.navigate("profile_screen/" + annotation.item, navController, false) + navController.navigate(Destination.Profile(annotation.item)) } }) } diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/ProfileTopSection.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/ProfileTopSection.kt index 8f9adfe5..38f9ce20 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/ProfileTopSection.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/ProfileTopSection.kt @@ -33,7 +33,7 @@ import coil3.compose.AsyncImage import com.daniebeler.pfpixelix.domain.model.Account import com.daniebeler.pfpixelix.domain.model.Relationship import com.daniebeler.pfpixelix.ui.composables.hashtagMentionText.HashtagsMentionsTextView -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import com.daniebeler.pfpixelix.utils.StringFormat import kotlinx.datetime.LocalDate import kotlinx.datetime.format.MonthNames @@ -46,12 +46,11 @@ import pixelix.app.generated.resources.admin import pixelix.app.generated.resources.blocked import pixelix.app.generated.resources.default_avatar import pixelix.app.generated.resources.follower -import pixelix.app.generated.resources.followers import pixelix.app.generated.resources.following import pixelix.app.generated.resources.follows_you +import pixelix.app.generated.resources.joined_date import pixelix.app.generated.resources.muted import pixelix.app.generated.resources.posts -import pixelix.app.generated.resources.joined_date @Composable fun ProfileTopSection( @@ -88,9 +87,7 @@ fun ProfileTopSection( Column(horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier.clickable { - Navigate.navigate( - "followers_screen/" + "followers/" + account.id, navController - ) + navController.navigate(Destination.Followers(account.id, true)) }) { Text( text = StringFormat.groupDigits(account.followersCount), @@ -102,9 +99,7 @@ fun ProfileTopSection( Column(horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier.clickable { - Navigate.navigate( - "followers_screen/" + "following/" + account.id, navController - ) + navController.navigate(Destination.Followers(account.id, false)) }) { Text( text = StringFormat.groupDigits(account.followingCount), diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/other_profile/OtherProfileComposable.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/other_profile/OtherProfileComposable.kt index b3f1e089..370ac48c 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/other_profile/OtherProfileComposable.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/other_profile/OtherProfileComposable.kt @@ -67,7 +67,7 @@ import com.daniebeler.pfpixelix.ui.composables.profile.ProfileTopSection import com.daniebeler.pfpixelix.ui.composables.profile.SwitchViewComposable import com.daniebeler.pfpixelix.ui.composables.profile.server_stats.DomainSoftwareComposable import com.daniebeler.pfpixelix.ui.composables.states.EmptyState -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource import org.jetbrains.compose.resources.vectorResource @@ -265,9 +265,7 @@ fun OtherProfileComposable( Button( onClick = { viewModel.accountState.account?.let { account -> - Navigate.navigate( - "chat/" + account.id, navController - ) + navController.navigate(Destination.Chat(account.id)) } }, modifier = Modifier.weight(1f), diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/own_profile/AccountSwitchBottomSheet.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/own_profile/AccountSwitchBottomSheet.kt index 102734ff..f3f83e1e 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/own_profile/AccountSwitchBottomSheet.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/own_profile/AccountSwitchBottomSheet.kt @@ -29,10 +29,10 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavController -import com.daniebeler.pfpixelix.utils.Destinations import com.daniebeler.pfpixelix.di.injectViewModel import com.daniebeler.pfpixelix.domain.model.credentialsToAccount import com.daniebeler.pfpixelix.ui.composables.custom_account.CustomAccount +import com.daniebeler.pfpixelix.ui.navigation.Destination import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -98,7 +98,7 @@ fun AccountSwitchBottomSheet( .padding(horizontal = 12.dp, vertical = 8.dp) .fillMaxWidth() .clickable { - navController.navigate(Destinations.NewLogin.route) + navController.navigate(Destination.NewLogin) closeBottomSheet() }, verticalAlignment = Alignment.CenterVertically diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/own_profile/AccountSwitchViewModel.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/own_profile/AccountSwitchViewModel.kt index 0d790122..18fc2377 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/own_profile/AccountSwitchViewModel.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/own_profile/AccountSwitchViewModel.kt @@ -8,7 +8,6 @@ import androidx.lifecycle.viewModelScope import com.daniebeler.pfpixelix.domain.service.session.AuthService import com.daniebeler.pfpixelix.domain.service.session.Credentials import com.daniebeler.pfpixelix.domain.service.session.SessionStorage -import com.daniebeler.pfpixelix.utils.Navigate import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import me.tatarka.inject.annotations.Inject @@ -45,7 +44,6 @@ class AccountSwitchViewModel @Inject constructor( } coroutine.invokeOnCompletion { - Navigate.changeAccount() changedAccount() loadAccounts() } diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/own_profile/ModalBottomSheetContent.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/own_profile/ModalBottomSheetContent.kt index a53588a4..f9847a63 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/own_profile/ModalBottomSheetContent.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/own_profile/ModalBottomSheetContent.kt @@ -8,12 +8,11 @@ import androidx.compose.foundation.verticalScroll import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.unit.dp import androidx.navigation.NavController import com.daniebeler.pfpixelix.ui.composables.ButtonRowElement import com.daniebeler.pfpixelix.ui.composables.ButtonRowElementWithRoundedImage -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import org.jetbrains.compose.resources.DrawableResource import org.jetbrains.compose.resources.imageResource import org.jetbrains.compose.resources.stringResource @@ -29,7 +28,6 @@ import pixelix.app.generated.resources.heart_outline import pixelix.app.generated.resources.liked_posts import pixelix.app.generated.resources.muted_accounts import pixelix.app.generated.resources.pixelfed_logo -import pixelix.app.generated.resources.pixelix_logo import pixelix.app.generated.resources.remove_circle_outline import pixelix.app.generated.resources.settings import pixelix.app.generated.resources.settings_outline @@ -64,7 +62,7 @@ fun ModalBottomSheetContent( text = stringResource(Res.string.liked_posts), onClick = { closeBottomSheet() - Navigate.navigate("liked_posts_screen", navController) + navController.navigate(Destination.LikedPosts) }) ButtonRowElement( @@ -72,7 +70,7 @@ fun ModalBottomSheetContent( text = stringResource(Res.string.bookmarked_posts), onClick = { closeBottomSheet() - Navigate.navigate("bookmarked_posts_screen", navController) + navController.navigate(Destination.BookmarkedPosts) }) ButtonRowElement( @@ -80,7 +78,7 @@ fun ModalBottomSheetContent( text = stringResource(Res.string.followed_hashtags), onClick = { closeBottomSheet() - Navigate.navigate("followed_hashtags_screen", navController) + navController.navigate(Destination.FollowedHashtags) }) ButtonRowElement( @@ -88,7 +86,7 @@ fun ModalBottomSheetContent( text = stringResource(Res.string.muted_accounts), onClick = { closeBottomSheet() - Navigate.navigate("muted_accounts_screen", navController) + navController.navigate(Destination.MutedAccounts) }) ButtonRowElement( @@ -96,7 +94,7 @@ fun ModalBottomSheetContent( text = stringResource(Res.string.blocked_accounts), onClick = { closeBottomSheet() - Navigate.navigate("blocked_accounts_screen", navController) + navController.navigate(Destination.BlockedAccounts) }) HorizontalDivider(Modifier.padding(12.dp)) @@ -106,7 +104,7 @@ fun ModalBottomSheetContent( text = stringResource(Res.string.about_x, instanceDomain), onClick = { closeBottomSheet() - Navigate.navigate("about_instance_screen", navController) + navController.navigate(Destination.AboutInstance) }) ButtonRowElement( @@ -114,7 +112,7 @@ fun ModalBottomSheetContent( text = stringResource(Res.string.about_pixelix), onClick = { closeBottomSheet() - Navigate.navigate("about_pixelix_screen", navController) + navController.navigate(Destination.AboutPixelix) }) } diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/own_profile/OwnProfileComposable.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/own_profile/OwnProfileComposable.kt index 44bec909..859ae7af 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/own_profile/OwnProfileComposable.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/profile/own_profile/OwnProfileComposable.kt @@ -52,7 +52,7 @@ import com.daniebeler.pfpixelix.ui.composables.profile.SwitchViewComposable import com.daniebeler.pfpixelix.ui.composables.profile.server_stats.DomainSoftwareComposable import com.daniebeler.pfpixelix.ui.composables.states.EmptyState import com.daniebeler.pfpixelix.ui.composables.states.FullscreenErrorComposable -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import org.jetbrains.compose.resources.stringResource import pixelix.app.generated.resources.Res import pixelix.app.generated.resources.edit_profile @@ -129,9 +129,7 @@ fun OwnProfileComposable( ) { Button( onClick = { - Navigate.navigate( - "edit_profile_screen", navController - ) + navController.navigate(Destination.EditProfile) }, modifier = Modifier.fillMaxWidth(), shape = RoundedCornerShape(12.dp), diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/about_instance/AboutInstanceComposable.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/about_instance/AboutInstanceComposable.kt index 1dade6b4..04720463 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/about_instance/AboutInstanceComposable.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/about_instance/AboutInstanceComposable.kt @@ -36,7 +36,7 @@ import coil3.compose.AsyncImage import com.daniebeler.pfpixelix.di.injectViewModel import com.daniebeler.pfpixelix.ui.composables.states.FullscreenErrorComposable import com.daniebeler.pfpixelix.ui.composables.states.FullscreenLoadingComposable -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import com.daniebeler.pfpixelix.utils.StringFormat import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource @@ -133,9 +133,7 @@ fun AboutInstanceComposable( Row(modifier = Modifier .clickable { - Navigate.navigate( - "profile_screen/" + account.id, navController - ) + navController.navigate(Destination.Profile(account.id)) } .padding(horizontal = 12.dp, vertical = 8.dp) .fillMaxWidth(), diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/about_pixelix/AboutPixelixComposable.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/about_pixelix/AboutPixelixComposable.kt index 91265da5..8a5ec1bc 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/about_pixelix/AboutPixelixComposable.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/about_pixelix/AboutPixelixComposable.kt @@ -42,7 +42,7 @@ import androidx.compose.ui.unit.sp import androidx.navigation.NavController import com.daniebeler.pfpixelix.di.injectViewModel import com.daniebeler.pfpixelix.ui.composables.ButtonRowElement -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource import org.jetbrains.compose.resources.vectorResource @@ -172,9 +172,7 @@ fun AboutPixelixComposable( .width(32.dp) .height(32.dp) .clickable { - Navigate.navigate( - "profile_screen/677938259497057424", navController - ) + navController.navigate(Destination.Profile("677938259497057424")) }) Spacer(modifier = Modifier.width(16.dp)) @@ -221,9 +219,7 @@ fun AboutPixelixComposable( .width(32.dp) .height(32.dp) .clickable { - Navigate.navigate( - "profile_screen/497910174831013185", navController - ) + navController.navigate(Destination.Profile("497910174831013185")) }) Spacer(modifier = Modifier.width(16.dp)) diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/blocked_accounts/CustomBlockedAccountRow.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/blocked_accounts/CustomBlockedAccountRow.kt index e2a89f97..06dd17ce 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/blocked_accounts/CustomBlockedAccountRow.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/blocked_accounts/CustomBlockedAccountRow.kt @@ -20,7 +20,7 @@ import androidx.navigation.NavController import coil3.compose.AsyncImage import com.daniebeler.pfpixelix.domain.model.Account import com.daniebeler.pfpixelix.ui.composables.profile.other_profile.UnBlockAccountAlert -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource import pixelix.app.generated.resources.Res @@ -39,7 +39,7 @@ fun CustomBlockedAccountRow( ) { Row(verticalAlignment = Alignment.CenterVertically, modifier = Modifier.clickable { - Navigate.navigate("profile_screen/" + account.id, navController) + navController.navigate(Destination.Profile(account.id)) }) { AsyncImage( model = account.avatar, diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/followed_hashtags/FollowedHashtagsComposable.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/followed_hashtags/FollowedHashtagsComposable.kt index b8db2e69..bf069fa8 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/followed_hashtags/FollowedHashtagsComposable.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/followed_hashtags/FollowedHashtagsComposable.kt @@ -30,7 +30,7 @@ import com.daniebeler.pfpixelix.ui.composables.states.EmptyState import com.daniebeler.pfpixelix.ui.composables.states.FullscreenEmptyStateComposable import com.daniebeler.pfpixelix.ui.composables.states.FullscreenErrorComposable import com.daniebeler.pfpixelix.ui.composables.states.FullscreenLoadingComposable -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import org.jetbrains.compose.resources.stringResource import org.jetbrains.compose.resources.vectorResource import pixelix.app.generated.resources.Res @@ -89,7 +89,7 @@ fun FollowedHashtagsComposable( message = "Followed hashtags will appear here", buttonText = "Explore trending hashtags", onClick = { - Navigate.navigate("search_screen/2", navController) + navController.navigate(Destination.Search(2)) }) ) } diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/muted_accounts/CustomMutedAccountRow.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/muted_accounts/CustomMutedAccountRow.kt index d16fdea1..8ea45225 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/muted_accounts/CustomMutedAccountRow.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/muted_accounts/CustomMutedAccountRow.kt @@ -20,7 +20,7 @@ import androidx.navigation.NavController import coil3.compose.AsyncImage import com.daniebeler.pfpixelix.domain.model.Account import com.daniebeler.pfpixelix.ui.composables.profile.other_profile.UnMuteAccountAlert -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource import pixelix.app.generated.resources.Res @@ -41,7 +41,7 @@ fun CustomMutedAccountRow( Row(verticalAlignment = Alignment.CenterVertically, modifier = Modifier.clickable { - Navigate.navigate("profile_screen/" + account.id, navController) + navController.navigate(Destination.Profile(account.id)) } ) { AsyncImage( diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/preferences/prefs/prefs/CustomizeAppIconPref.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/preferences/prefs/prefs/CustomizeAppIconPref.kt index c67d7045..045d3297 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/preferences/prefs/prefs/CustomizeAppIconPref.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/preferences/prefs/prefs/CustomizeAppIconPref.kt @@ -1,18 +1,15 @@ package com.daniebeler.pfpixelix.ui.composables.settings.preferences.prefs import androidx.compose.runtime.Composable -import androidx.compose.ui.graphics.ImageBitmap import androidx.navigation.NavController -import androidx.navigation.compose.rememberNavController import com.daniebeler.pfpixelix.ui.composables.settings.preferences.basic.SettingPref -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import org.jetbrains.compose.resources.DrawableResource import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource import pixelix.app.generated.resources.Res import pixelix.app.generated.resources.chevron_forward_outline import pixelix.app.generated.resources.customize_app_icon -import pixelix.app.generated.resources.pixelix_logo @Composable fun CustomizeAppIconPref(navController: NavController, closePreferenceDrawer: () -> Unit, logo: DrawableResource) { @@ -21,6 +18,6 @@ fun CustomizeAppIconPref(navController: NavController, closePreferenceDrawer: () trailingContent = Res.drawable.chevron_forward_outline, onClick = { closePreferenceDrawer() - Navigate.navigate("icon_selection_screen", navController) + navController.navigate(Destination.IconSelection) }) } \ No newline at end of file diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/single_post/SinglePostComposable.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/single_post/SinglePostComposable.kt index 3d17393a..9701580c 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/single_post/SinglePostComposable.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/single_post/SinglePostComposable.kt @@ -27,7 +27,7 @@ import com.daniebeler.pfpixelix.di.injectViewModel import com.daniebeler.pfpixelix.ui.composables.post.PostComposable import com.daniebeler.pfpixelix.ui.composables.states.ErrorComposable import com.daniebeler.pfpixelix.ui.composables.states.LoadingComposable -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import org.jetbrains.compose.resources.stringResource import org.jetbrains.compose.resources.vectorResource import pixelix.app.generated.resources.Res @@ -87,7 +87,9 @@ fun SinglePostComposable( Column(modifier = Modifier.verticalScroll(scrollState)) { if (viewModel.postState.post != null) { PostComposable(viewModel.postState.post!!, navController, postGetsDeleted = { - Navigate.navigateAndDeleteBackStack("own_profile_screen", navController) + navController.navigate(Destination.OwnProfile) { + popUpTo(0) { inclusive = true } + } }, setZindex = { }, openReplies) } diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/timelines/hashtag_timeline/HashtagTimelineComposable.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/timelines/hashtag_timeline/HashtagTimelineComposable.kt index ed8a9152..35e1a1cd 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/timelines/hashtag_timeline/HashtagTimelineComposable.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/timelines/hashtag_timeline/HashtagTimelineComposable.kt @@ -1,35 +1,22 @@ package com.daniebeler.pfpixelix.ui.composables.timelines.hashtag_timeline -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.WindowInsetsSides -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.only import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.systemBars -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.LazyRow -import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.foundation.rememberScrollState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack -import androidx.compose.material.icons.outlined.Photo -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.CenterAlignedTopAppBar import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton -import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.material3.TopAppBarDefaults -import androidx.compose.material3.pulltorefresh.PullToRefreshBox import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment @@ -37,26 +24,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import androidx.navigation.NavController import com.daniebeler.pfpixelix.di.injectViewModel import com.daniebeler.pfpixelix.ui.composables.FollowButton -import com.daniebeler.pfpixelix.ui.composables.InfiniteListHandler -import com.daniebeler.pfpixelix.ui.composables.InfinitePostsGrid import com.daniebeler.pfpixelix.ui.composables.InfinitePostsList -import com.daniebeler.pfpixelix.ui.composables.ToTopButton -import com.daniebeler.pfpixelix.ui.composables.profile.AccountState -import com.daniebeler.pfpixelix.ui.composables.profile.PostsState -import com.daniebeler.pfpixelix.ui.composables.profile.PostsWrapperComposable -import com.daniebeler.pfpixelix.ui.composables.profile.SwitchViewComposable -import com.daniebeler.pfpixelix.ui.composables.profile.ViewEnum -import com.daniebeler.pfpixelix.ui.composables.states.EmptyState -import com.daniebeler.pfpixelix.utils.Navigate -import com.daniebeler.pfpixelix.utils.StringFormat -import org.jetbrains.compose.resources.stringResource -import pixelix.app.generated.resources.Res -import pixelix.app.generated.resources.posts @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/timelines/home_timeline/HomeTimelineComposable.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/timelines/home_timeline/HomeTimelineComposable.kt index 05ca0bec..4334c006 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/timelines/home_timeline/HomeTimelineComposable.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/timelines/home_timeline/HomeTimelineComposable.kt @@ -9,9 +9,8 @@ import androidx.compose.ui.Modifier import androidx.navigation.NavController import com.daniebeler.pfpixelix.di.injectViewModel import com.daniebeler.pfpixelix.ui.composables.InfinitePostsList -import com.daniebeler.pfpixelix.ui.composables.profile.ViewEnum import com.daniebeler.pfpixelix.ui.composables.states.EmptyState -import com.daniebeler.pfpixelix.utils.Navigate +import com.daniebeler.pfpixelix.ui.navigation.Destination import org.jetbrains.compose.resources.stringResource import pixelix.app.generated.resources.Res import pixelix.app.generated.resources.explore_trending_profiles @@ -35,7 +34,7 @@ fun HomeTimelineComposable( message = stringResource(Res.string.follow_accounts_or_hashtags_to_fill_your_home_timeline), buttonText = stringResource(Res.string.explore_trending_profiles), onClick = { - Navigate.navigate("search_screen/1", navController) + navController.navigate(Destination.Search(1)) }), getItemsPaginated = { viewModel.getItemsPaginated() diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/navigation/Navigation.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/navigation/Navigation.kt new file mode 100644 index 00000000..87f0a023 --- /dev/null +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/navigation/Navigation.kt @@ -0,0 +1,216 @@ +package com.daniebeler.pfpixelix.ui.navigation + +import androidx.compose.ui.window.DialogProperties +import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavHostController +import androidx.navigation.compose.composable +import androidx.navigation.compose.dialog +import androidx.navigation.toRoute +import com.daniebeler.pfpixelix.EdgeToEdgeDialog +import com.daniebeler.pfpixelix.ui.composables.HomeComposable +import com.daniebeler.pfpixelix.ui.composables.collection.CollectionComposable +import com.daniebeler.pfpixelix.ui.composables.direct_messages.chat.ChatComposable +import com.daniebeler.pfpixelix.ui.composables.direct_messages.conversations.ConversationsComposable +import com.daniebeler.pfpixelix.ui.composables.edit_post.EditPostComposable +import com.daniebeler.pfpixelix.ui.composables.edit_profile.EditProfileComposable +import com.daniebeler.pfpixelix.ui.composables.explore.ExploreComposable +import com.daniebeler.pfpixelix.ui.composables.followers.FollowersMainComposable +import com.daniebeler.pfpixelix.ui.composables.mention.MentionComposable +import com.daniebeler.pfpixelix.ui.composables.newpost.NewPostComposable +import com.daniebeler.pfpixelix.ui.composables.notifications.NotificationsComposable +import com.daniebeler.pfpixelix.ui.composables.profile.other_profile.OtherProfileComposable +import com.daniebeler.pfpixelix.ui.composables.profile.own_profile.OwnProfileComposable +import com.daniebeler.pfpixelix.ui.composables.session.LoginComposable +import com.daniebeler.pfpixelix.ui.composables.settings.about_instance.AboutInstanceComposable +import com.daniebeler.pfpixelix.ui.composables.settings.about_pixelix.AboutPixelixComposable +import com.daniebeler.pfpixelix.ui.composables.settings.blocked_accounts.BlockedAccountsComposable +import com.daniebeler.pfpixelix.ui.composables.settings.bookmarked_posts.BookmarkedPostsComposable +import com.daniebeler.pfpixelix.ui.composables.settings.followed_hashtags.FollowedHashtagsComposable +import com.daniebeler.pfpixelix.ui.composables.settings.icon_selection.IconSelectionComposable +import com.daniebeler.pfpixelix.ui.composables.settings.liked_posts.LikedPostsComposable +import com.daniebeler.pfpixelix.ui.composables.settings.muted_accounts.MutedAccountsComposable +import com.daniebeler.pfpixelix.ui.composables.single_post.SinglePostComposable +import com.daniebeler.pfpixelix.ui.composables.timelines.hashtag_timeline.HashtagTimelineComposable +import com.daniebeler.pfpixelix.utils.KmpUri +import com.daniebeler.pfpixelix.utils.toKmpUri +import kotlinx.serialization.Serializable + +sealed interface Destination { + @Serializable data class Hashtag(val hashtag: String) : Destination + @Serializable data class HashtagTimeline(val hashtag: String) : Destination + @Serializable data class Post( + val id: String, + val refresh: Boolean = false, + val openReplies: Boolean = false + ) : Destination + @Serializable data class EditPost(val id: String) : Destination + @Serializable data class Collection(val id: String) : Destination + @Serializable data class Followers(val userId: String, val isFollowers: Boolean) : Destination + @Serializable data object Conversations : Destination + @Serializable data class Chat(val id: String) : Destination + @Serializable data class Mention(val id: String) : Destination + @Serializable data object EditProfile : Destination + @Serializable data object IconSelection : Destination + @Serializable data object MutedAccounts : Destination + @Serializable data object BlockedAccounts : Destination + @Serializable data object LikedPosts : Destination + @Serializable data object BookmarkedPosts : Destination + @Serializable data object FollowedHashtags : Destination + @Serializable data object AboutInstance : Destination + @Serializable data object AboutPixelix : Destination + @Serializable data class Profile(val userId: String) : Destination + @Serializable data class ProfileByUsername(val userName: String) : Destination + @Serializable data object FirstLogin : Destination + @Serializable data object NewLogin : Destination + @Serializable data object Feeds : Destination + @Serializable data class Search(val page: Int = 0) : Destination + @Serializable data class NewPost(val uris: List = emptyList()) : Destination + @Serializable data object Notifications : Destination + @Serializable data object OwnProfile : Destination +} + +internal fun NavGraphBuilder.navigationGraph( + navController: NavHostController, + openPreferencesDrawer: () -> Unit, + exitApp: () -> Unit +) { + dialog { + EdgeToEdgeDialog( + onDismissRequest = exitApp, + properties = DialogProperties( + dismissOnClickOutside = false, + usePlatformDefaultWidth = false, + ) + ) { + LoginComposable(navController = navController) + } + } + dialog { + EdgeToEdgeDialog( + onDismissRequest = { navController.popBackStack() }, + properties = DialogProperties( + dismissOnClickOutside = false, + usePlatformDefaultWidth = false, + ) + ) { + LoginComposable(true, navController) + } + } + + composable { + HomeComposable(navController, openPreferencesDrawer) + } + + composable { navBackStackEntry -> + val args = navBackStackEntry.toRoute() + HashtagTimelineComposable(navController, args.hashtag) + } + + composable { + NotificationsComposable(navController) + } + + composable { navBackStackEntry -> + val args = navBackStackEntry.toRoute() + OtherProfileComposable(navController, userId = args.userId, byUsername = null) + } + + composable { navBackStackEntry -> + val args = navBackStackEntry.toRoute() + OtherProfileComposable(navController, userId = "", byUsername = args.userName) + } + + composable { navBackStackEntry -> + val args = navBackStackEntry.toRoute() + HashtagTimelineComposable(navController, args.hashtag) + } + + composable { + EditProfileComposable(navController) + } + + composable { + IconSelectionComposable(navController) + } + + composable { navBackStackEntry -> + val args = navBackStackEntry.toRoute() + val imageUris: List? = args.uris.map { it.toKmpUri() } + NewPostComposable(navController, imageUris) + } + + composable { navBackStackEntry -> + val args = navBackStackEntry.toRoute() + EditPostComposable(args.id, navController) + } + + composable { + MutedAccountsComposable(navController) + } + + composable { + BlockedAccountsComposable(navController) + } + + composable { + LikedPostsComposable(navController) + } + + composable { + BookmarkedPostsComposable(navController) + } + + composable { + FollowedHashtagsComposable(navController) + } + + composable { + AboutInstanceComposable(navController) + } + + composable { + AboutPixelixComposable(navController) + } + + composable { + OwnProfileComposable(navController, openPreferencesDrawer) + } + + composable { navBackStackEntry -> + val args = navBackStackEntry.toRoute() + FollowersMainComposable( + navController, + accountId = args.userId, + isFollowers = args.isFollowers + ) + } + + composable { navBackStackEntry -> + val args = navBackStackEntry.toRoute() + SinglePostComposable(navController, postId = args.id, args.refresh, args.openReplies) + } + + composable { navBackStackEntry -> + val args = navBackStackEntry.toRoute() + CollectionComposable(navController, collectionId = args.id) + } + + composable { navBackStackEntry -> + val args = navBackStackEntry.toRoute() + ExploreComposable(navController, args.page) + } + + composable { + ConversationsComposable(navController = navController) + } + + composable { navBackStackEntry -> + val args = navBackStackEntry.toRoute() + ChatComposable(navController = navController, accountId = args.id) + } + + composable { navBackStackEntry -> + val args = navBackStackEntry.toRoute() + MentionComposable(navController = navController, mentionId = args.id) + } +} \ No newline at end of file diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/utils/Destinations.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/utils/Destinations.kt deleted file mode 100644 index 4215a97a..00000000 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/utils/Destinations.kt +++ /dev/null @@ -1,143 +0,0 @@ -package com.daniebeler.pfpixelix.utils - -import org.jetbrains.compose.resources.DrawableResource -import org.jetbrains.compose.resources.StringResource -import pixelix.app.generated.resources.Res -import pixelix.app.generated.resources.add_circle -import pixelix.app.generated.resources.add_circle_outline -import pixelix.app.generated.resources.alerts -import pixelix.app.generated.resources.bookmark_outline -import pixelix.app.generated.resources.home -import pixelix.app.generated.resources.house -import pixelix.app.generated.resources.house_fill -import pixelix.app.generated.resources.notifications -import pixelix.app.generated.resources.notifications_outline -import pixelix.app.generated.resources.profile -import pixelix.app.generated.resources.search -import pixelix.app.generated.resources.search_outline - -sealed class Destinations( - val route: String, - val icon: DrawableResource = Res.drawable.bookmark_outline, - val activeIcon: DrawableResource = Res.drawable.bookmark_outline, - val label: StringResource = Res.string.home -) { - data object FirstLogin : Destinations( - route = "first_login_screen" - ) - - data object NewLogin : Destinations( - route = "new_login_screen" - ) - - data object HomeScreen : Destinations( - route = "home_screen", - icon = Res.drawable.house, - activeIcon = Res.drawable.house_fill, - label = Res.string.home - ) - - data object NotificationsScreen : Destinations( - route = "notifications_screen", - icon = Res.drawable.notifications_outline, - activeIcon = Res.drawable.notifications, - label = Res.string.alerts - ) - - data object OwnProfile : Destinations( - route = "own_profile_screen", - icon = Res.drawable.bookmark_outline, - activeIcon = Res.drawable.bookmark_outline, - label = Res.string.profile - ) - - data object NewPost : Destinations( - route = "new_post_screen", icon = Res.drawable.add_circle_outline, - activeIcon = Res.drawable.add_circle - ) - - data object Search : Destinations( - route = "search_screen/{initialPage}", - icon = Res.drawable.search_outline, - activeIcon = Res.drawable.search, - label = Res.string.search - ) - - data object Profile : Destinations( - route = "profile_screen/{userid}" - ) - - data object ProfileByUsername : Destinations( - route = "profile_screen/byUsername/{username}" - ) - - data object EditProfile : Destinations( - route = "edit_profile_screen" - ) - - data object IconSelection : Destinations( - route = "icon_selection_screen" - ) - - data object MutedAccounts : Destinations( - route = "muted_accounts_screen" - ) - - data object BlockedAccounts : Destinations( - route = "blocked_accounts_screen" - ) - - data object LikedPosts : Destinations( - route = "liked_posts_screen" - ) - - data object BookmarkedPosts : Destinations( - route = "bookmarked_posts_screen" - ) - - data object FollowedHashtags : Destinations( - route = "followed_hashtags_screen" - ) - - data object AboutInstance : Destinations( - route = "about_instance_screen" - ) - - data object AboutPixelix : Destinations( - route = "about_pixelix_screen" - ) - - data object EditPost : Destinations( - route = "edit_post_screen/{postId}" - ) - - data object Hashtag : Destinations( - route = "hashtag_timeline_screen/{hashtag}" - ) - - data object SinglePost : Destinations( - route = "single_post_screen/{postid}" - ) - - data object Collection : Destinations( - route = "collection_screen/{collectionid}" - ) - - data object Followers : Destinations( - route = "followers_screen/{page}/{userid}" - ) - - - - data object Conversation : Destinations( - route = "conversations" - ) - - data object Chat : Destinations( - route = "chat/{userid}" - ) - - data object Mention : Destinations( - route = "mention/{mentionid}" - ) -} \ No newline at end of file diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/utils/Navigate.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/utils/Navigate.kt deleted file mode 100644 index 5c491c67..00000000 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/utils/Navigate.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.daniebeler.pfpixelix.utils - -import androidx.navigation.NavController - -object Navigate { - private var currentBottomBarRoute: String? = null - private var restoreStateRoutes: List = listOf("home_screen") - - fun changeAccount() { - restoreStateRoutes = emptyList() - } - - fun navigate(route: String, navController: NavController, singleTop: Boolean = true) { - if (navController.currentDestination!!.route == route) { - return - } - val alreadySaved = restoreStateRoutes.indexOf(route) != -1 - if (!alreadySaved) { - restoreStateRoutes = restoreStateRoutes + route - } - navController.navigate(route) { - launchSingleTop = singleTop - restoreState = alreadySaved - } - } - - fun navigateWithPopUp(newRoute: String, navController: NavController) { - if (navController.currentDestination!!.route == newRoute) { - return - } - val alreadySaved = restoreStateRoutes.indexOf(newRoute) != -1 - if (!alreadySaved) { - restoreStateRoutes = restoreStateRoutes + newRoute - } - if (newRoute == currentBottomBarRoute) { - navController.navigate(newRoute) { - popUpTo(currentBottomBarRoute!!) - launchSingleTop = true - } - } else { - navController.navigate(newRoute) { - popUpTo(0) { - saveState = true - } - launchSingleTop = true - restoreState = alreadySaved - } - } - currentBottomBarRoute = newRoute - } - - fun navigateAndDeleteBackStack(route: String, navController: NavController) { - navController.navigate(route) { - popUpTo(0) { - inclusive = true - } - - launchSingleTop = true - } - } -} \ No newline at end of file From b76390e39151d81471d194d8656fd5e5e59a3037 Mon Sep 17 00:00:00 2001 From: Konstantin Tskhovrebov Date: Sat, 8 Mar 2025 22:44:04 +0100 Subject: [PATCH 3/3] Use logger instead of println's --- .../domain/service/file/AndroidFileService.kt | 4 +--- .../domain/service/search/SavedSearchesService.kt | 7 ++++--- .../composables/direct_messages/chat/ChatViewModel.kt | 7 ++++--- .../pfpixelix/ui/composables/post/PostViewModel.kt | 6 +++--- .../composables/post/reply/ReplyElementViewModel.kt | 11 ++++++----- .../preferences/prefs/prefs/MoreSettingsPref.kt | 3 ++- .../preferences/prefs/prefs/RepostSettingsPref.kt | 7 ------- .../hashtag_timeline/HashtagTimelineViewModel.kt | 7 ++++--- 8 files changed, 24 insertions(+), 28 deletions(-) diff --git a/app/src/androidMain/kotlin/com/daniebeler/pfpixelix/domain/service/file/AndroidFileService.kt b/app/src/androidMain/kotlin/com/daniebeler/pfpixelix/domain/service/file/AndroidFileService.kt index 10a3bc8d..1a31ef1d 100644 --- a/app/src/androidMain/kotlin/com/daniebeler/pfpixelix/domain/service/file/AndroidFileService.kt +++ b/app/src/androidMain/kotlin/com/daniebeler/pfpixelix/domain/service/file/AndroidFileService.kt @@ -53,12 +53,10 @@ class AndroidFileService( return@launch } - println(bitmap.toString()) - uri = saveImageToMediaStore( context, generateUniqueName(name, false, context), - bitmap!! + bitmap ) if (uri == null) { cancel("an error occured when saving the image") diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/domain/service/search/SavedSearchesService.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/domain/service/search/SavedSearchesService.kt index 8fe03b1b..c6f1a6e2 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/domain/service/search/SavedSearchesService.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/domain/service/search/SavedSearchesService.kt @@ -1,6 +1,7 @@ package com.daniebeler.pfpixelix.domain.service.search import androidx.datastore.core.DataStore +import co.touchlab.kermit.Logger import com.daniebeler.pfpixelix.domain.model.Account import com.daniebeler.pfpixelix.domain.model.SavedSearchItem import com.daniebeler.pfpixelix.domain.model.SavedSearchType @@ -38,7 +39,7 @@ class SavedSearchesService( } } } catch (e: Exception) { - println(e) + Logger.e("Add item error", e) } } @@ -50,7 +51,7 @@ class SavedSearchesService( ) } } catch (e: Exception) { - println(e) + Logger.e("deleteElement error", e) } } @@ -59,7 +60,7 @@ class SavedSearchesService( try { dataStore.updateData { SavedSearches() } } catch (e: Exception) { - println(e) + Logger.e("clearSavedSearches error", e) } } } \ No newline at end of file diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/direct_messages/chat/ChatViewModel.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/direct_messages/chat/ChatViewModel.kt index d7c60ba1..efff60c8 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/direct_messages/chat/ChatViewModel.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/direct_messages/chat/ChatViewModel.kt @@ -5,10 +5,11 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.daniebeler.pfpixelix.domain.service.utils.Resource +import co.touchlab.kermit.Logger import com.daniebeler.pfpixelix.domain.model.Message import com.daniebeler.pfpixelix.domain.model.NewMessage import com.daniebeler.pfpixelix.domain.service.dm.DirectMessagesService +import com.daniebeler.pfpixelix.domain.service.utils.Resource import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import me.tatarka.inject.annotations.Inject @@ -131,11 +132,11 @@ class ChatViewModel @Inject constructor( } is Resource.Error -> { - println(result.message) + Logger.e(result.message) } is Resource.Loading -> { - println("is loading") + Logger.v("is loading") } } }.launchIn(viewModelScope) diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/post/PostViewModel.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/post/PostViewModel.kt index 7ac7ed9a..c61e9812 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/post/PostViewModel.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/post/PostViewModel.kt @@ -5,6 +5,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import co.touchlab.kermit.Logger import com.daniebeler.pfpixelix.domain.model.LikedBy import com.daniebeler.pfpixelix.domain.model.Post import com.daniebeler.pfpixelix.domain.service.account.AccountService @@ -17,7 +18,6 @@ import com.daniebeler.pfpixelix.domain.service.session.AuthService import com.daniebeler.pfpixelix.domain.service.utils.Resource import com.daniebeler.pfpixelix.ui.composables.post.reply.OwnReplyState import com.daniebeler.pfpixelix.ui.composables.post.reply.RepliesState -import com.daniebeler.pfpixelix.utils.TimeAgo import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.launchIn @@ -163,11 +163,11 @@ class PostViewModel @Inject constructor( } is Resource.Error -> { - println(result.message) + Logger.e(result.message) } is Resource.Loading -> { - println("is loading") + Logger.v("is loading") } } }.launchIn(viewModelScope) diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/post/reply/ReplyElementViewModel.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/post/reply/ReplyElementViewModel.kt index 6572c17c..3921c9c6 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/post/reply/ReplyElementViewModel.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/post/reply/ReplyElementViewModel.kt @@ -5,10 +5,11 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.daniebeler.pfpixelix.domain.service.utils.Resource +import co.touchlab.kermit.Logger import com.daniebeler.pfpixelix.domain.model.Post import com.daniebeler.pfpixelix.domain.service.editor.PostEditorService import com.daniebeler.pfpixelix.domain.service.post.PostService +import com.daniebeler.pfpixelix.domain.service.utils.Resource import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import me.tatarka.inject.annotations.Inject @@ -74,10 +75,10 @@ class ReplyElementViewModel @Inject constructor( } is Resource.Error -> { - println(result.message) + Logger.e(result.message) } is Resource.Loading -> { - println("is loading") + Logger.v("is loading") } } }.launchIn(viewModelScope) @@ -95,7 +96,7 @@ class ReplyElementViewModel @Inject constructor( } is Resource.Loading -> { - println("is loading") + Logger.v("is loading") } } }.launchIn(viewModelScope) @@ -113,7 +114,7 @@ class ReplyElementViewModel @Inject constructor( } is Resource.Loading -> { - println("is loading") + Logger.v("is loading") } } }.launchIn(viewModelScope) diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/preferences/prefs/prefs/MoreSettingsPref.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/preferences/prefs/prefs/MoreSettingsPref.kt index 51306b34..d60e23cb 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/preferences/prefs/prefs/MoreSettingsPref.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/preferences/prefs/prefs/MoreSettingsPref.kt @@ -1,6 +1,7 @@ package com.daniebeler.pfpixelix.ui.composables.settings.preferences.prefs import androidx.compose.runtime.Composable +import co.touchlab.kermit.Logger import com.daniebeler.pfpixelix.ui.composables.settings.preferences.basic.SettingPref import org.jetbrains.compose.resources.stringResource import pixelix.app.generated.resources.Res @@ -21,6 +22,6 @@ fun MoreSettingsPref(openUrl: () -> Unit) { @Composable private fun MoreSettingsPrefPreview() { MoreSettingsPref(openUrl = { - println("URL opened: url") + Logger.v("URL opened: url") }) } diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/preferences/prefs/prefs/RepostSettingsPref.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/preferences/prefs/prefs/RepostSettingsPref.kt index da96ec3f..7325410a 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/preferences/prefs/prefs/RepostSettingsPref.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/settings/preferences/prefs/prefs/RepostSettingsPref.kt @@ -18,10 +18,3 @@ fun RepostSettingsPref(openUrl: () -> Unit) { onClick = openUrl ) } - -@Composable -private fun RepostSettingsPrefPreview() { - RepostSettingsPref(openUrl = { - println("URL opened: url") - }) -} diff --git a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/timelines/hashtag_timeline/HashtagTimelineViewModel.kt b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/timelines/hashtag_timeline/HashtagTimelineViewModel.kt index cf22eeed..93109587 100644 --- a/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/timelines/hashtag_timeline/HashtagTimelineViewModel.kt +++ b/app/src/commonMain/kotlin/com/daniebeler/pfpixelix/ui/composables/timelines/hashtag_timeline/HashtagTimelineViewModel.kt @@ -5,6 +5,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import co.touchlab.kermit.Logger import com.daniebeler.pfpixelix.domain.model.Post import com.daniebeler.pfpixelix.domain.model.RelatedHashtag import com.daniebeler.pfpixelix.domain.repository.PixelfedApi @@ -135,10 +136,10 @@ class HashtagTimelineViewModel @Inject constructor( fun getRelatedHashtags(hashtag: String) { searchService.getRelatedHashtags(hashtag).onEach { result -> if (result is Resource.Success) { - relatedHashtags = result.data ?: emptyList() - println("juhuu" + result.data) + relatedHashtags = result.data + Logger.v("juhuu" + result.data) } else { - println("fief" + result.message) + Logger.v("fief" + result.message) } }.launchIn(viewModelScope) }