don't collapse if we don't need to
Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
@@ -91,36 +91,39 @@ struct EventDetailView: View {
|
||||
}
|
||||
}
|
||||
|
||||
func toggle_collapse_thread(scroller: ScrollViewProxy, id mid: String?, animate: Bool = true) {
|
||||
func toggle_collapse_thread(scroller: ScrollViewProxy, id mid: String?, animate: Bool = true, anchor: UnitPoint = .center) {
|
||||
self.collapsed = !self.collapsed
|
||||
if let id = mid {
|
||||
if !self.collapsed {
|
||||
scroll_to_event(scroller: scroller, id: id, delay: 0.1, animate: animate)
|
||||
scroll_to_event(scroller: scroller, id: id, delay: 0.1, animate: animate, anchor: anchor)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func scroll_to_event(scroller: ScrollViewProxy, id: String, delay: Double, animate: Bool) {
|
||||
func scroll_to_event(scroller: ScrollViewProxy, id: String, delay: Double, animate: Bool, anchor: UnitPoint = .center) {
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
|
||||
if animate {
|
||||
withAnimation {
|
||||
scroller.scrollTo(id, anchor: .top)
|
||||
scroller.scrollTo(id, anchor: anchor)
|
||||
}
|
||||
} else {
|
||||
scroller.scrollTo(id, anchor: .top)
|
||||
scroller.scrollTo(id, anchor: anchor)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func OurEventView(proxy: ScrollViewProxy, ev: NostrEvent, highlight: Highlight) -> some View {
|
||||
func OurEventView(proxy: ScrollViewProxy, ev: NostrEvent, highlight: Highlight, collapsed_events: [CollapsedEvent]) -> some View {
|
||||
Group {
|
||||
if ev.id == event.id {
|
||||
EventView(event: ev, highlight: .main, has_action_bar: true)
|
||||
.onAppear() {
|
||||
scroll_to_event(scroller: proxy, id: ev.id, delay: 0.5, animate: true)
|
||||
scroll_to_event(scroller: proxy, id: ev.id, delay: 0.3, animate: true)
|
||||
}
|
||||
.onTapGesture {
|
||||
toggle_collapse_thread(scroller: proxy, id: ev.id)
|
||||
let any = any_collapsed(collapsed_events)
|
||||
if (collapsed && any) || (!collapsed && !any) {
|
||||
toggle_collapse_thread(scroller: proxy, id: ev.id)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if !(self.collapsed && highlight.is_none) {
|
||||
@@ -142,13 +145,14 @@ struct EventDetailView: View {
|
||||
print("uncollapsing section at \(c.start) '\(ev.content.prefix(12))...'")
|
||||
let start_id = ev.id
|
||||
|
||||
toggle_collapse_thread(scroller: scroller, id: start_id, animate: true)
|
||||
toggle_collapse_thread(scroller: scroller, id: start_id, animate: true, anchor: .top)
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
ScrollViewReader { proxy in
|
||||
ScrollView {
|
||||
ForEach(calculated_collapsed_events(collapsed: self.collapsed, active: self.event, events: self.events), id: \.id) { cev in
|
||||
let collapsed_events = calculated_collapsed_events(collapsed: self.collapsed, active: self.event, events: self.events)
|
||||
ForEach(collapsed_events, id: \.id) { cev in
|
||||
switch cev {
|
||||
case .collapsed(let c):
|
||||
Text("··· \(c.count) other replies ···")
|
||||
@@ -159,7 +163,7 @@ struct EventDetailView: View {
|
||||
//self.toggle_collapse_thread(scroller: proxy, id: nil)
|
||||
}
|
||||
case .event(let ev, let highlight):
|
||||
OurEventView(proxy: proxy, ev: ev, highlight: highlight)
|
||||
OurEventView(proxy: proxy, ev: ev, highlight: highlight, collapsed_events: collapsed_events)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -305,7 +309,7 @@ func calculated_collapsed_events(collapsed: Bool, active: NostrEvent, events: [N
|
||||
|
||||
switch highlight {
|
||||
case .none:
|
||||
if (count == 0) {
|
||||
if (i == 0) {
|
||||
start = 1
|
||||
}
|
||||
count += 1
|
||||
@@ -339,3 +343,16 @@ func calculated_collapsed_events(collapsed: Bool, active: NostrEvent, events: [N
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
func any_collapsed(_ evs: [CollapsedEvent]) -> Bool {
|
||||
for ev in evs {
|
||||
switch ev {
|
||||
case .collapsed:
|
||||
return true
|
||||
case .event:
|
||||
continue
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ struct ReplyView: View {
|
||||
.font(.footnote)
|
||||
}
|
||||
EventView(event: replying_to, highlight: .none, has_action_bar: false)
|
||||
PostView(references: replying_to.reply_ids(pubkey: replying_to.pubkey))
|
||||
PostView(references: replying_to.reply_ids())
|
||||
|
||||
Spacer()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user