create a PDFItem struct that can be used by PDFViewer
This commit is contained in:
@ -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
|
||||
}
|
||||
|
||||
@ -6,7 +6,7 @@ import Views
|
||||
struct FeedCardNavigationLink: View {
|
||||
@EnvironmentObject var dataService: DataService
|
||||
|
||||
@ObservedObject var item: LinkedItem
|
||||
let item: LinkedItem
|
||||
|
||||
@ObservedObject var viewModel: HomeFeedViewModel
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
25
apple/OmnivoreKit/Sources/Models/DataModels/PDFItem.swift
Normal file
25
apple/OmnivoreKit/Sources/Models/DataModels/PDFItem.swift
Normal 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)
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -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])
|
||||
|
||||
Reference in New Issue
Block a user