Right-click a selection -> "Comment on Selection..." -> opens the comments sheet straight into composing, with a removable chip showing what's being anchored to (clearing it falls back to a plain document-level comment). Posts via comments.create with anchorText set to the selection. Only wired on rendered panes (main reader pane, Split View's preview pane) - not the raw-markdown pane, since a selection there would capture literal Markdown syntax as the anchor instead of clean prose. NSMenuItem has no closure initializer, so this needed a small target-is-self subclass (ClosureMenuItem) to wire a Swift closure into onBuildContextMenu's NSMenu without a separate selector per action. Also moved the comments sheet's .sheet(...) modifier off the toolbar badge button (which only exists once the doc already has comments) onto the view root, since a document with zero comments still needs to be able to open the sheet to create its first one. Reader now refetches its own comment list after any create/reply via the sheet's new onCommentsChanged callback, so a freshly anchored comment's inline marker appears without reopening the document.
27 lines
1.2 KiB
Swift
27 lines
1.2 KiB
Swift
import Foundation
|
|
|
|
/// `parentCommentId: nil` creates a document-level (top-level) comment;
|
|
/// non-nil creates a reply (Outline supports one level of nesting — a
|
|
/// reply's own `parentCommentId` should always be a top-level comment's
|
|
/// id, never another reply's). `anchorText` creates an inline (anchored)
|
|
/// comment instead of a document-level one — the first occurrence of that
|
|
/// exact substring in the document's plain text is used, same as Outline's
|
|
/// own web editor; `anchorPrefix`/`anchorSuffix` aren't sent (this app has
|
|
/// no UI for choosing between multiple identical occurrences). `text` is
|
|
/// the documented markdown convenience field for `data` (a ProseMirror
|
|
/// document) — simplest path for plain-text comment bodies, no need to
|
|
/// construct ProseMirror JSON by hand.
|
|
public struct CreateCommentRequest: Encodable, Sendable {
|
|
public let documentId: String
|
|
public let parentCommentId: String?
|
|
public let text: String
|
|
public let anchorText: String?
|
|
|
|
public init(documentId: String, parentCommentId: String? = nil, text: String, anchorText: String? = nil) {
|
|
self.documentId = documentId
|
|
self.parentCommentId = parentCommentId
|
|
self.text = text
|
|
self.anchorText = anchorText
|
|
}
|
|
}
|