feat: #80 标记已读 UI + 乐观更新
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
697220de00
commit
80c1d660cd
Binary file not shown.
@ -101,6 +101,7 @@ struct MaterialReaderView: View {
|
||||
@State private var hasRestoredPosition = false
|
||||
@State private var restoreBlockId: String?
|
||||
@State private var actualContentHeight: CGFloat = 1
|
||||
@State private var isMarkedRead = false
|
||||
|
||||
private let title: String
|
||||
private let knowledgeBaseId: String?
|
||||
@ -157,6 +158,15 @@ struct MaterialReaderView: View {
|
||||
.toolbarBackground(.hidden, for: .navigationBar)
|
||||
.toolbar {
|
||||
ToolbarItem(placement: .topBarTrailing) {
|
||||
HStack(spacing: 16) {
|
||||
Button {
|
||||
markAsRead()
|
||||
} label: {
|
||||
Image(systemName: isMarkedRead ? "checkmark.circle.fill" : "checkmark.circle")
|
||||
.font(.system(size: 16))
|
||||
.foregroundColor(isMarkedRead ? Color.green : Color.zxF05)
|
||||
}
|
||||
|
||||
NavigationLink(value: Route.aiChat(context: ChatEntryContext(
|
||||
scopeType: .material,
|
||||
scopeId: vm.materialId,
|
||||
@ -170,6 +180,7 @@ struct MaterialReaderView: View {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.task { await vm.load() }
|
||||
.sheet(isPresented: $showQuickLook) {
|
||||
QuickLookPreview(url: URL(fileURLWithPath: vm.filePath))
|
||||
@ -293,6 +304,15 @@ struct MaterialReaderView: View {
|
||||
print("[READER] V1 session closed")
|
||||
}
|
||||
|
||||
/// Mark the current material as read — optimistic update + event push.
|
||||
private func markAsRead() {
|
||||
guard !isMarkedRead else { return }
|
||||
isMarkedRead = true
|
||||
sessionManager.markAsRead()
|
||||
// V1 fallback
|
||||
collector.markAsRead(materialId: vm.materialId)
|
||||
}
|
||||
|
||||
/// Build a NoteAnchor from the current scroll position (for quick note).
|
||||
private func buildAnchor() -> NoteAnchor? {
|
||||
let pos = sessionManager.lastPosition ?? collector.lastPosition
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user