diff --git a/apple/OmnivoreKit/Sources/App/PDFSupport/PDFViewerViewModel.swift b/apple/OmnivoreKit/Sources/App/PDFSupport/PDFViewerViewModel.swift
index 5b25456cb..14bcb6ed2 100644
--- a/apple/OmnivoreKit/Sources/App/PDFSupport/PDFViewerViewModel.swift
+++ b/apple/OmnivoreKit/Sources/App/PDFSupport/PDFViewerViewModel.swift
@@ -3,6 +3,7 @@ import CoreData
import Foundation
import Models
import Services
+import Utils
public final class PDFViewerViewModel: ObservableObject {
@Published public var errorMessage: String?
@@ -93,6 +94,11 @@ public final class PDFViewerViewModel: ObservableObject {
if itemDownloaded {
return pdfItem.localPdfURL
}
+ if let tempURL = pdfItem.tempPDFURL {
+ if let localURL = try? PDFUtils.copyToLocal(url: tempURL) {
+ return tempURL
+ }
+ }
if let localURL = try await dataService.fetchPDFData(slug: pdfItem.slug, pageURLString: pdfItem.originalArticleURL) {
return localURL
}
diff --git a/apple/OmnivoreKit/Sources/Models/CoreData/CoreDataModel.xcdatamodeld/CoreDataModel.xcdatamodel/contents b/apple/OmnivoreKit/Sources/Models/CoreData/CoreDataModel.xcdatamodeld/CoreDataModel.xcdatamodel/contents
index fec76121b..9c4257c46 100644
--- a/apple/OmnivoreKit/Sources/Models/CoreData/CoreDataModel.xcdatamodeld/CoreDataModel.xcdatamodel/contents
+++ b/apple/OmnivoreKit/Sources/Models/CoreData/CoreDataModel.xcdatamodeld/CoreDataModel.xcdatamodel/contents
@@ -44,6 +44,7 @@
+
@@ -91,7 +92,7 @@
-
+
diff --git a/apple/OmnivoreKit/Sources/Models/DataModels/FeedItem.swift b/apple/OmnivoreKit/Sources/Models/DataModels/FeedItem.swift
index 4147401d9..d74f21aeb 100644
--- a/apple/OmnivoreKit/Sources/Models/DataModels/FeedItem.swift
+++ b/apple/OmnivoreKit/Sources/Models/DataModels/FeedItem.swift
@@ -47,7 +47,7 @@ public extension LinkedItem {
var isReadyToRead: Bool {
if isPDF {
// If its a PDF we verify the local file is available
- return PDFUtils.exists(filename: localPDF)
+ return PDFUtils.exists(filename: localPDF) || PDFUtils.tempExists(tempPDFURL: tempPDFURL)
}
// Check the state and whether we have HTML
return state == "SUCCEEDED"
diff --git a/apple/OmnivoreKit/Sources/Models/DataModels/PDFItem.swift b/apple/OmnivoreKit/Sources/Models/DataModels/PDFItem.swift
index 475f8dfb9..43c2eb672 100644
--- a/apple/OmnivoreKit/Sources/Models/DataModels/PDFItem.swift
+++ b/apple/OmnivoreKit/Sources/Models/DataModels/PDFItem.swift
@@ -7,6 +7,7 @@ public struct PDFItem {
public let itemID: String
public let pdfURL: URL?
public let localPDF: String?
+ public let tempPDFURL: URL?
public let title: String
public let slug: String
public let readingProgress: Double
@@ -24,6 +25,7 @@ public struct PDFItem {
itemID: item.unwrappedID,
pdfURL: URL(string: item.unwrappedPageURLString),
localPDF: item.localPDF,
+ tempPDFURL: item.tempPDFURL,
title: item.unwrappedID,
slug: item.unwrappedSlug,
readingProgress: item.readingProgress,
diff --git a/apple/OmnivoreKit/Sources/Services/DataService/DataService.swift b/apple/OmnivoreKit/Sources/Services/DataService/DataService.swift
index eb464759c..f14ac5b6a 100644
--- a/apple/OmnivoreKit/Sources/Services/DataService/DataService.swift
+++ b/apple/OmnivoreKit/Sources/Services/DataService/DataService.swift
@@ -148,9 +148,8 @@ public final class DataService: ObservableObject {
switch pageScrape.contentType {
case let .pdf(localUrl):
linkedItem.contentReader = "PDF"
+ linkedItem.tempPDFURL = localUrl
linkedItem.title = PDFUtils.titleFromPdfFile(pageScrape.url)
- print("PERSISTING PDF", localUrl)
- linkedItem.localPDF = try PDFUtils.copyToLocal(url: localUrl)
case let .html(html: html, title: title, iconURL: iconURL):
linkedItem.contentReader = "WEB"
linkedItem.originalHtml = html
diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/SavePDF.swift b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/SavePDF.swift
index c0e9e186e..c5b53b58e 100644
--- a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/SavePDF.swift
+++ b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/SavePDF.swift
@@ -4,6 +4,7 @@ import Models
import SwiftGraphQL
public struct UploadFileRequestPayload {
+ public let pageId: String
public let uploadID: String?
public let uploadFileID: String?
public let urlString: String?
@@ -29,6 +30,7 @@ public extension DataService {
uploadFileRequestSuccess: .init {
.success(
payload: UploadFileRequestPayload(
+ pageId: (try $0.createdPageId()) ?? id,
uploadID: try $0.id(),
uploadFileID: try $0.uploadFileId(),
urlString: try $0.uploadSignedUrl()
diff --git a/apple/OmnivoreKit/Sources/Services/DataService/OfflineSync.swift b/apple/OmnivoreKit/Sources/Services/DataService/OfflineSync.swift
index c5c5e2777..73dce5a04 100644
--- a/apple/OmnivoreKit/Sources/Services/DataService/OfflineSync.swift
+++ b/apple/OmnivoreKit/Sources/Services/DataService/OfflineSync.swift
@@ -54,18 +54,14 @@ public extension DataService {
try await updateLinkedItemStatus(id: id, newId: nil, status: .isSyncing)
let uploadRequest = try await uploadFileRequest(id: id, url: url)
+ print("UPLOAD REQUEST, ORIGINAL ID, NEW ID", id, uploadRequest.pageId)
if let urlString = uploadRequest.urlString, let uploadUrl = URL(string: urlString) {
- let attr = try? FileManager.default.attributesOfItem(atPath: localPdfURL.path)
- if let attr = attr {
- print("ATTR", attr[.size])
- }
-
- try await uploadFile(id: id, localPdfURL: localPdfURL, url: uploadUrl)
+ try await uploadFile(id: uploadRequest.pageId, localPdfURL: localPdfURL, url: uploadUrl)
} else {
throw SaveArticleError.badData
}
- try await updateLinkedItemStatus(id: id, newId: nil, status: .isNSync)
+ try await updateLinkedItemStatus(id: id, newId: uploadRequest.pageId, status: .isNSync)
try backgroundContext.performAndWait {
try backgroundContext.save()
}
diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Queries/ArticleContentQuery.swift b/apple/OmnivoreKit/Sources/Services/DataService/Queries/ArticleContentQuery.swift
index 8c3b98c57..e1851149b 100644
--- a/apple/OmnivoreKit/Sources/Services/DataService/Queries/ArticleContentQuery.swift
+++ b/apple/OmnivoreKit/Sources/Services/DataService/Queries/ArticleContentQuery.swift
@@ -195,6 +195,8 @@ public extension DataService {
}
internal func persistArticleContent(item: InternalLinkedItem, htmlContent: String, highlights: [InternalHighlight]) async throws {
+ var needsPDFDownload = false
+
try await backgroundContext.perform { [weak self] in
guard let self = self else { return }
let fetchRequest: NSFetchRequest = LinkedItem.fetchRequest()
@@ -226,9 +228,30 @@ public extension DataService {
linkedItem.isArchived = item.isArchived
linkedItem.contentReader = item.contentReader
linkedItem.serverSyncStatus = Int64(ServerSyncStatus.isNSync.rawValue)
+
+ if item.isPDF {
+ needsPDFDownload = true
+
+ // Check if we already have the PDF item locally. Either in temporary
+ // space, or in the documents directory
+ if let localPDF = existingItem?.localPDF {
+ if PDFUtils.exists(filename: localPDF) {
+ linkedItem.localPDF = localPDF
+ needsPDFDownload = false
+ }
+ }
+
+ if let tempPDFURL = existingItem?.tempPDFURL {
+ linkedItem.localPDF = try? PDFUtils.moveToLocal(url: tempPDFURL)
+ PDFUtils.exists(filename: linkedItem.localPDF)
+ if linkedItem.localPDF != nil {
+ needsPDFDownload = false
+ }
+ }
+ }
}
- if item.isPDF {
+ if item.isPDF && needsPDFDownload {
try await fetchPDFData(slug: item.slug, pageURLString: item.pageURLString)
}
@@ -275,6 +298,7 @@ public extension DataService {
try data.write(to: tempPath)
let localPDF = try PDFUtils.moveToLocal(url: tempPath)
localPdfURL = PDFUtils.localPdfURL(filename: localPDF)
+ linkedItem.tempPDFURL = nil
linkedItem.localPDF = localPDF
try self?.backgroundContext.save()
} catch {
diff --git a/apple/OmnivoreKit/Sources/Utils/PDFUtils.swift b/apple/OmnivoreKit/Sources/Utils/PDFUtils.swift
index 0d4a4c19c..1919377fc 100644
--- a/apple/OmnivoreKit/Sources/Utils/PDFUtils.swift
+++ b/apple/OmnivoreKit/Sources/Utils/PDFUtils.swift
@@ -35,12 +35,21 @@ public enum PDFUtils {
let url = FileManager.default
.urls(for: .documentDirectory, in: .userDomainMask)[0]
.appendingPathComponent(filename)
+
return url
}
public static func exists(filename: String?) -> Bool {
if let filename = filename, let localPdfURL = localPdfURL(filename: filename) {
- return FileManager.default.fileExists(atPath: localPdfURL.absoluteString)
+ let result = FileManager.default.fileExists(atPath: localPdfURL.path)
+ return result
+ }
+ return false
+ }
+
+ public static func tempExists(tempPDFURL: URL?) -> Bool {
+ if let tempPDFURL = tempPDFURL {
+ return FileManager.default.fileExists(atPath: tempPDFURL.path)
}
return false
}