1
0
mirror of git://jb55.com/damus synced 2024-10-06 11:43:21 +00:00

Show other people's zaps

Changelog-Fixed: Fix a bug where zaps on other people's posts weren't showing
This commit is contained in:
William Casarin 2023-02-13 17:50:50 -08:00
parent 98c7bf5afc
commit 49cf56f4c2
11 changed files with 73 additions and 26 deletions

View File

@ -31,6 +31,17 @@ class ActionBarModel: ObservableObject {
self.our_zap = our_zap self.our_zap = our_zap
} }
func update(damus: DamusState, evid: String) {
self.likes = damus.likes.counts[evid] ?? 0
self.boosts = damus.boosts.counts[evid] ?? 0
self.zaps = damus.zaps.event_counts[evid] ?? 0
self.zap_total = damus.zaps.event_totals[evid] ?? 0
self.our_like = damus.likes.our_events[evid]
self.our_boost = damus.boosts.our_events[evid]
self.our_zap = damus.zaps.our_zaps[evid]?.first
self.objectWillChange.send()
}
var is_empty: Bool { var is_empty: Bool {
return likes == 0 && boosts == 0 && zaps == 0 return likes == 0 && boosts == 0 && zaps == 0
} }

View File

@ -142,12 +142,12 @@ class HomeModel: ObservableObject {
return return
} }
if let local_zapper = damus_state.profiles.lookup_zapper(pubkey: damus_state.pubkey) { if let local_zapper = damus_state.profiles.lookup_zapper(pubkey: ptag) {
handle_zap_event_with_zapper(ev, our_pubkey: damus_state.pubkey, zapper: local_zapper) handle_zap_event_with_zapper(ev, our_pubkey: damus_state.pubkey, zapper: local_zapper)
return return
} }
guard let profile = damus_state.profiles.lookup(id: damus_state.pubkey) else { guard let profile = damus_state.profiles.lookup(id: ptag) else {
return return
} }

View File

@ -98,6 +98,9 @@ extension Notification.Name {
static var deleted_account: Notification.Name { static var deleted_account: Notification.Name {
return Notification.Name("deleted_account") return Notification.Name("deleted_account")
} }
static var new_zap: Notification.Name {
return Notification.Name("new_zap")
}
} }
func handle_notify(_ name: Notification.Name) -> NotificationCenter.Publisher { func handle_notify(_ name: Notification.Name) -> NotificationCenter.Publisher {

View File

@ -60,6 +60,8 @@ class Zaps {
event_counts[id] = event_counts[id]! + 1 event_counts[id] = event_counts[id]! + 1
event_totals[id] = event_totals[id]! + zap.invoice.amount event_totals[id] = event_totals[id]! + zap.invoice.amount
notify(.new_zap, zap)
return return
} }
} }

View File

@ -28,13 +28,14 @@ struct EventActionBar: View {
@State var sheet: ActionBarSheet? = nil @State var sheet: ActionBarSheet? = nil
@State var confirm_boost: Bool = false @State var confirm_boost: Bool = false
@State var show_share_sheet: Bool = false @State var show_share_sheet: Bool = false
@StateObject var bar: ActionBarModel
init(damus_state: DamusState, event: NostrEvent, bar: ActionBarModel, test_lnurl: String? = nil) { @ObservedObject var bar: ActionBarModel
init(damus_state: DamusState, event: NostrEvent, bar: ActionBarModel? = nil, test_lnurl: String? = nil) {
self.damus_state = damus_state self.damus_state = damus_state
self.event = event self.event = event
self.test_lnurl = test_lnurl self.test_lnurl = test_lnurl
_bar = StateObject.init(wrappedValue: bar) _bar = ObservedObject(wrappedValue: bar ?? make_actionbar_model(ev: event.id, damus: damus_state))
} }
var lnurl: String? { var lnurl: String? {
@ -110,6 +111,16 @@ struct EventActionBar: View {
} message: { } message: {
Text("Are you sure you want to repost this?", comment: "Alert message to ask if user wants to repost a post.") Text("Are you sure you want to repost this?", comment: "Alert message to ask if user wants to repost a post.")
} }
.onReceive(handle_notify(.new_zap)) { n in
let zap = n.object as! Zap
guard case .note(let note_target) = zap.target else {
return
}
guard note_target.note_id == self.event.id else {
return
}
self.bar.update(damus: self.damus_state, evid: self.event.id)
}
.onReceive(handle_notify(.liked)) { n in .onReceive(handle_notify(.liked)) { n in
let liked = n.object as! Counted let liked = n.object as! Counted
if liked.id != event.id { if liked.id != event.id {

View File

@ -11,8 +11,17 @@ struct EventDetailBar: View {
let state: DamusState let state: DamusState
let target: String let target: String
let target_pk: String let target_pk: String
@ObservedObject var bar: ActionBarModel @ObservedObject var bar: ActionBarModel
init (state: DamusState, target: String, target_pk: String) {
self.state = state
self.target = target
self.target_pk = target_pk
self._bar = ObservedObject(wrappedValue: make_actionbar_model(ev: target, damus: state))
}
var body: some View { var body: some View {
HStack { HStack {
if bar.boosts > 0 { if bar.boosts > 0 {
@ -42,6 +51,6 @@ struct EventDetailBar: View {
struct EventDetailBar_Previews: PreviewProvider { struct EventDetailBar_Previews: PreviewProvider {
static var previews: some View { static var previews: some View {
EventDetailBar(state: test_damus_state(), target: "", target_pk: "", bar: ActionBarModel.empty()) EventDetailBar(state: test_damus_state(), target: "", target_pk: "")
} }
} }

View File

@ -116,7 +116,7 @@ struct ChatView: View {
size: .normal) size: .normal)
if is_active || next_ev == nil || next_ev!.pubkey != event.pubkey { if is_active || next_ev == nil || next_ev!.pubkey != event.pubkey {
let bar = make_actionbar_model(ev: event, damus: damus_state) let bar = make_actionbar_model(ev: event.id, damus: damus_state)
EventActionBar(damus_state: damus_state, event: event, bar: bar) EventActionBar(damus_state: damus_state, event: event, bar: bar)
} }

View File

@ -152,16 +152,14 @@ func format_date(_ created_at: Int64) -> String {
return dateFormatter.string(from: date) return dateFormatter.string(from: date)
} }
func make_actionbar_model(ev: String, damus: DamusState) -> ActionBarModel {
let likes = damus.likes.counts[ev]
func make_actionbar_model(ev: NostrEvent, damus: DamusState) -> ActionBarModel { let boosts = damus.boosts.counts[ev]
let likes = damus.likes.counts[ev.id] let zaps = damus.zaps.event_counts[ev]
let boosts = damus.boosts.counts[ev.id] let zap_total = damus.zaps.event_totals[ev]
let zaps = damus.zaps.event_counts[ev.id] let our_like = damus.likes.our_events[ev]
let zap_total = damus.zaps.event_totals[ev.id] let our_boost = damus.boosts.our_events[ev]
let our_like = damus.likes.our_events[ev.id] let our_zap = damus.zaps.our_zaps[ev]
let our_boost = damus.boosts.our_events[ev.id]
let our_zap = damus.zaps.our_zaps[ev.id]
return ActionBarModel(likes: likes ?? 0, return ActionBarModel(likes: likes ?? 0,
boosts: boosts ?? 0, boosts: boosts ?? 0,

View File

@ -53,8 +53,7 @@ struct BuilderEventView: View {
NostrFilter(ids: [self.event_id], limit: 1), NostrFilter(ids: [self.event_id], limit: 1),
NostrFilter( NostrFilter(
kinds: [NostrKind.zap.rawValue], kinds: [NostrKind.zap.rawValue],
referenced_ids: [self.event_id], referenced_ids: [self.event_id]
limit: 500
) )
]) ])
} }

View File

@ -15,6 +15,14 @@ struct SelectedEventView: View {
event.pubkey event.pubkey
} }
@StateObject var bar: ActionBarModel
init(damus: DamusState, event: NostrEvent) {
self.damus = damus
self.event = event
self._bar = StateObject(wrappedValue: make_actionbar_model(ev: event.id, damus: damus))
}
var body: some View { var body: some View {
HStack(alignment: .top) { HStack(alignment: .top) {
let profile = damus.profiles.lookup(id: pubkey) let profile = damus.profiles.lookup(id: pubkey)
@ -35,19 +43,27 @@ struct SelectedEventView: View {
Divider() Divider()
.padding([.bottom], 4) .padding([.bottom], 4)
let bar = make_actionbar_model(ev: event, damus: damus)
if !bar.is_empty { if !bar.is_empty {
EventDetailBar(state: damus, target: event.id, target_pk: event.pubkey, bar: bar) EventDetailBar(state: damus, target: event.id, target_pk: event.pubkey)
Divider() Divider()
} }
EventActionBar(damus_state: damus, event: event, bar: bar) EventActionBar(damus_state: damus, event: event)
.padding([.top], 4) .padding([.top], 4)
Divider() Divider()
.padding([.top], 4) .padding([.top], 4)
} }
.onReceive(handle_notify(.new_zap)) { n in
let zap = n.object as! Zap
guard case .note(let note_target) = zap.target else {
return
}
guard note_target.note_id == self.event.id else {
return
}
self.bar.update(damus: self.damus, evid: self.event.id)
}
.padding([.leading], 2) .padding([.leading], 2)
.event_context_menu(event, keypair: damus.keypair, target_pubkey: event.pubkey) .event_context_menu(event, keypair: damus.keypair, target_pubkey: event.pubkey)
} }

View File

@ -48,9 +48,7 @@ struct TextEvent: View {
if has_action_bar { if has_action_bar {
Rectangle().frame(height: 2).opacity(0) Rectangle().frame(height: 2).opacity(0)
let bar = make_actionbar_model(ev: event, damus: damus) EventActionBar(damus_state: damus, event: event)
EventActionBar(damus_state: damus, event: event, bar: bar)
.padding([.top], 4) .padding([.top], 4)
} }
} }