mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-14 23:27:04 +05:30
refactor: de-duplicate navigation destinations
This commit is contained in:
parent
def815cc10
commit
d4d11b9254
4 changed files with 66 additions and 51 deletions
|
@ -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,
|
||||
) {}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
),
|
||||
}
|
||||
|
|
|
@ -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) }
|
||||
},
|
||||
)
|
||||
|
|
|
@ -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)) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue