diff --git a/apple/OmnivoreKit/Sources/App/PDFSupport/PDFViewer.swift b/apple/OmnivoreKit/Sources/App/PDFSupport/PDFViewer.swift index e525f5f66..2eb80d27a 100644 --- a/apple/OmnivoreKit/Sources/App/PDFSupport/PDFViewer.swift +++ b/apple/OmnivoreKit/Sources/App/PDFSupport/PDFViewer.swift @@ -1,4 +1,5 @@ import Combine +import Models import SwiftUI import Utils @@ -9,6 +10,7 @@ import Utils import Services import Views + @MainActor struct PDFViewer: View { enum SettingsKeys: String { case pageTransitionKey = "PDFViewer.pageTransition" @@ -39,9 +41,16 @@ import Utils @StateObject var pdfStateObject = PDFStateObject() @State var readerView: Bool = false @State private var shareLink: ShareLink? + @State private var errorMessage: String? @State private var showNotebookView = false @State private var hasPerformedHighlightMutations = false + @State private var errorAlertMessage: String? + @State private var showErrorAlertMessage = false + + @State private var annotation = "" + @State private var addNoteHighlight: Highlight? + @State private var showAnnotationModal = false init(viewModel: PDFViewerViewModel) { self.viewModel = viewModel @@ -150,12 +159,6 @@ import Utils dataService: dataService ) }) -// let share = MenuItem(title: "Share", block: { -// let shortId = self.coordinator.highlightSelection(pageView: pageView, selectedText: selectedText) -// if let shareURL = viewModel.highlightShareURL(shortId: shortId) { -// shareLink = ShareLink(id: UUID(), url: shareURL) -// } -// }) define?.title = "Lookup" return [copy, highlight, define].compactMap { $0 } }) @@ -164,17 +167,54 @@ import Utils if let copy = menuItems.first(where: { $0.identifier == "Copy" }) { result.append(copy) } - + let note = MenuItem(title: "Note", block: { + if let highlight = annotations?.compactMap({ $0 as? HighlightAnnotation }).first, + let customHighlight = highlight.customData?["omnivoreHighlight"] as? [String: String], + let highlightID = customHighlight["id"]?.lowercased(), + let selectedHighlight = viewModel.findHighlight(highlightID: highlightID) + { + addNoteHighlight = selectedHighlight + annotation = selectedHighlight.annotation ?? "" + showAnnotationModal = true + } else { + errorMessage = "Unable to find highlight" + showErrorAlertMessage = true + } + }) + result.append(note) let remove = MenuItem(title: "Remove", block: { coordinator.remove(dataService: dataService, annotations: annotations) }) result.append(remove) - let highlights = annotations?.compactMap { $0 as? HighlightAnnotation } - let shortId = highlights.flatMap { coordinator.shortHighlightIds($0).first } - return result }) + .sheet(isPresented: $showAnnotationModal) { + NavigationView { + HighlightAnnotationSheet( + annotation: $annotation, + onSave: { + // annotationSaveTransactionID = UUID() + if let highlightID = addNoteHighlight?.id { + viewModel.updateAnnotation( + highlightID: highlightID, + annotation: annotation, + dataService: dataService + ) + showAnnotationModal = false + } + }, + onCancel: { + annotation = "" + addNoteHighlight = nil + showAnnotationModal = false + }, + errorAlertMessage: $errorAlertMessage, + showErrorAlertMessage: $showErrorAlertMessage + ) + } + .navigationViewStyle(StackNavigationViewStyle()) + } .fullScreenCover(isPresented: $readerView, content: { PDFReaderViewController(document: document) }) @@ -216,6 +256,7 @@ import Utils hasPerformedHighlightMutations.toggle() } + @MainActor class PDFViewCoordinator: NSObject, PDFDocumentViewControllerDelegate, PDFViewControllerDelegate { let document: Document let viewModel: PDFViewerViewModel diff --git a/apple/OmnivoreKit/Sources/App/PDFSupport/PDFViewerViewModel.swift b/apple/OmnivoreKit/Sources/App/PDFSupport/PDFViewerViewModel.swift index 96f88a654..32ca44549 100644 --- a/apple/OmnivoreKit/Sources/App/PDFSupport/PDFViewerViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/PDFSupport/PDFViewerViewModel.swift @@ -22,6 +22,10 @@ final class PDFViewerViewModel: ObservableObject { showSnackbar = true } + func findHighlight(highlightID: String) -> Highlight? { + pdfItem.highlights.first { $0.id == highlightID } + } + func loadHighlightPatches(completion onComplete: @escaping ([String]) -> Void) { onComplete(pdfItem.highlights.map { $0.patch ?? "" }) } @@ -76,6 +80,14 @@ final class PDFViewerViewModel: ObservableObject { } } + func updateAnnotation(highlightID: String, annotation: String, dataService: DataService) { + dataService.updateHighlightAttributes(highlightID: highlightID, annotation: annotation) + + if let highlight = pdfItem.highlights.first(where: { $0.id == highlightID }) { + highlight.annotation = annotation + } + } + func updateItemReadProgress(dataService: DataService, percent: Double, anchorIndex: Int, force: Bool = false) { dataService.updateLinkReadingProgress( itemID: pdfItem.itemID, diff --git a/apple/OmnivoreKit/Sources/App/Views/Highlights/HighlightsListCard.swift b/apple/OmnivoreKit/Sources/App/Views/Highlights/HighlightsListCard.swift index 85ea98301..8d7b3f91d 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Highlights/HighlightsListCard.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Highlights/HighlightsListCard.swift @@ -196,6 +196,7 @@ showErrorAlertMessage: $showErrorAlertMessage ) } + .navigationViewStyle(StackNavigationViewStyle()) } .formSheet(isPresented: $showShareView) { ShareSheet(activityItems: [viewModel.highlightAsMarkdown(item: self.highlightParams)]) diff --git a/apple/OmnivoreKit/Sources/App/Views/Highlights/NotebookView.swift b/apple/OmnivoreKit/Sources/App/Views/Highlights/NotebookView.swift index 1e8f6e5bb..6e8bc2b92 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Highlights/NotebookView.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Highlights/NotebookView.swift @@ -182,6 +182,7 @@ showErrorAlertMessage: $showErrorAlertMessage ) } + .navigationViewStyle(StackNavigationViewStyle()) } } diff --git a/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderContainer.swift b/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderContainer.swift index 942ea7cd2..5b729eb33 100644 --- a/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderContainer.swift +++ b/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderContainer.swift @@ -498,6 +498,7 @@ struct WebReaderContainerView: View { showErrorAlertMessage: $showErrorAlertMessage ) } + .navigationViewStyle(StackNavigationViewStyle()) } .sheet(isPresented: $showHighlightLabelsModal) { if let highlight = Highlight.lookup(byID: self.annotation, inContext: self.dataService.viewContext) {