commit 8cc3edf195a27dc35b0b350207c5ae977b466587
parent c53b9d2ce614e8b1dfa6f8c70b5b227a2429c9ff
Author: William Casarin <jb55@jb55.com>
Date: Mon, 18 Apr 2022 12:32:55 -0700
use direct references on root events
references to root should be treated slightly differently, otherwise the
entire thread will be shown when you select the root event.
Signed-off-by: William Casarin <jb55@jb55.com>
Diffstat:
2 files changed, 53 insertions(+), 7 deletions(-)
diff --git a/damus/Nostr/NostrEvent.swift b/damus/Nostr/NostrEvent.swift
@@ -64,7 +64,39 @@ class NostrEvent: Codable, Identifiable {
}
}
}
-
+
+ public func is_root_event() -> Bool {
+ for tag in tags {
+ if tag.count >= 1 && tag[0] == "e" {
+ return false
+ }
+ }
+ return true
+ }
+
+ public func directly_references(_ id: String) -> Bool {
+ // conditions: if it only has 1 e ref
+ // OR it has more than 1 e ref, ignoring the first
+
+ var nrefs = 0
+ var i = 0
+ var first_matched = false
+ var matched = true
+
+ for tag in tags {
+ if tag.count >= 2 && tag[0] == "e" {
+ nrefs += 1
+ if tag[1] == id {
+ matched = true
+ first_matched = nrefs == 1
+ }
+ }
+ i += 1
+ }
+
+ return (nrefs == 1 && matched) || (nrefs > 1 && matched && !first_matched)
+ }
+
public func references(id: String, key: String) -> Bool {
for tag in tags {
if tag.count >= 2 && tag[0] == key {
diff --git a/damus/Views/EventDetailView.swift b/damus/Views/EventDetailView.swift
@@ -208,9 +208,14 @@ func make_reply_map(active: NostrEvent, events: [NostrEvent]) -> [String: ()]
if events.count == 0 {
return is_reply
}
-
+
+ let is_root = active.is_root_event()
+
for ev in events {
- if ev.references(id: active.id, key: "e") {
+ if is_root && ev.directly_references(active.id) {
+ is_reply[ev.id] = ()
+ start = i
+ } else if !is_root && ev.references(id: active.id, key: "e") {
is_reply[ev.id] = ()
start = i
} else if active.references(id: ev.id, key: "e") {
@@ -257,11 +262,20 @@ func determine_highlight(current: NostrEvent, active: NostrEvent) -> Highlight
if current.id == active.id {
return .main
}
- if active.references(id: current.id, key: "e") {
- return .reply
- } else if current.references(id: active.id, key: "e") {
- return .reply
+ if active.is_root_event() {
+ if active.directly_references(current.id) {
+ return .reply
+ } else if current.directly_references(active.id) {
+ return .reply
+ }
+ } else {
+ if active.references(id: current.id, key: "e") {
+ return .reply
+ } else if current.references(id: active.id, key: "e") {
+ return .reply
+ }
}
+
return .none
}