diff --git a/app/src/main/java/dev/msfjarvis/lobsters/MainActivity.kt b/app/src/main/java/dev/msfjarvis/lobsters/MainActivity.kt index 10d9a611..a2dee873 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/MainActivity.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/MainActivity.kt @@ -1,17 +1,19 @@ package dev.msfjarvis.lobsters import android.os.Bundle -import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.compose.foundation.Text +import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.BottomNavigation import androidx.compose.material.BottomNavigationItem import androidx.compose.material.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.Providers +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.setContent import androidx.compose.ui.res.stringResource +import androidx.compose.ui.viewinterop.viewModel import androidx.navigation.compose.KEY_ROUTE import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable @@ -32,14 +34,13 @@ import javax.inject.Inject @AndroidEntryPoint class MainActivity : AppCompatActivity() { @Inject lateinit var urlLauncher: UrlLauncher - private val viewModel: LobstersViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { Providers(UrlLauncherAmbient provides urlLauncher) { LobstersTheme { - LobstersApp(viewModel) + LobstersApp() } } } @@ -47,11 +48,12 @@ class MainActivity : AppCompatActivity() { } @Composable -fun LobstersApp( - viewModel: LobstersViewModel, -) { +fun LobstersApp() { + val viewModel: LobstersViewModel = viewModel() val navController = rememberNavController() val destinations = arrayOf(Destination.Hottest, Destination.Saved) + val hottestPosts by viewModel.posts.collectAsState() + val savedPosts by viewModel.savedPosts.collectAsState() Scaffold( bottomBar = { @@ -60,14 +62,7 @@ fun LobstersApp( val currentRoute = navBackStackEntry?.arguments?.getString(KEY_ROUTE) destinations.forEach { screen -> BottomNavigationItem( - icon = { - IconResource( - resourceId = when (screen) { - Destination.Hottest -> R.drawable.ic_whatshot_24px - Destination.Saved -> R.drawable.ic_favorite_24px - } - ) - }, + icon = { IconResource(resourceId = screen.badgeRes) }, label = { Text(stringResource(id = screen.labelRes)) }, selected = currentRoute == screen.route, onClick = { @@ -84,12 +79,21 @@ fun LobstersApp( } }, ) { + val hottestPostsListState = rememberLazyListState() NavHost(navController, startDestination = Destination.Hottest.route) { composable(Destination.Hottest.route) { - HottestPosts(viewModel = viewModel) + HottestPosts( + posts = hottestPosts, + listState = hottestPostsListState, + saveAction = viewModel::savePost, + overscrollAction = viewModel::getMorePosts, + ) } composable(Destination.Saved.route) { - SavedPosts(viewModel = viewModel) + SavedPosts( + posts = savedPosts, + saveAction = viewModel::removeSavedPost, + ) } } } diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/Destination.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/Destination.kt index 0c6ebc45..6f55ef51 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/Destination.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/Destination.kt @@ -1,5 +1,6 @@ package dev.msfjarvis.lobsters.ui +import androidx.annotation.DrawableRes import androidx.annotation.StringRes import dev.msfjarvis.lobsters.R @@ -9,7 +10,8 @@ import dev.msfjarvis.lobsters.R sealed class Destination( val route: String, @StringRes val labelRes: Int, + @DrawableRes val badgeRes: Int, ) { - object Hottest : Destination("hottest", R.string.hottest_posts) - object Saved : Destination("saved", R.string.saved_posts) + object Hottest : Destination("hottest", R.string.hottest_posts, R.drawable.ic_whatshot_24px) + object Saved : Destination("saved", R.string.saved_posts, R.drawable.ic_favorite_24px) } diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/HottestPosts.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/HottestPosts.kt index 09f003c6..e5e4fc27 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/HottestPosts.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/HottestPosts.kt @@ -2,22 +2,21 @@ package dev.msfjarvis.lobsters.ui import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumnForIndexed -import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.foundation.lazy.LazyListState import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import dev.msfjarvis.lobsters.data.LobstersViewModel +import dev.msfjarvis.lobsters.model.LobstersPost import dev.msfjarvis.lobsters.urllauncher.UrlLauncherAmbient @Composable fun HottestPosts( - viewModel: LobstersViewModel, + posts: List, + listState: LazyListState, modifier: Modifier = Modifier, + saveAction: (LobstersPost) -> Unit, + overscrollAction: () -> Unit, ) { - val posts by viewModel.posts.collectAsState() - val listState = rememberLazyListState() val urlLauncher = UrlLauncherAmbient.current if (posts.isEmpty()) { @@ -29,13 +28,13 @@ fun HottestPosts( modifier = Modifier.padding(horizontal = 8.dp).then(modifier) ) { index, item -> if (posts.lastIndex == index) { - viewModel.getMorePosts() + overscrollAction.invoke() } LobstersItem( post = item, linkOpenAction = { post -> urlLauncher.launch(post.url.ifEmpty { post.commentsUrl }) }, commentOpenAction = { post -> urlLauncher.launch(post.commentsUrl) }, - saveAction = viewModel::savePost + saveAction = saveAction, ) } } diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/SavedPosts.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/SavedPosts.kt index 06a4fb9d..cceef9d8 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/SavedPosts.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/SavedPosts.kt @@ -4,19 +4,17 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumnFor import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import dev.msfjarvis.lobsters.data.LobstersViewModel +import dev.msfjarvis.lobsters.model.LobstersPost import dev.msfjarvis.lobsters.urllauncher.UrlLauncherAmbient @Composable fun SavedPosts( - viewModel: LobstersViewModel, + posts: List, modifier: Modifier = Modifier, + saveAction: (LobstersPost) -> Unit ) { - val posts by viewModel.savedPosts.collectAsState() val listState = rememberLazyListState() val urlLauncher = UrlLauncherAmbient.current @@ -32,7 +30,7 @@ fun SavedPosts( post = item, linkOpenAction = { post -> urlLauncher.launch(post.url.ifEmpty { post.commentsUrl }) }, commentOpenAction = { post -> urlLauncher.launch(post.commentsUrl) }, - saveAction = viewModel::removeSavedPost + saveAction = saveAction, ) } } diff --git a/app/src/main/java/dev/msfjarvis/lobsters/urllauncher/UrlLauncher.kt b/app/src/main/java/dev/msfjarvis/lobsters/urllauncher/UrlLauncher.kt index 5fc0c4e8..474f0d08 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/urllauncher/UrlLauncher.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/urllauncher/UrlLauncher.kt @@ -1,5 +1,5 @@ package dev.msfjarvis.lobsters.urllauncher -interface UrlLauncher { +fun interface UrlLauncher { fun launch(url: String) }