53: Fix pagination and extract UrlLauncherAmbient r=msfjarvis a=msfjarvis

Our pagination hack currently does not update the last index field which has now been fixed. While here we also take the time to extract UrlLauncherAmbient and prepare the post list composables for tweaking from the root UI

bors r+

Co-authored-by: Harsh Shandilya <me@msfjarvis.dev>
This commit is contained in:
bors[bot] 2020-10-29 11:01:46 +00:00 committed by GitHub
commit 60f6108d35
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 17 additions and 16 deletions

View file

@ -9,8 +9,6 @@ import androidx.compose.material.BottomNavigationItem
import androidx.compose.material.Scaffold
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Providers
import androidx.compose.runtime.ambientOf
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.platform.setContent
import androidx.navigation.compose.KEY_ROUTE
@ -27,10 +25,9 @@ import dev.msfjarvis.lobsters.ui.HottestPosts
import dev.msfjarvis.lobsters.ui.LobstersTheme
import dev.msfjarvis.lobsters.ui.SavedPosts
import dev.msfjarvis.lobsters.urllauncher.UrlLauncher
import dev.msfjarvis.lobsters.urllauncher.UrlLauncherAmbient
import javax.inject.Inject
val UrlLauncherAmbient = ambientOf<UrlLauncher> { error("Needs to be provided") }
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject lateinit var urlLauncher: UrlLauncher
@ -53,8 +50,6 @@ fun LobstersApp(
viewModel: LobstersViewModel
) {
val urlLauncher = UrlLauncherAmbient.current
val posts = viewModel.posts.collectAsState()
val lastIndex = posts.value.lastIndex
val navController = rememberNavController()
val destinations = arrayOf(Destination.Hottest, Destination.Saved)
@ -92,10 +87,10 @@ fun LobstersApp(
) {
NavHost(navController, startDestination = Destination.Hottest.route) {
composable(Destination.Hottest.route) {
HottestPosts(lastIndex = lastIndex, urlLauncher = urlLauncher , viewModel = viewModel)
HottestPosts(viewModel = viewModel)
}
composable(Destination.Saved.route) {
SavedPosts(urlLauncher = urlLauncher, viewModel = viewModel)
SavedPosts(viewModel = viewModel)
}
}
}

View file

@ -9,16 +9,16 @@ 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.urllauncher.UrlLauncher
import dev.msfjarvis.lobsters.urllauncher.UrlLauncherAmbient
@Composable
fun HottestPosts(
lastIndex: Int,
urlLauncher: UrlLauncher,
viewModel: LobstersViewModel,
modifier: Modifier = Modifier,
) {
val posts by viewModel.posts.collectAsState()
val listState = rememberLazyListState()
val urlLauncher = UrlLauncherAmbient.current
if (posts.isEmpty()) {
EmptyList(saved = false)
@ -26,9 +26,9 @@ fun HottestPosts(
LazyColumnForIndexed(
items = posts,
state = listState,
modifier = Modifier.padding(horizontal = 8.dp)
modifier = Modifier.padding(horizontal = 8.dp).then(modifier)
) { index, item ->
if (lastIndex == index) {
if (posts.lastIndex == index) {
viewModel.getMorePosts()
}
LobstersItem(

View file

@ -9,15 +9,16 @@ 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.urllauncher.UrlLauncher
import dev.msfjarvis.lobsters.urllauncher.UrlLauncherAmbient
@Composable
fun SavedPosts(
urlLauncher: UrlLauncher,
viewModel: LobstersViewModel,
modifier: Modifier = Modifier,
) {
val posts by viewModel.savedPosts.collectAsState()
val listState = rememberLazyListState()
val urlLauncher = UrlLauncherAmbient.current
if (posts.isEmpty()) {
EmptyList(saved = true)
@ -25,7 +26,7 @@ fun SavedPosts(
LazyColumnFor(
items = posts,
state = listState,
modifier = Modifier.padding(horizontal = 8.dp)
modifier = Modifier.padding(horizontal = 8.dp).then(modifier)
) { item ->
LobstersItem(
post = item,

View file

@ -0,0 +1,5 @@
package dev.msfjarvis.lobsters.urllauncher
import androidx.compose.runtime.ambientOf
val UrlLauncherAmbient = ambientOf<UrlLauncher> { error("Needs to be provided") }