ThreadView.swift (5356B)
1 // 2 // ThreadV2View.swift 3 // damus 4 // 5 // Created by Thomas Tastet on 25/12/2022. 6 // 7 8 import SwiftUI 9 10 struct ThreadView: View { 11 let state: DamusState 12 13 @ObservedObject var thread: ThreadModel 14 @Environment(\.dismiss) var dismiss 15 16 var parent_events: [NostrEvent] { 17 state.events.parent_events(event: thread.event, keypair: state.keypair) 18 } 19 20 var sorted_child_events: [NostrEvent] { 21 state.events.child_events(event: thread.event).sorted(by: { a, b in 22 let a_is_muted = !should_show_event(event: a, damus_state: state) 23 let b_is_muted = !should_show_event(event: b, damus_state: state) 24 25 if a_is_muted == b_is_muted { 26 // If both are muted or unmuted, sort them based on their creation date. 27 return a.created_at < b.created_at 28 } 29 else { 30 // Muting status is different 31 // Prioritize the replies that are not muted 32 return !a_is_muted && b_is_muted 33 } 34 }) 35 } 36 37 var body: some View { 38 //let top_zap = get_top_zap(events: state.events, evid: thread.event.id) 39 ScrollViewReader { reader in 40 ScrollView { 41 LazyVStack { 42 // MARK: - Parents events view 43 ForEach(parent_events, id: \.id) { parent_event in 44 EventMutingContainerView(damus_state: state, event: parent_event) { 45 EventView(damus: state, event: parent_event) 46 } 47 .padding(.horizontal) 48 .onTapGesture { 49 thread.set_active_event(parent_event, keypair: self.state.keypair) 50 scroll_to_event(scroller: reader, id: parent_event.id, delay: 0.1, animate: false) 51 } 52 53 Divider() 54 .padding(.top, 4) 55 .padding(.leading, 25 * 2) 56 57 }.background(GeometryReader { geometry in 58 // get the height and width of the EventView view 59 let eventHeight = geometry.frame(in: .global).height 60 // let eventWidth = geometry.frame(in: .global).width 61 62 // vertical gray line in the background 63 Rectangle() 64 .fill(Color.gray.opacity(0.25)) 65 .frame(width: 2, height: eventHeight) 66 .offset(x: 40, y: 40) 67 }) 68 69 // MARK: - Actual event view 70 EventMutingContainerView( 71 damus_state: state, 72 event: self.thread.event, 73 muteBox: { event_shown, muted_reason in 74 AnyView( 75 EventMutedBoxView(shown: event_shown, reason: muted_reason) 76 .padding(5) 77 ) 78 } 79 ) { 80 SelectedEventView(damus: state, event: self.thread.event, size: .selected) 81 } 82 .id(self.thread.event.id) 83 84 /* 85 if let top_zap { 86 ZapEvent(damus: state, zap: top_zap, is_top_zap: true) 87 .padding(.horizontal) 88 } 89 */ 90 91 ForEach(sorted_child_events, id: \.id) { child_event in 92 EventMutingContainerView( 93 damus_state: state, 94 event: child_event 95 ) { 96 EventView(damus: state, event: child_event) 97 } 98 .padding(.horizontal) 99 .onTapGesture { 100 thread.set_active_event(child_event, keypair: state.keypair) 101 scroll_to_event(scroller: reader, id: child_event.id, delay: 0.1, animate: false) 102 } 103 104 Divider() 105 .padding([.top], 4) 106 } 107 } 108 }.navigationBarTitle(NSLocalizedString("Thread", comment: "Navigation bar title for note thread.")) 109 .onAppear { 110 thread.subscribe() 111 let anchor: UnitPoint = self.thread.event.known_kind == .longform ? .top : .bottom 112 scroll_to_event(scroller: reader, id: self.thread.event.id, delay: 0.0, animate: false, anchor: anchor) 113 } 114 .onDisappear { 115 thread.unsubscribe() 116 } 117 .onReceive(handle_notify(.switched_timeline)) { notif in 118 dismiss() 119 } 120 } 121 } 122 } 123 124 struct ThreadView_Previews: PreviewProvider { 125 static var previews: some View { 126 let state = test_damus_state 127 let thread = ThreadModel(event: test_note, damus_state: state) 128 ThreadView(state: state, thread: thread) 129 } 130 }