diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/decorations/ClawNavigationBar.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/decorations/ClawNavigationBar.kt index 497d6237..6d2d33a8 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/decorations/ClawNavigationBar.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/decorations/ClawNavigationBar.kt @@ -32,6 +32,7 @@ import dev.chrisbanes.haze.HazeDefaults import dev.chrisbanes.haze.HazeState import dev.chrisbanes.haze.HazeStyle import dev.chrisbanes.haze.hazeChild +import dev.msfjarvis.claw.android.ui.navigation.AppDestinations import dev.msfjarvis.claw.android.ui.navigation.Destination import dev.msfjarvis.claw.android.ui.navigation.matches import dev.msfjarvis.claw.common.ui.FloatingNavigationBar @@ -118,10 +119,22 @@ fun ClawNavigationBar( ) } -class NavigationItem( +class NavigationItem +private constructor( + val icon: ImageVector, val label: String, val destination: Destination, - val icon: ImageVector, val selectedIcon: ImageVector, val listStateResetCallback: () -> Unit, -) +) { + constructor( + destination: AppDestinations, + listStateResetCallback: () -> Unit, + ) : this( + destination.icon, + destination.label, + destination.destination, + destination.selectedIcon, + listStateResetCallback, + ) {} +} diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/navigation/Destination.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/navigation/Destination.kt index 8396578a..e0d99086 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/navigation/Destination.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/navigation/Destination.kt @@ -7,6 +7,14 @@ package dev.msfjarvis.claw.android.ui.navigation import android.os.Parcelable +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Favorite +import androidx.compose.material.icons.filled.NewReleases +import androidx.compose.material.icons.filled.Whatshot +import androidx.compose.material.icons.outlined.FavoriteBorder +import androidx.compose.material.icons.outlined.NewReleases +import androidx.compose.material.icons.outlined.Whatshot +import androidx.compose.ui.graphics.vector.ImageVector import kotlinx.parcelize.Parcelize import kotlinx.serialization.Serializable @@ -27,3 +35,29 @@ sealed interface Destination : Parcelable @Parcelize @Serializable data object Settings : Destination @Parcelize @Serializable data object AboutLibraries : Destination + +enum class AppDestinations( + val icon: ImageVector, + val label: String, + val destination: Destination, + val selectedIcon: ImageVector, +) { + HOTTEST( + icon = Icons.Outlined.Whatshot, + label = "Hottest", + destination = Hottest, + selectedIcon = Icons.Filled.Whatshot, + ), + NEWEST( + icon = Icons.Outlined.NewReleases, + label = "Newest", + destination = Newest, + selectedIcon = Icons.Filled.NewReleases, + ), + SAVED( + icon = Icons.Outlined.FavoriteBorder, + label = "Saved", + destination = Saved, + selectedIcon = Icons.Filled.Favorite, + ), +} diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/screens/LobstersPostsScreen.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/screens/LobstersPostsScreen.kt index 87867ebe..45918394 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/screens/LobstersPostsScreen.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/screens/LobstersPostsScreen.kt @@ -18,14 +18,8 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack -import androidx.compose.material.icons.filled.Favorite -import androidx.compose.material.icons.filled.NewReleases import androidx.compose.material.icons.filled.Search import androidx.compose.material.icons.filled.Tune -import androidx.compose.material.icons.filled.Whatshot -import androidx.compose.material.icons.outlined.FavoriteBorder -import androidx.compose.material.icons.outlined.NewReleases -import androidx.compose.material.icons.outlined.Whatshot import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -70,6 +64,7 @@ import dev.msfjarvis.claw.android.ui.decorations.NavigationItem import dev.msfjarvis.claw.android.ui.lists.DatabasePosts import dev.msfjarvis.claw.android.ui.lists.NetworkPosts import dev.msfjarvis.claw.android.ui.navigation.AboutLibraries +import dev.msfjarvis.claw.android.ui.navigation.AppDestinations import dev.msfjarvis.claw.android.ui.navigation.ClawNavigationType import dev.msfjarvis.claw.android.ui.navigation.Comments import dev.msfjarvis.claw.android.ui.navigation.Hottest @@ -129,32 +124,17 @@ fun LobstersPostsScreen( val navItems = persistentListOf( - NavigationItem( - label = "Hottest", - destination = Hottest, - icon = Icons.Outlined.Whatshot, - selectedIcon = Icons.Filled.Whatshot, - ) { + NavigationItem(AppDestinations.HOTTEST) { coroutineScope.launch { if (hottestPosts.itemCount > 0) hottestListState.animateScrollToItem(index = 0) } }, - NavigationItem( - label = "Newest", - destination = Newest, - icon = Icons.Outlined.NewReleases, - selectedIcon = Icons.Filled.NewReleases, - ) { + NavigationItem(AppDestinations.NEWEST) { coroutineScope.launch { if (newestPosts.itemCount > 0) newestListState.animateScrollToItem(index = 0) } }, - NavigationItem( - label = "Saved", - destination = Saved, - icon = Icons.Outlined.FavoriteBorder, - selectedIcon = Icons.Filled.Favorite, - ) { + NavigationItem(AppDestinations.SAVED) { coroutineScope.launch { if (savedPosts.isNotEmpty()) savedListState.scrollToItem(0) } }, ) diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/screens/TabletScreen.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/screens/TabletScreen.kt index 1b2e6bbf..b9a1f2ef 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/screens/TabletScreen.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/screens/TabletScreen.kt @@ -21,12 +21,6 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack -import androidx.compose.material.icons.filled.Favorite -import androidx.compose.material.icons.filled.NewReleases -import androidx.compose.material.icons.filled.Whatshot -import androidx.compose.material.icons.outlined.FavoriteBorder -import androidx.compose.material.icons.outlined.NewReleases -import androidx.compose.material.icons.outlined.Whatshot import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -64,6 +58,7 @@ import dev.msfjarvis.claw.android.ui.decorations.ClawNavigationRail import dev.msfjarvis.claw.android.ui.decorations.NavigationItem import dev.msfjarvis.claw.android.ui.lists.DatabasePosts import dev.msfjarvis.claw.android.ui.lists.NetworkPosts +import dev.msfjarvis.claw.android.ui.navigation.AppDestinations import dev.msfjarvis.claw.android.ui.navigation.Comments import dev.msfjarvis.claw.android.ui.navigation.Hottest import dev.msfjarvis.claw.android.ui.navigation.Newest @@ -118,28 +113,21 @@ fun TabletScreen( val navItems = persistentListOf( - NavigationItem( - label = "Hottest", - destination = Hottest, - icon = Icons.Outlined.Whatshot, - selectedIcon = Icons.Filled.Whatshot, - ) { + NavigationItem(AppDestinations.HOTTEST) { coroutineScope.launch { if (hottestPosts.itemCount > 0) hottestListState.animateScrollToItem(index = 0) } }, - NavigationItem( - label = "Newest", - destination = Newest, - icon = Icons.Outlined.NewReleases, - selectedIcon = Icons.Filled.NewReleases, - ) {}, - NavigationItem( - label = "Saved", - destination = Saved, - icon = Icons.Outlined.FavoriteBorder, - selectedIcon = Icons.Filled.Favorite, - ) {}, + NavigationItem(AppDestinations.NEWEST) { + coroutineScope.launch { + if (newestPosts.itemCount > 0) newestListState.animateScrollToItem(index = 0) + } + }, + NavigationItem(AppDestinations.SAVED) { + coroutineScope.launch { + if (savedPosts.isNotEmpty()) savedListState.animateScrollToItem(index = 0) + } + }, ) BackHandler(navigator.canNavigateBack(backBehavior)) {