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 }