damus

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

EventShell.swift (4475B)


      1 //
      2 //  EventShell.swift
      3 //  damus
      4 //
      5 //  Created by William Casarin on 2023-06-01.
      6 //
      7 
      8 import SwiftUI
      9 
     10 @MainActor
     11 struct EventShell<Content: View>: View {
     12     let state: DamusState
     13     let event: NostrEvent
     14     let pubkey: Pubkey
     15     let options: EventViewOptions
     16     let content: Content
     17     
     18     init(state: DamusState, event: NostrEvent, pubkey: Pubkey, options: EventViewOptions, @ViewBuilder content: () -> Content) {
     19         self.state = state
     20         self.event = event
     21         self.options = options
     22         self.pubkey = pubkey
     23         self.content = content()
     24     }
     25 
     26     init(state: DamusState, event: NostrEvent, options: EventViewOptions, @ViewBuilder content: () -> Content) {
     27         self.state = state
     28         self.event = event
     29         self.options = options
     30         self.pubkey = event.pubkey
     31         self.content = content()
     32     }
     33     
     34     var has_action_bar: Bool {
     35         !options.contains(.no_action_bar)
     36     }
     37     
     38     func get_mention() -> Mention<NoteId>? {
     39         if self.options.contains(.nested) || self.options.contains(.no_mentions) {
     40             return nil
     41         }
     42         
     43         return first_eref_mention(ev: event, keypair: state.keypair)
     44     }
     45     
     46     var ActionBar: some View {
     47         return EventActionBar(damus_state: state, event: event)
     48             .padding([.top], 4)
     49     }
     50 
     51     func Pfp(is_anon: Bool) -> some View {
     52         return MaybeAnonPfpView(state: state, is_anon: is_anon, pubkey: pubkey, size: options.contains(.small_pfp) ? eventview_pfp_size(.small) : PFP_SIZE )
     53     }
     54 
     55     var Threaded: some View {
     56         HStack(alignment: .top) {
     57         
     58             let is_anon = event_is_anonymous(ev: event)
     59             VStack {
     60                 Pfp(is_anon: is_anon)
     61                 
     62                 Spacer()
     63             }
     64 
     65             VStack(alignment: .leading) {
     66                 EventTop(state: state, event: event, pubkey: pubkey, is_anon: is_anon)
     67 
     68                 UserStatusView(status: state.profiles.profile_data(pubkey).status, show_general: state.settings.show_general_statuses, show_music: state.settings.show_music_statuses)
     69 
     70                 if !options.contains(.no_replying_to) {
     71                     ReplyPart(events: state.events, event: event, keypair: state.keypair, ndb: state.ndb)
     72                 }
     73                 
     74                 content
     75 
     76                 if let mention = get_mention() {
     77                     MentionView(damus_state: state, mention: mention)
     78                 }
     79                 
     80                 if has_action_bar {
     81                     ActionBar
     82                 }
     83             }
     84             .padding([.leading], 2)
     85         }
     86     }
     87 
     88     var Wide: some View {
     89         VStack(alignment: .leading) {
     90             let is_anon = event_is_anonymous(ev: event)
     91             
     92             HStack(spacing: 10) {
     93                 Pfp(is_anon: is_anon)
     94 
     95                 VStack(alignment: .leading, spacing: 2) {
     96                     EventTop(state: state, event: event, pubkey: pubkey, is_anon: is_anon)
     97                     UserStatusView(status: state.profiles.profile_data(pubkey).status, show_general: state.settings.show_general_statuses, show_music: state.settings.show_music_statuses)
     98                     ReplyPart(events: state.events, event: event, keypair: state.keypair, ndb: state.ndb)
     99                     ProxyView(event: event)
    100                 }
    101             }
    102             .padding(.horizontal)
    103 
    104             content
    105             
    106             if !options.contains(.no_mentions), let mention = get_mention() {
    107                 MentionView(damus_state: state, mention: mention)
    108                     .padding(.horizontal)
    109             }
    110             
    111             if has_action_bar {
    112                 ActionBar
    113                     .padding(.horizontal)
    114             }
    115         }
    116     }
    117 
    118     var body: some View {
    119         Group {
    120             if options.contains(.wide) {
    121                 Wide
    122             } else {
    123                 Threaded
    124             }
    125         }
    126         .contentShape(Rectangle())
    127         .id(event.id)
    128         .padding([.bottom], 2)
    129     }
    130 }
    131 
    132 struct EventShell_Previews: PreviewProvider {
    133 
    134     static var previews: some View {
    135         VStack {
    136             EventShell(state: test_damus_state, event: test_note, options: [.no_action_bar]) {
    137                 Text(verbatim: "Hello")
    138             }
    139 
    140             EventShell(state: test_damus_state, event: test_note, options: [.no_action_bar, .wide]) {
    141                 Text(verbatim: "Hello")
    142             }
    143         }
    144         .frame(height: 300)
    145     }
    146 }