mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-18 09:07:01 +05:30
src: fix is_saved logic
Signed-off-by: Aditya Wasan <adityawasan55@gmail.com>
This commit is contained in:
parent
6fdf1d0ca0
commit
ff4a2a751f
4 changed files with 20 additions and 29 deletions
|
@ -1,5 +1,6 @@
|
|||
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
|
||||
|
@ -14,17 +15,9 @@ class LobstersPagingSource @Inject constructor(
|
|||
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, LobstersPost> {
|
||||
return try {
|
||||
val page = params.key ?: 1
|
||||
val posts = lobstersApi.getHottestPosts(page).map { post ->
|
||||
// We can replace these two lines below with a getOrInsertPost repository method.
|
||||
val dbPost = lobstersRepository.getPost(post.short_id)
|
||||
return@map if (dbPost == null) {
|
||||
// If db does not contain the post, add it and return the original post
|
||||
lobstersRepository.addPostToDB(post)
|
||||
post
|
||||
} else {
|
||||
// Otherwise return the db post
|
||||
dbPost
|
||||
}
|
||||
val posts = lobstersApi.getHottestPosts(page).mapIndexed { index, post ->
|
||||
val isSaved = lobstersRepository.isPostSaved(post.short_id)
|
||||
return@mapIndexed post.copy(is_saved = isSaved)
|
||||
}
|
||||
|
||||
LoadResult.Page(
|
||||
|
|
|
@ -9,7 +9,6 @@ import javax.inject.Inject
|
|||
class LobstersRepository @Inject constructor(private val lobstersDatabase: LobstersDatabase) {
|
||||
|
||||
fun isPostSaved(postId: String): Boolean {
|
||||
// returns the post if it exists and its is_saved property is true
|
||||
val post = lobstersDatabase.postQueries.isPostSaved(postId).executeAsOneOrNull()
|
||||
return post != null
|
||||
}
|
||||
|
@ -27,9 +26,7 @@ class LobstersRepository @Inject constructor(private val lobstersDatabase: Lobst
|
|||
}
|
||||
|
||||
suspend fun savePost(post: LobstersPost) = withContext(Dispatchers.IO) {
|
||||
if (!isPostSaved(post.short_id)) {
|
||||
lobstersDatabase.postQueries.savePost(post.short_id)
|
||||
}
|
||||
lobstersDatabase.postQueries.insertOrReplacePost(post.copy(is_saved = true))
|
||||
}
|
||||
|
||||
suspend fun removeSavedPost(post: LobstersPost) = withContext(Dispatchers.IO) {
|
||||
|
|
|
@ -14,10 +14,6 @@ import androidx.compose.material.Surface
|
|||
import androidx.compose.material.Text
|
||||
import androidx.compose.material.ripple.rememberRipple
|
||||
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.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.res.stringResource
|
||||
|
@ -69,8 +65,6 @@ fun LobstersItem(
|
|||
onLongClick: () -> Unit,
|
||||
onSaveButtonClick: () -> Unit,
|
||||
) {
|
||||
var isSaved by remember { mutableStateOf(post.is_saved ?: false) }
|
||||
|
||||
Surface(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
|
@ -127,14 +121,11 @@ fun LobstersItem(
|
|||
},
|
||||
)
|
||||
IconResource(
|
||||
resourceId = if (isSaved) R.drawable.ic_favorite_24px else R.drawable.ic_favorite_border_24px,
|
||||
resourceId = if (post.is_saved == true) R.drawable.ic_favorite_24px else R.drawable.ic_favorite_border_24px,
|
||||
modifier = Modifier
|
||||
.padding(8.dp)
|
||||
.clickable(
|
||||
onClick = {
|
||||
onSaveButtonClick()
|
||||
isSaved = isSaved.not()
|
||||
},
|
||||
onClick = onSaveButtonClick,
|
||||
indication = rememberRipple(),
|
||||
)
|
||||
.constrainAs(saveButton) {
|
||||
|
|
|
@ -4,7 +4,9 @@ import androidx.lifecycle.ViewModel
|
|||
import androidx.lifecycle.viewModelScope
|
||||
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
|
||||
|
@ -17,17 +19,21 @@ import javax.inject.Inject
|
|||
class LobstersViewModel @Inject constructor(
|
||||
private val pagingSource: LobstersPagingSource,
|
||||
private val lobstersRepository: LobstersRepository,
|
||||
private val lobstersApi: LobstersApi,
|
||||
) : ViewModel() {
|
||||
private val _savedPosts = MutableStateFlow<List<LobstersPost>>(emptyList())
|
||||
private var source: LobstersPagingSource? = null
|
||||
val savedPosts = _savedPosts.asStateFlow()
|
||||
val posts = Pager(PagingConfig(5)) {
|
||||
pagingSource
|
||||
}.flow
|
||||
val posts = Pager(PagingConfig(25)) {
|
||||
source = LobstersPagingSource(lobstersApi, lobstersRepository)
|
||||
source!!
|
||||
}.flow.cachedIn(viewModelScope)
|
||||
|
||||
fun toggleSave(post: LobstersPost) {
|
||||
viewModelScope.launch {
|
||||
val isSaved = lobstersRepository.isPostSaved(post.short_id)
|
||||
if (isSaved) removeSavedPost(post) else savePost(post)
|
||||
invalidateSource()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -39,6 +45,10 @@ class LobstersViewModel @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
fun invalidateSource() {
|
||||
source?.invalidate()
|
||||
}
|
||||
|
||||
private fun savePost(post: LobstersPost) {
|
||||
viewModelScope.launch {
|
||||
lobstersRepository.savePost(post)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue