Pro Highlight kann jetzt eine kurze Notiz angelegt + bearbeitet werden
("warum hab ich das markiert?"). HighlightNoteUpdated-Event existiert
schon im shared-schemas-Schema; auf der Native-Seite war es noch nicht
verdrahtet.
- EventType.highlightNoteUpdated + HighlightNoteUpdatedPayload neu.
- Reducer.applyHighlight handelt den note-Patch.
- EventSyncCoordinator.setHighlightNote(id:note:) emittiert das Event,
normalisiert Empty-String zu nil.
- PagetaAPI.setHighlightNote(...) wrapper.
- HighlightWithArticle ändert highlight/article zu var damit
Optimistic-Update beim Save patchen kann.
UI:
- Neuer HighlightNoteSheet (Form mit Markierung-Preview + Multi-Line
TextField + Save/Abbrechen, Auto-Focus).
- MarkierungenTabView: Leading-Swipe "Notiz" öffnet den Sheet, Notiz
wird in der Row unter dem Highlight-Text mit note.text-Icon angezeigt.
- ArticleDetailView.highlightsSection: kleines Notiz-Icon-Button pro
Highlight (note.text.badge.plus wenn leer, note.text wenn gesetzt),
Notiz darunter eingerückt sichtbar. Highlight-Row in eigene
@ViewBuilder-Methode extrahiert wegen Compiler-Timeout.
iOS Sim BUILD SUCCEEDED, macOS BUILD SUCCEEDED, 38/38 Tests pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
59 lines
1.6 KiB
Swift
59 lines
1.6 KiB
Swift
import Foundation
|
|
import SwiftUI
|
|
|
|
enum HighlightColor: String, Codable, Sendable, CaseIterable, Identifiable {
|
|
case yellow
|
|
case green
|
|
case blue
|
|
case pink
|
|
|
|
var id: String { rawValue }
|
|
|
|
var label: String {
|
|
switch self {
|
|
case .yellow: "Gelb"
|
|
case .green: "Grün"
|
|
case .blue: "Blau"
|
|
case .pink: "Pink"
|
|
}
|
|
}
|
|
|
|
/// Dezent-warm gewählte Farben, harmonieren mit dem paper-Theme.
|
|
var swiftUIColor: Color {
|
|
switch self {
|
|
case .yellow: Color(red: 0.98, green: 0.85, blue: 0.45)
|
|
case .green: Color(red: 0.65, green: 0.85, blue: 0.55)
|
|
case .blue: Color(red: 0.60, green: 0.78, blue: 0.95)
|
|
case .pink: Color(red: 0.98, green: 0.70, blue: 0.85)
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Mirror von `pageta-domain/types.ts#Highlight`. Offsets werden vom
|
|
/// Web-Client gesetzt; pageta-native arbeitet vorerst auf Paragraph-
|
|
/// Granularität (offset=0 bei via Tool-Endpoint gespeicherten
|
|
/// Highlights — Web-Highlights mit echten Offsets bleiben sichtbar).
|
|
struct Highlight: Codable, Sendable, Identifiable {
|
|
let id: String
|
|
let articleId: String
|
|
let userId: String
|
|
let text: String
|
|
var note: String?
|
|
var color: HighlightColor
|
|
let startOffset: Int
|
|
let endOffset: Int
|
|
let contextBefore: String?
|
|
let contextAfter: String?
|
|
let createdAt: String
|
|
let updatedAt: String
|
|
}
|
|
|
|
/// Highlight + zugehöriger Artikel-Kontext für die globale Markierungen-
|
|
/// Liste. `article` ist der gesamte Article-State (nicht nur Titel),
|
|
/// damit die Liste auch SiteName, Datum, Reading-Time anzeigen kann
|
|
/// ohne separate Lookups.
|
|
struct HighlightWithArticle: Sendable, Identifiable {
|
|
var id: String { highlight.id }
|
|
var highlight: Highlight
|
|
var article: Article
|
|
}
|