src: add isSaved parameter to LobstersItem

Signed-off-by: Aditya Wasan <adityawasan55@gmail.com>
This commit is contained in:
Aditya Wasan 2021-01-31 16:17:08 +05:30
parent af72415952
commit 092599d167
No known key found for this signature in database
GPG key ID: 6D6DF3BF15DE79B5
6 changed files with 22 additions and 17 deletions

View file

@ -1,24 +1,18 @@
package dev.msfjarvis.lobsters.data.remote
import android.util.Log
import androidx.paging.PagingSource
import dev.msfjarvis.lobsters.data.api.LobstersApi
import dev.msfjarvis.lobsters.data.local.LobstersPost
import dev.msfjarvis.lobsters.data.repo.LobstersRepository
import javax.inject.Inject
class LobstersPagingSource @Inject constructor(
private val lobstersApi: LobstersApi,
private val lobstersRepository: LobstersRepository,
) : PagingSource<Int, LobstersPost>() {
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, LobstersPost> {
return try {
val page = params.key ?: 1
val posts = lobstersApi.getHottestPosts(page).map { post ->
val isSaved = lobstersRepository.isPostSaved(post.short_id)
post.copy(is_saved = isSaved)
}
val posts = lobstersApi.getHottestPosts(page)
LoadResult.Page(
data = posts,

View file

@ -78,6 +78,7 @@ fun LobstersApp() {
HottestPosts(
posts = hottestPosts,
listState = hottestPostsListState,
isPostSaved = viewModel::isPostSaved,
saveAction = viewModel::toggleSave,
modifier = Modifier.padding(bottom = innerPadding.bottom),
)

View file

@ -3,6 +3,10 @@ package dev.msfjarvis.lobsters.ui.posts
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.paging.LoadState
import androidx.paging.compose.LazyPagingItems
@ -14,6 +18,7 @@ import dev.msfjarvis.lobsters.ui.urllauncher.AmbientUrlLauncher
fun HottestPosts(
posts: LazyPagingItems<LobstersPost>,
listState: LazyListState,
isPostSaved: (String) -> Boolean,
modifier: Modifier = Modifier,
saveAction: (LobstersPost) -> Unit,
) {
@ -28,11 +33,17 @@ fun HottestPosts(
) {
items(posts) { item ->
if (item != null) {
var isSaved by remember(item.short_id) { mutableStateOf(isPostSaved(item.short_id)) }
LobstersItem(
post = item,
isSaved = isSaved,
onClick = { urlLauncher.launch(item.url.ifEmpty { item.comments_url }) },
onLongClick = { urlLauncher.launch(item.comments_url) },
onSaveButtonClick = { saveAction.invoke(item) },
onSaveButtonClick = {
isSaved = isSaved.not()
saveAction.invoke(item)
},
)
}
}

View file

@ -61,6 +61,7 @@ val TEST_POST = LobstersPost(
@Composable
fun LobstersItem(
post: LobstersPost,
isSaved: Boolean,
onClick: () -> Unit,
onLongClick: () -> Unit,
onSaveButtonClick: () -> Unit,
@ -121,7 +122,7 @@ fun LobstersItem(
},
)
IconResource(
resourceId = if (post.is_saved == true) R.drawable.ic_favorite_24px else R.drawable.ic_favorite_border_24px,
resourceId = if (isSaved) R.drawable.ic_favorite_24px else R.drawable.ic_favorite_border_24px,
modifier = Modifier
.padding(8.dp)
.clickable(
@ -167,6 +168,7 @@ fun Preview() {
items(listOf(TEST_POST, TEST_POST, TEST_POST, TEST_POST, TEST_POST)) { item ->
LobstersItem(
post = item,
isSaved = false,
onClick = {},
onLongClick = {},
onSaveButtonClick = {},

View file

@ -26,6 +26,7 @@ fun SavedPosts(
items(posts) { item ->
LobstersItem(
post = item,
isSaved = true,
onClick = { urlLauncher.launch(item.url.ifEmpty { item.comments_url }) },
onLongClick = { urlLauncher.launch(item.comments_url) },
onSaveButtonClick = { saveAction.invoke(item) },

View file

@ -6,7 +6,6 @@ import androidx.paging.Pager
import androidx.paging.PagingConfig
import androidx.paging.cachedIn
import dagger.hilt.android.lifecycle.HiltViewModel
import dev.msfjarvis.lobsters.data.api.LobstersApi
import dev.msfjarvis.lobsters.data.local.LobstersPost
import dev.msfjarvis.lobsters.data.remote.LobstersPagingSource
import dev.msfjarvis.lobsters.data.repo.LobstersRepository
@ -18,26 +17,23 @@ import javax.inject.Inject
@HiltViewModel
class LobstersViewModel @Inject constructor(
private val lobstersRepository: LobstersRepository,
private val lobstersApi: LobstersApi,
private val pagingSource: LobstersPagingSource,
) : ViewModel() {
private lateinit var source: LobstersPagingSource
private val _savedPosts = MutableStateFlow(lobstersRepository.getAllPostsFromCache())
val savedPosts = _savedPosts.asStateFlow()
val posts = Pager(PagingConfig(25)) {
source = LobstersPagingSource(lobstersApi, lobstersRepository)
source
pagingSource
}.flow.cachedIn(viewModelScope)
fun toggleSave(post: LobstersPost) {
viewModelScope.launch {
val isSaved = lobstersRepository.isPostSaved(post.short_id)
if (isSaved) removeSavedPost(post) else savePost(post)
invalidateSource()
}
}
private fun invalidateSource() {
source.invalidate()
fun isPostSaved(postId: String): Boolean {
return lobstersRepository.isPostSaved(postId)
}
private fun savePost(post: LobstersPost) {