create a PDFItem struct that can be used by PDFViewer

This commit is contained in:
Satindar Dhillon
2022-05-21 10:17:54 -07:00
parent 17e6f4091d
commit 14b146291f
6 changed files with 47 additions and 20 deletions

View File

@ -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<AnyCancellable>()
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
}

View File

@ -6,7 +6,7 @@ import Views
struct FeedCardNavigationLink: View {
@EnvironmentObject var dataService: DataService
@ObservedObject var item: LinkedItem
let item: LinkedItem
@ObservedObject var viewModel: HomeFeedViewModel

View File

@ -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)

View File

@ -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))
}
}

View File

@ -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)
)
}
}

View File

@ -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])