Merge pull request #2853 from omnivore-app/fix/ios-delete-old-items

Better handling of deleted items on iOS
This commit is contained in:
Jackson Harper
2023-10-04 17:53:04 +08:00
committed by GitHub
3 changed files with 33 additions and 1 deletions

View File

@ -3,6 +3,7 @@ import CoreData
import Foundation
import Models
import Services
import Utils
import Views
func removeLibraryItemAction(dataService: DataService, objectID: NSManagedObjectID) {
@ -10,6 +11,11 @@ func removeLibraryItemAction(dataService: DataService, objectID: NSManagedObject
if let item = dataService.viewContext.object(with: objectID) as? LinkedItem {
item.state = "DELETED"
try? dataService.viewContext.save()
// Delete local PDF file if it exists
if let localPdf = item.localPDF, let localPdfURL = PDFUtils.localPdfURL(filename: localPdf) {
try? FileManager.default.removeItem(at: localPdfURL)
}
}
}

View File

@ -63,6 +63,31 @@ public final class DataService: ObservableObject {
fatalError("Core Data store failed to load with error: \(error)")
}
}
cleanupDeletedItems(in: viewContext)
}
}
func cleanupDeletedItems(in context: NSManagedObjectContext) {
let fetchRequest: NSFetchRequest<LinkedItem> = LinkedItem.fetchRequest()
let calendar = Calendar.current
let oneDayAgo = calendar.date(byAdding: .day, value: -1, to: Date())!
let statePredicate = NSPredicate(format: "state == %@", "DELETED")
let datePredicate = NSPredicate(format: "updatedAt < %@", oneDayAgo as NSDate)
fetchRequest.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [statePredicate, datePredicate])
do {
let oldDeletedItems = try context.fetch(fetchRequest)
for item in oldDeletedItems {
context.delete(item)
}
try context.save()
} catch {
print("Error fetching or deleting objects: \(error)")
}
}

View File

@ -185,7 +185,8 @@ public struct LibraryItemCard: View {
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Gradient.randomColor(str: item.unwrappedTitle, offset: 0))
.background(LinearGradient(gradient: Gradient(fromStr: item.unwrappedTitle)!, startPoint: .top, endPoint: .bottom))
.frame(width: 50, height: 50)
.cornerRadius(5)
.frame(width: 50, height: 75)
}
var bylineStr: String {