refactor: de-duplicate navigation destinations

This commit is contained in:
Harsh Shandilya 2024-12-02 15:32:35 +05:30
parent def815cc10
commit d4d11b9254
4 changed files with 66 additions and 51 deletions

View file

@ -32,6 +32,7 @@ import dev.chrisbanes.haze.HazeDefaults
import dev.chrisbanes.haze.HazeState import dev.chrisbanes.haze.HazeState
import dev.chrisbanes.haze.HazeStyle import dev.chrisbanes.haze.HazeStyle
import dev.chrisbanes.haze.hazeChild 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.Destination
import dev.msfjarvis.claw.android.ui.navigation.matches import dev.msfjarvis.claw.android.ui.navigation.matches
import dev.msfjarvis.claw.common.ui.FloatingNavigationBar 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 label: String,
val destination: Destination, val destination: Destination,
val icon: ImageVector,
val selectedIcon: ImageVector, val selectedIcon: ImageVector,
val listStateResetCallback: () -> Unit, val listStateResetCallback: () -> Unit,
) ) {
constructor(
destination: AppDestinations,
listStateResetCallback: () -> Unit,
) : this(
destination.icon,
destination.label,
destination.destination,
destination.selectedIcon,
listStateResetCallback,
) {}
}

View file

@ -7,6 +7,14 @@
package dev.msfjarvis.claw.android.ui.navigation package dev.msfjarvis.claw.android.ui.navigation
import android.os.Parcelable 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.parcelize.Parcelize
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@ -27,3 +35,29 @@ sealed interface Destination : Parcelable
@Parcelize @Serializable data object Settings : Destination @Parcelize @Serializable data object Settings : Destination
@Parcelize @Serializable data object AboutLibraries : 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,
),
}

View file

@ -18,14 +18,8 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack 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.Search
import androidx.compose.material.icons.filled.Tune 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.ExperimentalMaterial3Api
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton 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.DatabasePosts
import dev.msfjarvis.claw.android.ui.lists.NetworkPosts import dev.msfjarvis.claw.android.ui.lists.NetworkPosts
import dev.msfjarvis.claw.android.ui.navigation.AboutLibraries 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.ClawNavigationType
import dev.msfjarvis.claw.android.ui.navigation.Comments import dev.msfjarvis.claw.android.ui.navigation.Comments
import dev.msfjarvis.claw.android.ui.navigation.Hottest import dev.msfjarvis.claw.android.ui.navigation.Hottest
@ -129,32 +124,17 @@ fun LobstersPostsScreen(
val navItems = val navItems =
persistentListOf( persistentListOf(
NavigationItem( NavigationItem(AppDestinations.HOTTEST) {
label = "Hottest",
destination = Hottest,
icon = Icons.Outlined.Whatshot,
selectedIcon = Icons.Filled.Whatshot,
) {
coroutineScope.launch { coroutineScope.launch {
if (hottestPosts.itemCount > 0) hottestListState.animateScrollToItem(index = 0) if (hottestPosts.itemCount > 0) hottestListState.animateScrollToItem(index = 0)
} }
}, },
NavigationItem( NavigationItem(AppDestinations.NEWEST) {
label = "Newest",
destination = Newest,
icon = Icons.Outlined.NewReleases,
selectedIcon = Icons.Filled.NewReleases,
) {
coroutineScope.launch { coroutineScope.launch {
if (newestPosts.itemCount > 0) newestListState.animateScrollToItem(index = 0) if (newestPosts.itemCount > 0) newestListState.animateScrollToItem(index = 0)
} }
}, },
NavigationItem( NavigationItem(AppDestinations.SAVED) {
label = "Saved",
destination = Saved,
icon = Icons.Outlined.FavoriteBorder,
selectedIcon = Icons.Filled.Favorite,
) {
coroutineScope.launch { if (savedPosts.isNotEmpty()) savedListState.scrollToItem(0) } coroutineScope.launch { if (savedPosts.isNotEmpty()) savedListState.scrollToItem(0) }
}, },
) )

View file

@ -21,12 +21,6 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack 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.ExperimentalMaterial3Api
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton 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.decorations.NavigationItem
import dev.msfjarvis.claw.android.ui.lists.DatabasePosts import dev.msfjarvis.claw.android.ui.lists.DatabasePosts
import dev.msfjarvis.claw.android.ui.lists.NetworkPosts 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.Comments
import dev.msfjarvis.claw.android.ui.navigation.Hottest import dev.msfjarvis.claw.android.ui.navigation.Hottest
import dev.msfjarvis.claw.android.ui.navigation.Newest import dev.msfjarvis.claw.android.ui.navigation.Newest
@ -118,28 +113,21 @@ fun TabletScreen(
val navItems = val navItems =
persistentListOf( persistentListOf(
NavigationItem( NavigationItem(AppDestinations.HOTTEST) {
label = "Hottest",
destination = Hottest,
icon = Icons.Outlined.Whatshot,
selectedIcon = Icons.Filled.Whatshot,
) {
coroutineScope.launch { coroutineScope.launch {
if (hottestPosts.itemCount > 0) hottestListState.animateScrollToItem(index = 0) if (hottestPosts.itemCount > 0) hottestListState.animateScrollToItem(index = 0)
} }
}, },
NavigationItem( NavigationItem(AppDestinations.NEWEST) {
label = "Newest", coroutineScope.launch {
destination = Newest, if (newestPosts.itemCount > 0) newestListState.animateScrollToItem(index = 0)
icon = Icons.Outlined.NewReleases, }
selectedIcon = Icons.Filled.NewReleases, },
) {}, NavigationItem(AppDestinations.SAVED) {
NavigationItem( coroutineScope.launch {
label = "Saved", if (savedPosts.isNotEmpty()) savedListState.animateScrollToItem(index = 0)
destination = Saved, }
icon = Icons.Outlined.FavoriteBorder, },
selectedIcon = Icons.Filled.Favorite,
) {},
) )
BackHandler(navigator.canNavigateBack(backBehavior)) { BackHandler(navigator.canNavigateBack(backBehavior)) {