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 }