diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/ListItem.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/ListItem.kt index a2eff4b2..111a3cc6 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/ListItem.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/ListItem.kt @@ -23,12 +23,11 @@ import me.saket.swipe.SwipeableActionsBox @Composable fun ListItem( item: SavedPost, - isSaved: suspend (SavedPost) -> Boolean, + isSaved: (SavedPost) -> Boolean, isRead: suspend (String) -> Boolean, postActions: PostActions, modifier: Modifier = Modifier, ) { - val saved by produceState(false, item) { value = isSaved(item) } val read by produceState(false, item.shortId) { value = isRead(item.shortId) } val commentsAction = SwipeAction( @@ -41,7 +40,7 @@ fun ListItem( ) { LobstersCard( post = item, - isSaved = saved, + isSaved = isSaved(item), isRead = read, postActions = postActions, modifier = modifier, diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/NetworkPosts.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/NetworkPosts.kt index 3c36034e..002c6b51 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/NetworkPosts.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/NetworkPosts.kt @@ -39,7 +39,7 @@ import eu.bambooapps.material3.pullrefresh.rememberPullRefreshState fun NetworkPosts( lazyPagingItems: LazyPagingItems, listState: LazyListState, - isPostSaved: suspend (SavedPost) -> Boolean, + isPostSaved: (SavedPost) -> Boolean, isPostRead: suspend (String) -> Boolean, postActions: PostActions, modifier: Modifier = Modifier, diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/SearchList.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/SearchList.kt index 41aed9b8..4374f507 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/SearchList.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/SearchList.kt @@ -43,7 +43,7 @@ import kotlinx.coroutines.flow.Flow fun SearchList( items: Flow>, listState: LazyListState, - isPostSaved: suspend (SavedPost) -> Boolean, + isPostSaved: (SavedPost) -> Boolean, postActions: PostActions, searchQuery: String, setSearchQuery: (String) -> Unit, diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt index f6d42648..6d9a57d4 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt @@ -44,9 +44,12 @@ import javax.inject.Inject import kotlinx.collections.immutable.ImmutableMap import kotlinx.collections.immutable.toImmutableMap import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext @ContributesViewModel @@ -99,6 +102,17 @@ constructor( var searchQuery by mutableStateOf("") + private val _savedPostsMutex = Mutex() + private var _savedPosts = emptyList() + + init { + viewModelScope.launch { + savedPosts.collectLatest { + _savedPostsMutex.withLock { _savedPosts = it.map(SavedPost::shortId) } + } + } + } + private fun mapSavedPosts(items: List): ImmutableMap> { val sorted = items.sortedWith { post1, post2 -> @@ -107,8 +121,8 @@ constructor( return sorted.groupBy { post -> post.createdAt.toLocalDateTime().month }.toImmutableMap() } - suspend fun isPostSaved(post: SavedPost): Boolean { - return savedPosts.first().any { savedPost -> savedPost.shortId == post.shortId } + fun isPostSaved(post: SavedPost): Boolean { + return _savedPosts.contains(post.shortId) } fun toggleSave(post: SavedPost) {