mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-15 06:27:02 +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.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,
|
||||||
|
) {}
|
||||||
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
|
@ -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) }
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue