use db to save archive status changes and handle deletion from web reader

This commit is contained in:
Satindar Dhillon 2023-01-17 12:45:48 -08:00
parent 8aec8005ce
commit 89099d4431
4 changed files with 73 additions and 10 deletions

View file

@ -0,0 +1,56 @@
package app.omnivore.omnivore.dataService
import app.omnivore.omnivore.models.ServerSyncStatus
import app.omnivore.omnivore.networking.archiveSavedItem
import app.omnivore.omnivore.networking.deleteSavedItem
import app.omnivore.omnivore.networking.unarchiveSavedItem
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
suspend fun DataService.deleteSavedItem(itemID: String) {
withContext(Dispatchers.IO) {
val savedItem = db.savedItemDao().findById(itemID = itemID) ?: return@withContext
savedItem.serverSyncStatus = ServerSyncStatus.NEEDS_DELETION.rawValue
db.savedItemDao().update(savedItem)
val isUpdatedOnServer = networker.deleteSavedItem(itemID)
if (isUpdatedOnServer) {
db.savedItemDao().deleteById(itemID)
}
}
}
suspend fun DataService.archiveSavedItem(itemID: String) {
withContext(Dispatchers.IO) {
val savedItem = db.savedItemDao().findById(itemID = itemID) ?: return@withContext
savedItem.serverSyncStatus = ServerSyncStatus.NEEDS_UPDATE.rawValue
savedItem.isArchived = true
db.savedItemDao().update(savedItem)
val isUpdatedOnServer = networker.archiveSavedItem(itemID)
if (isUpdatedOnServer) {
savedItem.serverSyncStatus = ServerSyncStatus.IS_SYNCED.rawValue
db.savedItemDao().update(savedItem)
}
}
}
suspend fun DataService.unarchiveSavedItem(itemID: String) {
withContext(Dispatchers.IO) {
val savedItem = db.savedItemDao().findById(itemID = itemID) ?: return@withContext
savedItem.serverSyncStatus = ServerSyncStatus.NEEDS_UPDATE.rawValue
savedItem.isArchived = false
db.savedItemDao().update(savedItem)
val isUpdatedOnServer = networker.unarchiveSavedItem(itemID)
if (isUpdatedOnServer) {
savedItem.serverSyncStatus = ServerSyncStatus.IS_SYNCED.rawValue
db.savedItemDao().update(savedItem)
}
}
}

View file

@ -23,7 +23,7 @@ data class SavedItem(
val author: String?,
val publishDate: String?,
val slug: String,
val isArchived: Boolean,
var isArchived: Boolean,
val contentReader: String? = null,
val content: String? = null,
val createdId: String? = null,
@ -92,6 +92,9 @@ interface SavedItemDao {
@Query("SELECT * FROM savedItem")
fun getAll(): List<SavedItem>
@Query("SELECT * FROM savedItem WHERE savedItemId = :itemID")
fun findById(itemID: String): SavedItem?
@Query("SELECT * FROM savedItem WHERE serverSyncStatus != 0")
fun getUnSynced(): List<SavedItem>

View file

@ -15,6 +15,7 @@ import androidx.compose.foundation.layout.*
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.TopAppBar
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Menu
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material3.*
import androidx.compose.runtime.*
@ -97,12 +98,12 @@ fun WebReaderLoadingContainer(slug: String, webReaderViewModel: WebReaderViewMod
title = {},
actions = {
// Disabling menu until we implement local persistence
// IconButton(onClick = { isMenuExpanded = true }) {
// Icon(
// imageVector = Icons.Filled.Menu,
// contentDescription = null
// )
// }
IconButton(onClick = { isMenuExpanded = true }) {
Icon(
imageVector = Icons.Filled.Menu,
contentDescription = null
)
}
IconButton(onClick = { showWebPreferencesDialog = true }) {
Icon(
imageVector = Icons.Filled.Settings, // TODO: set a better icon

View file

@ -8,6 +8,9 @@ import androidx.lifecycle.viewModelScope
import app.omnivore.omnivore.DatastoreKeys
import app.omnivore.omnivore.DatastoreRepository
import app.omnivore.omnivore.dataService.DataService
import app.omnivore.omnivore.dataService.archiveSavedItem
import app.omnivore.omnivore.dataService.deleteSavedItem
import app.omnivore.omnivore.dataService.unarchiveSavedItem
import app.omnivore.omnivore.persistence.entities.SavedItem
import app.omnivore.omnivore.networking.*
import app.omnivore.omnivore.ui.library.SavedItemAction
@ -91,19 +94,19 @@ class WebReaderViewModel @Inject constructor(
when (action) {
SavedItemAction.Delete -> {
viewModelScope.launch {
networker.deleteSavedItem(itemID)
dataService.deleteSavedItem(itemID)
popToLibraryView(itemID)
}
}
SavedItemAction.Archive -> {
viewModelScope.launch {
networker.archiveSavedItem(itemID)
dataService.archiveSavedItem(itemID)
popToLibraryView(itemID)
}
}
SavedItemAction.Unarchive -> {
viewModelScope.launch {
networker.unarchiveSavedItem(itemID)
dataService.unarchiveSavedItem(itemID)
popToLibraryView(itemID)
}
}