Insert saved items with highlights in labels in single transaction, reset search cursor when pulling to refresh or changing search filter

This commit is contained in:
Jackson Harper 2023-05-05 17:14:00 +08:00
parent b7421950a4
commit d399bf15f5
4 changed files with 13 additions and 90 deletions

View file

@ -91,70 +91,6 @@ suspend fun DataService.sync(since: String, cursor: String?, limit: Int = 20): S
}
db.savedItemWithLabelsAndHighlightsDao().insertAll(savedItems)
//
// db.savedItemDao().insertAll(savedItems)
//
// val labels: MutableList<SavedItemLabel> = mutableListOf()
// val crossRefs: MutableList<SavedItemAndSavedItemLabelCrossRef> = mutableListOf()
//
// // save labels
// for (item in syncResult.items) {
// val itemLabels = (item.labels ?: listOf()).map {
// SavedItemLabel(
// savedItemLabelId = it.labelFields.id,
// name = it.labelFields.name,
// color = it.labelFields.color,
// createdAt = null,
// labelDescription = null
// )
// }
//
// labels.addAll(itemLabels)
//
// val newCrossRefs = itemLabels.map {
// SavedItemAndSavedItemLabelCrossRef(
// savedItemLabelId = it.savedItemLabelId,
// savedItemId = item.id
// )
// }
//
// crossRefs.addAll(newCrossRefs)
// }
//
// db.savedItemLabelDao().insertAll(labels)
// db.savedItemAndSavedItemLabelCrossRefDao().insertAll(crossRefs)
//
// // Persist Highlights
// db.highlightDao().insertAll(syncResult.items.flatMap {
// it.highlights ?: listOf()
// }.map {
// Highlight(
// type = it.highlightFields.type.toString(),
// highlightId = it.highlightFields.id,
// annotation = it.highlightFields.annotation,
// createdByMe = it.highlightFields.createdByMe,
// markedForDeletion = false,
// patch = it.highlightFields.patch,
// prefix = it.highlightFields.prefix,
// quote = it.highlightFields.quote,
// serverSyncStatus = ServerSyncStatus.IS_SYNCED.rawValue,
// shortId = it.highlightFields.shortId,
// suffix = it.highlightFields.suffix,
// createdAt = null,
// updatedAt = it.highlightFields.updatedAt as String?,
// )
// })
//
// val highlightCrossRefs = syncResult.items.flatMap {
// val savedItem = it
// (savedItem.highlights ?: listOf()).map {
// Pair(it, savedItem.id)
// }
// }.map {
// SavedItemAndHighlightCrossRef(highlightId = it.first.highlightFields.id, savedItemId = it.second)
// }
//
// db.savedItemAndHighlightCrossRefDao().insertAll(highlightCrossRefs)
Log.d("sync", "found ${syncResult.items.size} items with sync api. Since: $since")
@ -175,28 +111,16 @@ fun DataService.isSavedItemContentStoredInDB(slug: String): Boolean {
suspend fun DataService.fetchSavedItemContent(slug: String) {
val syncResult = networker.savedItem(slug)
val isSuccess = syncResult.item != null
val savedItem = syncResult.item ?: return
db.savedItemDao().insert(savedItem)
// Persist Labels
db.savedItemLabelDao().insertAll(syncResult.labels)
val labelCrossRefs = syncResult.labels.map {
SavedItemAndSavedItemLabelCrossRef(savedItemLabelId = it.savedItemLabelId, savedItemId = savedItem.savedItemId)
val savedItem = syncResult.item
savedItem?.let {
val item = SavedItemWithLabelsAndHighlights(
savedItem = savedItem,
labels = syncResult.labels,
highlights = syncResult.highlights
)
db.savedItemWithLabelsAndHighlightsDao().insertAll(listOf(item))
}
db.savedItemAndSavedItemLabelCrossRefDao().insertAll(labelCrossRefs)
// Persist Highlights
db.highlightDao().insertAll(syncResult.highlights)
val highlightCrossRefs = syncResult.highlights.map {
SavedItemAndHighlightCrossRef(highlightId = it.highlightId, savedItemId = savedItem.savedItemId)
}
db.savedItemAndHighlightCrossRefDao().insertAll(highlightCrossRefs)
}

View file

@ -138,9 +138,6 @@ interface SavedItemDao {
@Query("SELECT * FROM savedItem WHERE slug = :slug")
fun getSavedItemWithLabelsAndHighlights(slug: String): SavedItemWithLabelsAndHighlights?
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(item: SavedItem)
@Query("DELETE FROM savedItem WHERE savedItemId = :itemID")
fun deleteById(itemID: String)

View file

@ -76,6 +76,8 @@ class LibraryViewModel @Inject constructor(
}
fun refresh() {
cursor = null
librarySearchCursor = null
isRefreshing = true
load(true)
}
@ -164,8 +166,9 @@ class LibraryViewModel @Inject constructor(
}
}
fun handleFilterChanges() {
librarySearchCursor = null
if (appliedSortFilterLiveData.value != null && appliedFilterLiveData.value != null) {
val applied = appliedFilterLiveData.value
val sortKey = when (appliedSortFilterLiveData.value) {
SavedItemSortFilter.NEWEST -> "newest"
SavedItemSortFilter.OLDEST -> "oldest"

View file

@ -1,6 +1,7 @@
package app.omnivore.omnivore.ui.savedItemViews
import LabelChip
import android.util.Log
import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyRow
@ -34,8 +35,6 @@ import coil.compose.rememberAsyncImagePainter
fun SavedItemCard(savedItemViewModel: SavedItemViewModel, savedItem: SavedItemWithLabelsAndHighlights, onClickHandler: () -> Unit, actionHandler: (SavedItemAction) -> Unit) {
val listState = rememberLazyListState()
val actionsMenuItem: SavedItemWithLabelsAndHighlights? by savedItemViewModel.actionsMenuItemLiveData.observeAsState(null)
Column(
modifier = Modifier
.combinedClickable(