damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

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 }