Extract viewModel references out of post list composables

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
This commit is contained in:
Harsh Shandilya 2020-10-30 14:11:25 +05:30
parent b641cab624
commit 108a28384c
No known key found for this signature in database
GPG key ID: 366D7BBAD1031E80
3 changed files with 26 additions and 21 deletions

View file

@ -1,7 +1,6 @@
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.material.BottomNavigation
@ -9,9 +8,11 @@ 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 +33,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 +47,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 = {
@ -86,10 +87,17 @@ fun LobstersApp(
) {
NavHost(navController, startDestination = Destination.Hottest.route) {
composable(Destination.Hottest.route) {
HottestPosts(viewModel = viewModel)
HottestPosts(
posts = hottestPosts,
saveAction = viewModel::savePost,
overscrollAction = viewModel::getMorePosts,
)
}
composable(Destination.Saved.route) {
SavedPosts(viewModel = viewModel)
SavedPosts(
posts = savedPosts,
saveAction = viewModel::removeSavedPost,
)
}
}
}

View file

@ -4,19 +4,18 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumnForIndexed
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 HottestPosts(
viewModel: LobstersViewModel,
posts: List<LobstersPost>,
modifier: Modifier = Modifier,
saveAction: (LobstersPost) -> Unit,
overscrollAction: () -> Unit,
) {
val posts by viewModel.posts.collectAsState()
val listState = rememberLazyListState()
val urlLauncher = UrlLauncherAmbient.current
@ -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,
)
}
}

View file

@ -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<LobstersPost>,
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,
)
}
}