mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-18 07:57:03 +05:30
app: switch to Paging
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
This commit is contained in:
parent
d0d08f8a3c
commit
343f7e7f56
3 changed files with 28 additions and 15 deletions
|
@ -23,8 +23,8 @@ import androidx.navigation.compose.composable
|
|||
import androidx.navigation.compose.currentBackStackEntryAsState
|
||||
import androidx.navigation.compose.navigate
|
||||
import androidx.navigation.compose.rememberNavController
|
||||
import androidx.paging.compose.collectAsLazyPagingItems
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import dev.msfjarvis.lobsters.model.LobstersPost
|
||||
import dev.msfjarvis.lobsters.util.IconResource
|
||||
import dev.msfjarvis.lobsters.ui.viewmodel.LobstersViewModel
|
||||
import dev.msfjarvis.lobsters.ui.navigation.Destination
|
||||
|
@ -55,7 +55,7 @@ class MainActivity : AppCompatActivity() {
|
|||
fun LobstersApp() {
|
||||
val viewModel: LobstersViewModel = viewModel()
|
||||
val navController = rememberNavController()
|
||||
val hottestPosts = emptyList<LobstersPost>()
|
||||
val hottestPosts = viewModel.posts.collectAsLazyPagingItems()
|
||||
val savedPosts by viewModel.savedPosts.collectAsState()
|
||||
|
||||
Scaffold(
|
||||
|
|
|
@ -1,37 +1,43 @@
|
|||
package dev.msfjarvis.lobsters.ui.posts
|
||||
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.lazy.LazyColumnFor
|
||||
import androidx.compose.foundation.lazy.LazyColumn
|
||||
import androidx.compose.foundation.lazy.LazyListState
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.paging.LoadState
|
||||
import androidx.paging.compose.LazyPagingItems
|
||||
import androidx.paging.compose.items
|
||||
import dev.msfjarvis.lobsters.model.LobstersPost
|
||||
import dev.msfjarvis.lobsters.ui.urllauncher.UrlLauncherAmbient
|
||||
|
||||
@Composable
|
||||
fun HottestPosts(
|
||||
posts: List<LobstersPost>,
|
||||
posts: LazyPagingItems<LobstersPost>,
|
||||
listState: LazyListState,
|
||||
modifier: Modifier = Modifier,
|
||||
saveAction: (LobstersPost) -> Unit,
|
||||
) {
|
||||
val urlLauncher = UrlLauncherAmbient.current
|
||||
|
||||
if (posts.isEmpty()) {
|
||||
if (posts.loadState.refresh == LoadState.Loading) {
|
||||
EmptyList(saved = false)
|
||||
} else {
|
||||
LazyColumnFor(
|
||||
items = posts,
|
||||
LazyColumn(
|
||||
state = listState,
|
||||
modifier = Modifier.padding(horizontal = 8.dp).then(modifier)
|
||||
) { item ->
|
||||
LobstersItem(
|
||||
post = item,
|
||||
onClick = { urlLauncher.launch(item.url.ifEmpty { item.commentsUrl }) },
|
||||
onLongClick = { urlLauncher.launch(item.commentsUrl) },
|
||||
onSaveButtonClick = { saveAction.invoke(item) },
|
||||
)
|
||||
modifier = Modifier.padding(horizontal = 8.dp).then(modifier),
|
||||
) {
|
||||
items(posts) { item ->
|
||||
if (item != null) {
|
||||
LobstersItem(
|
||||
post = item,
|
||||
onClick = { urlLauncher.launch(item.url.ifEmpty { item.commentsUrl }) },
|
||||
onLongClick = { urlLauncher.launch(item.commentsUrl) },
|
||||
onSaveButtonClick = { saveAction.invoke(item) },
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,6 +3,9 @@ package dev.msfjarvis.lobsters.ui.viewmodel
|
|||
import androidx.hilt.lifecycle.ViewModelInject
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import androidx.paging.Pager
|
||||
import androidx.paging.PagingConfig
|
||||
import dev.msfjarvis.lobsters.data.remote.LobstersPagingSource
|
||||
import dev.msfjarvis.lobsters.data.source.PostsDatabase
|
||||
import dev.msfjarvis.lobsters.model.LobstersPost
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
|
@ -11,11 +14,15 @@ import kotlinx.coroutines.flow.collectLatest
|
|||
import kotlinx.coroutines.launch
|
||||
|
||||
class LobstersViewModel @ViewModelInject constructor(
|
||||
private val pagingSource: LobstersPagingSource,
|
||||
database: PostsDatabase,
|
||||
) : ViewModel() {
|
||||
private val _savedPosts = MutableStateFlow<List<LobstersPost>>(emptyList())
|
||||
private val savedPostsDao = database.savedPostsDao()
|
||||
val savedPosts: StateFlow<List<LobstersPost>> get() = _savedPosts
|
||||
val posts = Pager(PagingConfig(25)) {
|
||||
pagingSource
|
||||
}.flow
|
||||
|
||||
init {
|
||||
getSavedPosts()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue