diff --git a/apple/OmnivoreKit/Sources/App/PDFSupport/PDFViewerViewModel.swift b/apple/OmnivoreKit/Sources/App/PDFSupport/PDFViewerViewModel.swift index 094ec4e4d..f8510a545 100644 --- a/apple/OmnivoreKit/Sources/App/PDFSupport/PDFViewerViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/PDFSupport/PDFViewerViewModel.swift @@ -8,15 +8,15 @@ public final class PDFViewerViewModel: ObservableObject { @Published public var errorMessage: String? @Published public var readerView: Bool = false - public var linkedItem: LinkedItem + public let pdfItem: PDFItem private var storedURL: URL? var subscriptions = Set() let services: Services - public init(services: Services, linkedItem: LinkedItem) { + public init(services: Services, pdfItem: PDFItem) { self.services = services - self.linkedItem = linkedItem + self.pdfItem = pdfItem } public func dataURL(remoteURL: URL) -> URL { @@ -24,9 +24,9 @@ public final class PDFViewerViewModel: ObservableObject { return storedURL } - guard let data = linkedItem.pdfData else { return remoteURL } + guard let data = pdfItem.documentData else { return remoteURL } - let subPath = linkedItem.unwrappedTitle.isEmpty ? UUID().uuidString : linkedItem.unwrappedTitle + let subPath = pdfItem.title.isEmpty ? UUID().uuidString : pdfItem.title let path = FileManager.default .urls(for: .cachesDirectory, in: .userDomainMask)[0] @@ -42,7 +42,7 @@ public final class PDFViewerViewModel: ObservableObject { } public func loadHighlightPatches(completion onComplete: @escaping ([String]) -> Void) { - onComplete(linkedItem.highlights.asArray(of: Highlight.self).map { $0.patch ?? "" }) + onComplete(pdfItem.highlights.map { $0.patch ?? "" }) } public func createHighlight(shortId: String, highlightID: String, quote: String, patch: String) { @@ -51,7 +51,7 @@ public final class PDFViewerViewModel: ObservableObject { highlightID: highlightID, quote: quote, patch: patch, - articleId: linkedItem.unwrappedID + articleId: pdfItem.itemID ) } @@ -67,7 +67,7 @@ public final class PDFViewerViewModel: ObservableObject { highlightID: highlightID, quote: quote, patch: patch, - articleId: linkedItem.unwrappedID, + articleId: pdfItem.itemID, overlapHighlightIdList: overlapHighlightIdList ) } @@ -80,7 +80,7 @@ public final class PDFViewerViewModel: ObservableObject { public func updateItemReadProgress(percent: Double, anchorIndex: Int) { services.dataService.updateLinkReadingProgress( - itemID: linkedItem.unwrappedID, + itemID: pdfItem.itemID, readingProgress: percent, anchorIndex: anchorIndex ) @@ -91,7 +91,7 @@ public final class PDFViewerViewModel: ObservableObject { var components = URLComponents(url: baseURL, resolvingAgainstBaseURL: false) if let username = services.dataService.currentViewer?.username { - components?.path = "/\(username)/\(linkedItem.unwrappedSlug)/highlights/\(shortId)" + components?.path = "/\(username)/\(pdfItem.slug)/highlights/\(shortId)" } else { return nil } diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/Components/FeedCardNavigationLink.swift b/apple/OmnivoreKit/Sources/App/Views/Home/Components/FeedCardNavigationLink.swift index 895216be8..a1326b292 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/Components/FeedCardNavigationLink.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/Components/FeedCardNavigationLink.swift @@ -6,7 +6,7 @@ import Views struct FeedCardNavigationLink: View { @EnvironmentObject var dataService: DataService - @ObservedObject var item: LinkedItem + let item: LinkedItem @ObservedObject var viewModel: HomeFeedViewModel diff --git a/apple/OmnivoreKit/Sources/App/Views/LinkItemDetailView.swift b/apple/OmnivoreKit/Sources/App/Views/LinkItemDetailView.swift index e25217235..4646b1822 100644 --- a/apple/OmnivoreKit/Sources/App/Views/LinkItemDetailView.swift +++ b/apple/OmnivoreKit/Sources/App/Views/LinkItemDetailView.swift @@ -6,10 +6,11 @@ import Utils import Views enum PDFProvider { - static var pdfViewerProvider: ((URL, LinkedItem) -> AnyView)? + static var pdfViewerProvider: ((URL, PDFItem) -> AnyView)? } @MainActor final class LinkItemDetailViewModel: ObservableObject { + let pdfItem: PDFItem? @Published var item: LinkedItem @Published var webAppWrapperViewModel: WebAppWrapperViewModel? @@ -17,6 +18,7 @@ enum PDFProvider { init(item: LinkedItem) { self.item = item + self.pdfItem = PDFItem.make(item: item) } func handleArchiveAction(dataService: DataService) { @@ -277,9 +279,9 @@ struct LinkItemDetailView: View { #endif @ViewBuilder private var fixedNavBarReader: some View { - if let pdfURL = viewModel.item.pdfURL { + if let pdfURL = viewModel.item.pdfURL, let pdfItem = viewModel.pdfItem { #if os(iOS) - PDFProvider.pdfViewerProvider?(pdfURL, viewModel.item) + PDFProvider.pdfViewerProvider?(pdfURL, pdfItem) .navigationBarTitleDisplayMode(.inline) #elseif os(macOS) PDFWrapperView(pdfURL: pdfURL) diff --git a/apple/OmnivoreKit/Sources/App/Views/RootView/RootViewModel.swift b/apple/OmnivoreKit/Sources/App/Views/RootView/RootViewModel.swift index cb037610f..400ac7564 100644 --- a/apple/OmnivoreKit/Sources/App/Views/RootView/RootViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/Views/RootView/RootViewModel.swift @@ -35,9 +35,9 @@ public final class RootViewModel: ObservableObject { func configurePDFProvider(pdfViewerProvider: @escaping (URL, PDFViewerViewModel) -> AnyView) { guard PDFProvider.pdfViewerProvider == nil else { return } - PDFProvider.pdfViewerProvider = { [weak self] url, linkedItem in + PDFProvider.pdfViewerProvider = { [weak self] url, pdfItem in guard let self = self else { return AnyView(Text("")) } - return pdfViewerProvider(url, PDFViewerViewModel(services: self.services, linkedItem: linkedItem)) + return pdfViewerProvider(url, PDFViewerViewModel(services: self.services, pdfItem: pdfItem)) } } diff --git a/apple/OmnivoreKit/Sources/Models/DataModels/PDFItem.swift b/apple/OmnivoreKit/Sources/Models/DataModels/PDFItem.swift new file mode 100644 index 000000000..f9d99c6c5 --- /dev/null +++ b/apple/OmnivoreKit/Sources/Models/DataModels/PDFItem.swift @@ -0,0 +1,25 @@ +import Foundation + +public struct PDFItem { + public let itemID: String + public let documentData: Data? + public let title: String + public let slug: String + public let readingProgress: Double + public let readingProgressAnchor: Int + public let highlights: [Highlight] + + public static func make(item: LinkedItem) -> PDFItem? { + guard item.isPDF else { return nil } + + return PDFItem( + itemID: item.unwrappedID, + documentData: item.pdfData, + title: item.unwrappedID, + slug: item.unwrappedSlug, + readingProgress: item.readingProgress, + readingProgressAnchor: Int(item.readingProgressAnchor), + highlights: item.highlights.asArray(of: Highlight.self) + ) + } +} diff --git a/apple/Sources/PDFViewer.swift b/apple/Sources/PDFViewer.swift index 9bfff9d70..520cc538e 100644 --- a/apple/Sources/PDFViewer.swift +++ b/apple/Sources/PDFViewer.swift @@ -70,8 +70,8 @@ import Utils coordinator.viewer = self - if viewModel.linkedItem.readingProgressAnchor > 0 { - let pageIndex = UInt(viewModel.linkedItem.readingProgressAnchor) + if viewModel.pdfItem.readingProgressAnchor > 0 { + let pageIndex = UInt(viewModel.pdfItem.readingProgressAnchor) controller.setPageIndex(pageIndex, animated: false) } @@ -145,7 +145,7 @@ import Utils let pageIndex = Int(event.pageIndex) if let totalPageCount = controller.document?.pageCount { let percent = min(100, max(0, ((Double(pageIndex) + 1.0) / Double(totalPageCount)) * 100.0)) - if percent > self.viewModel.linkedItem.readingProgress { + if percent > self.viewModel.pdfItem.readingProgress { self.viewModel.updateItemReadProgress(percent: percent, anchorIndex: pageIndex) } } @@ -199,7 +199,7 @@ import Utils "id": highlightID, "shortId": shortId, "quote": quote, - "articleId": viewModel.linkedItem.unwrappedID + "articleId": viewModel.pdfItem.itemID ] ] document.add(annotations: [highlight])