mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-18 03:17:03 +05:30
src: add isSaved parameter to LobstersItem
Signed-off-by: Aditya Wasan <adityawasan55@gmail.com>
This commit is contained in:
parent
af72415952
commit
092599d167
6 changed files with 22 additions and 17 deletions
|
@ -1,24 +1,18 @@
|
||||||
package dev.msfjarvis.lobsters.data.remote
|
package dev.msfjarvis.lobsters.data.remote
|
||||||
|
|
||||||
import android.util.Log
|
|
||||||
import androidx.paging.PagingSource
|
import androidx.paging.PagingSource
|
||||||
import dev.msfjarvis.lobsters.data.api.LobstersApi
|
import dev.msfjarvis.lobsters.data.api.LobstersApi
|
||||||
import dev.msfjarvis.lobsters.data.local.LobstersPost
|
import dev.msfjarvis.lobsters.data.local.LobstersPost
|
||||||
import dev.msfjarvis.lobsters.data.repo.LobstersRepository
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class LobstersPagingSource @Inject constructor(
|
class LobstersPagingSource @Inject constructor(
|
||||||
private val lobstersApi: LobstersApi,
|
private val lobstersApi: LobstersApi,
|
||||||
private val lobstersRepository: LobstersRepository,
|
|
||||||
) : PagingSource<Int, LobstersPost>() {
|
) : PagingSource<Int, LobstersPost>() {
|
||||||
|
|
||||||
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, LobstersPost> {
|
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, LobstersPost> {
|
||||||
return try {
|
return try {
|
||||||
val page = params.key ?: 1
|
val page = params.key ?: 1
|
||||||
val posts = lobstersApi.getHottestPosts(page).map { post ->
|
val posts = lobstersApi.getHottestPosts(page)
|
||||||
val isSaved = lobstersRepository.isPostSaved(post.short_id)
|
|
||||||
post.copy(is_saved = isSaved)
|
|
||||||
}
|
|
||||||
|
|
||||||
LoadResult.Page(
|
LoadResult.Page(
|
||||||
data = posts,
|
data = posts,
|
||||||
|
|
|
@ -78,6 +78,7 @@ fun LobstersApp() {
|
||||||
HottestPosts(
|
HottestPosts(
|
||||||
posts = hottestPosts,
|
posts = hottestPosts,
|
||||||
listState = hottestPostsListState,
|
listState = hottestPostsListState,
|
||||||
|
isPostSaved = viewModel::isPostSaved,
|
||||||
saveAction = viewModel::toggleSave,
|
saveAction = viewModel::toggleSave,
|
||||||
modifier = Modifier.padding(bottom = innerPadding.bottom),
|
modifier = Modifier.padding(bottom = innerPadding.bottom),
|
||||||
)
|
)
|
||||||
|
|
|
@ -3,6 +3,10 @@ package dev.msfjarvis.lobsters.ui.posts
|
||||||
import androidx.compose.foundation.lazy.LazyColumn
|
import androidx.compose.foundation.lazy.LazyColumn
|
||||||
import androidx.compose.foundation.lazy.LazyListState
|
import androidx.compose.foundation.lazy.LazyListState
|
||||||
import androidx.compose.runtime.Composable
|
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.Modifier
|
||||||
import androidx.paging.LoadState
|
import androidx.paging.LoadState
|
||||||
import androidx.paging.compose.LazyPagingItems
|
import androidx.paging.compose.LazyPagingItems
|
||||||
|
@ -14,6 +18,7 @@ import dev.msfjarvis.lobsters.ui.urllauncher.AmbientUrlLauncher
|
||||||
fun HottestPosts(
|
fun HottestPosts(
|
||||||
posts: LazyPagingItems<LobstersPost>,
|
posts: LazyPagingItems<LobstersPost>,
|
||||||
listState: LazyListState,
|
listState: LazyListState,
|
||||||
|
isPostSaved: (String) -> Boolean,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
saveAction: (LobstersPost) -> Unit,
|
saveAction: (LobstersPost) -> Unit,
|
||||||
) {
|
) {
|
||||||
|
@ -28,11 +33,17 @@ fun HottestPosts(
|
||||||
) {
|
) {
|
||||||
items(posts) { item ->
|
items(posts) { item ->
|
||||||
if (item != null) {
|
if (item != null) {
|
||||||
|
var isSaved by remember(item.short_id) { mutableStateOf(isPostSaved(item.short_id)) }
|
||||||
|
|
||||||
LobstersItem(
|
LobstersItem(
|
||||||
post = item,
|
post = item,
|
||||||
|
isSaved = isSaved,
|
||||||
onClick = { urlLauncher.launch(item.url.ifEmpty { item.comments_url }) },
|
onClick = { urlLauncher.launch(item.url.ifEmpty { item.comments_url }) },
|
||||||
onLongClick = { urlLauncher.launch(item.comments_url) },
|
onLongClick = { urlLauncher.launch(item.comments_url) },
|
||||||
onSaveButtonClick = { saveAction.invoke(item) },
|
onSaveButtonClick = {
|
||||||
|
isSaved = isSaved.not()
|
||||||
|
saveAction.invoke(item)
|
||||||
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,6 +61,7 @@ val TEST_POST = LobstersPost(
|
||||||
@Composable
|
@Composable
|
||||||
fun LobstersItem(
|
fun LobstersItem(
|
||||||
post: LobstersPost,
|
post: LobstersPost,
|
||||||
|
isSaved: Boolean,
|
||||||
onClick: () -> Unit,
|
onClick: () -> Unit,
|
||||||
onLongClick: () -> Unit,
|
onLongClick: () -> Unit,
|
||||||
onSaveButtonClick: () -> Unit,
|
onSaveButtonClick: () -> Unit,
|
||||||
|
@ -121,7 +122,7 @@ fun LobstersItem(
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
IconResource(
|
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
|
modifier = Modifier
|
||||||
.padding(8.dp)
|
.padding(8.dp)
|
||||||
.clickable(
|
.clickable(
|
||||||
|
@ -167,6 +168,7 @@ fun Preview() {
|
||||||
items(listOf(TEST_POST, TEST_POST, TEST_POST, TEST_POST, TEST_POST)) { item ->
|
items(listOf(TEST_POST, TEST_POST, TEST_POST, TEST_POST, TEST_POST)) { item ->
|
||||||
LobstersItem(
|
LobstersItem(
|
||||||
post = item,
|
post = item,
|
||||||
|
isSaved = false,
|
||||||
onClick = {},
|
onClick = {},
|
||||||
onLongClick = {},
|
onLongClick = {},
|
||||||
onSaveButtonClick = {},
|
onSaveButtonClick = {},
|
||||||
|
|
|
@ -26,6 +26,7 @@ fun SavedPosts(
|
||||||
items(posts) { item ->
|
items(posts) { item ->
|
||||||
LobstersItem(
|
LobstersItem(
|
||||||
post = item,
|
post = item,
|
||||||
|
isSaved = true,
|
||||||
onClick = { urlLauncher.launch(item.url.ifEmpty { item.comments_url }) },
|
onClick = { urlLauncher.launch(item.url.ifEmpty { item.comments_url }) },
|
||||||
onLongClick = { urlLauncher.launch(item.comments_url) },
|
onLongClick = { urlLauncher.launch(item.comments_url) },
|
||||||
onSaveButtonClick = { saveAction.invoke(item) },
|
onSaveButtonClick = { saveAction.invoke(item) },
|
||||||
|
|
|
@ -6,7 +6,6 @@ import androidx.paging.Pager
|
||||||
import androidx.paging.PagingConfig
|
import androidx.paging.PagingConfig
|
||||||
import androidx.paging.cachedIn
|
import androidx.paging.cachedIn
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
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.local.LobstersPost
|
||||||
import dev.msfjarvis.lobsters.data.remote.LobstersPagingSource
|
import dev.msfjarvis.lobsters.data.remote.LobstersPagingSource
|
||||||
import dev.msfjarvis.lobsters.data.repo.LobstersRepository
|
import dev.msfjarvis.lobsters.data.repo.LobstersRepository
|
||||||
|
@ -18,26 +17,23 @@ import javax.inject.Inject
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
class LobstersViewModel @Inject constructor(
|
class LobstersViewModel @Inject constructor(
|
||||||
private val lobstersRepository: LobstersRepository,
|
private val lobstersRepository: LobstersRepository,
|
||||||
private val lobstersApi: LobstersApi,
|
private val pagingSource: LobstersPagingSource,
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
private lateinit var source: LobstersPagingSource
|
|
||||||
private val _savedPosts = MutableStateFlow(lobstersRepository.getAllPostsFromCache())
|
private val _savedPosts = MutableStateFlow(lobstersRepository.getAllPostsFromCache())
|
||||||
val savedPosts = _savedPosts.asStateFlow()
|
val savedPosts = _savedPosts.asStateFlow()
|
||||||
val posts = Pager(PagingConfig(25)) {
|
val posts = Pager(PagingConfig(25)) {
|
||||||
source = LobstersPagingSource(lobstersApi, lobstersRepository)
|
pagingSource
|
||||||
source
|
|
||||||
}.flow.cachedIn(viewModelScope)
|
}.flow.cachedIn(viewModelScope)
|
||||||
|
|
||||||
fun toggleSave(post: LobstersPost) {
|
fun toggleSave(post: LobstersPost) {
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
val isSaved = lobstersRepository.isPostSaved(post.short_id)
|
val isSaved = lobstersRepository.isPostSaved(post.short_id)
|
||||||
if (isSaved) removeSavedPost(post) else savePost(post)
|
if (isSaved) removeSavedPost(post) else savePost(post)
|
||||||
invalidateSource()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun invalidateSource() {
|
fun isPostSaved(postId: String): Boolean {
|
||||||
source.invalidate()
|
return lobstersRepository.isPostSaved(postId)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun savePost(post: LobstersPost) {
|
private fun savePost(post: LobstersPost) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue