Compare commits

...

3 Commits

Author SHA1 Message Date
d10e5a87de Add replies count to selected event action bar 2023-02-15 09:30:54 -05:00
William Casarin
59211bb4fd Ensure stats get updated in realtime on action bars
Changelog-Fixed: Ensure stats get updated in realtime on action bars
2023-02-14 10:05:59 -08:00
William Casarin
6d634763c5 Fix repost counters
Changelog-Fixed: Fix reposts not getting counted properly
2023-02-14 10:05:19 -08:00
7 changed files with 44 additions and 35 deletions

View File

@@ -230,6 +230,7 @@ class HomeModel: ObservableObject {
case .success(let n):
let boosted = Counted(event: ev, id: e, total: n)
notify(.boosted, boosted)
notify(.update_stats, e)
}
}
@@ -247,6 +248,7 @@ class HomeModel: ObservableObject {
case .success(let n):
let liked = Counted(event: ev, id: e.ref_id, total: n)
notify(.liked, liked)
notify(.update_stats, e.ref_id)
}
}
@@ -287,7 +289,7 @@ class HomeModel: ObservableObject {
switch ev {
case .event(let sub_id, let ev):
// globally handle likes
let always_process = sub_id == notifications_subid || sub_id == contacts_subid || sub_id == home_subid || sub_id == dms_subid || sub_id == init_subid || ev.known_kind == .like || ev.known_kind == .zap || ev.known_kind == .contacts || ev.known_kind == .metadata
let always_process = sub_id == notifications_subid || sub_id == contacts_subid || sub_id == home_subid || sub_id == dms_subid || sub_id == init_subid || ev.known_kind == .like || ev.known_kind == .boost || ev.known_kind == .zap || ev.known_kind == .contacts || ev.known_kind == .metadata
if !always_process {
// TODO: other views like threads might have their own sub ids, so ignore those events... or should we?
return

View File

@@ -98,8 +98,8 @@ extension Notification.Name {
static var deleted_account: Notification.Name {
return Notification.Name("deleted_account")
}
static var new_zap: Notification.Name {
return Notification.Name("new_zap")
static var update_stats: Notification.Name {
return Notification.Name("update_stats")
}
}

View File

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

View File

@@ -23,19 +23,21 @@ struct EventActionBar: View {
let event: NostrEvent
let test_lnurl: String?
let generator = UIImpactFeedbackGenerator(style: .medium)
let thread: ThreadV2?
// just used for previews
@State var sheet: ActionBarSheet? = nil
@State var confirm_boost: Bool = false
@State var show_share_sheet: Bool = false
@ObservedObject var bar: ActionBarModel
init(damus_state: DamusState, event: NostrEvent, bar: ActionBarModel? = nil, test_lnurl: String? = nil) {
init(damus_state: DamusState, event: NostrEvent, bar: ActionBarModel? = nil, test_lnurl: String? = nil, thread: ThreadV2? = nil) {
self.damus_state = damus_state
self.event = event
self.test_lnurl = test_lnurl
_bar = ObservedObject(wrappedValue: bar ?? make_actionbar_model(ev: event.id, damus: damus_state))
self.thread = thread
}
var lnurl: String? {
@@ -45,10 +47,18 @@ struct EventActionBar: View {
var body: some View {
HStack {
if damus_state.keypair.privkey != nil {
EventActionButton(img: "bubble.left", col: nil) {
let self_replied = (thread != nil && thread!.childEvents.first { $0.pubkey == damus_state.pubkey } != nil)
EventActionButton(img: "bubble.left", col: self_replied ? Color.blue : nil) {
notify(.reply, event)
}
.accessibilityLabel(NSLocalizedString("Reply", comment: "Accessibility label for reply button"))
if thread != nil && !thread!.childEvents.isEmpty {
Text("\(thread!.childEvents.count)")
.offset(x: -10)
.font(.footnote.weight(.medium))
.foregroundColor(self_replied ? Color.blue : Color.gray)
}
}
Spacer()
ZStack {
@@ -111,15 +121,10 @@ struct EventActionBar: View {
} message: {
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(.update_stats)) { n in
let target = n.object as! String
guard target == self.event.id else { return }
self.bar.update(damus: self.damus_state, evid: target)
}
.onReceive(handle_notify(.liked)) { n in
let liked = n.object as! Counted

View File

@@ -11,6 +11,7 @@ struct MutedEventView: View {
let damus_state: DamusState
let event: NostrEvent
let scroller: ScrollViewProxy?
let thread: ThreadV2?
let selected: Bool
@Binding var nav_target: String?
@@ -18,7 +19,7 @@ struct MutedEventView: View {
@State var shown: Bool
@Environment(\.colorScheme) var colorScheme
init(damus_state: DamusState, event: NostrEvent, scroller: ScrollViewProxy?, nav_target: Binding<String?>, navigating: Binding<Bool>, selected: Bool) {
init(damus_state: DamusState, event: NostrEvent, scroller: ScrollViewProxy?, nav_target: Binding<String?>, navigating: Binding<Bool>, selected: Bool, thread: ThreadV2?) {
self.damus_state = damus_state
self.event = event
self.scroller = scroller
@@ -26,6 +27,7 @@ struct MutedEventView: View {
self._nav_target = nav_target
self._navigating = navigating
self._shown = State(initialValue: should_show_event(contacts: damus_state.contacts, ev: event))
self.thread = thread
}
var should_mute: Bool {
@@ -55,7 +57,7 @@ struct MutedEventView: View {
var Event: some View {
Group {
if selected {
SelectedEventView(damus: damus_state, event: event)
SelectedEventView(damus: damus_state, event: event, thread: thread)
} else {
EventView(damus: damus_state, event: event, has_action_bar: true)
.onTapGesture {
@@ -106,7 +108,7 @@ struct MutedEventView_Previews: PreviewProvider {
static var previews: some View {
MutedEventView(damus_state: test_damus_state(), event: test_event, scroller: nil, nav_target: $nav_target, navigating: $navigating, selected: false)
MutedEventView(damus_state: test_damus_state(), event: test_event, scroller: nil, nav_target: $nav_target, navigating: $navigating, selected: false, thread: nil)
.frame(width: .infinity, height: 50)
}
}

View File

@@ -10,6 +10,7 @@ import SwiftUI
struct SelectedEventView: View {
let damus: DamusState
let event: NostrEvent
let thread: ThreadV2?
var pubkey: String {
event.pubkey
@@ -17,10 +18,11 @@ struct SelectedEventView: View {
@StateObject var bar: ActionBarModel
init(damus: DamusState, event: NostrEvent) {
init(damus: DamusState, event: NostrEvent, thread: ThreadV2?) {
self.damus = damus
self.event = event
self._bar = StateObject(wrappedValue: make_actionbar_model(ev: event.id, damus: damus))
self.thread = thread
}
var body: some View {
@@ -47,22 +49,17 @@ struct SelectedEventView: View {
EventDetailBar(state: damus, target: event.id, target_pk: event.pubkey)
Divider()
}
EventActionBar(damus_state: damus, event: event)
EventActionBar(damus_state: damus, event: event, thread: thread)
.padding([.top], 4)
Divider()
.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)
.onReceive(handle_notify(.update_stats)) { n in
let target = n.object as! String
guard target == self.event.id else { return }
self.bar.update(damus: self.damus, evid: target)
}
.padding([.leading], 2)
.event_context_menu(event, keypair: damus.keypair, target_pubkey: event.pubkey)
@@ -72,7 +69,7 @@ struct SelectedEventView: View {
struct SelectedEventView_Previews: PreviewProvider {
static var previews: some View {
SelectedEventView(damus: test_damus_state(), event: test_event)
SelectedEventView(damus: test_damus_state(), event: test_event, thread: nil)
.padding()
}
}

View File

@@ -263,7 +263,8 @@ struct ThreadV2View: View {
scroller: reader,
nav_target: $nav_target,
navigating: $navigating,
selected: false
selected: false,
thread: nil
)
}
}.background(GeometryReader { geometry in
@@ -285,7 +286,8 @@ struct ThreadV2View: View {
scroller: reader,
nav_target: $nav_target,
navigating: $navigating,
selected: true
selected: true,
thread: thread
).id("main")
// MARK: - Responses of the actual event view
@@ -296,7 +298,8 @@ struct ThreadV2View: View {
scroller: reader,
nav_target: $nav_target,
navigating: $navigating,
selected: false
selected: false,
thread: nil
)
}
}.padding()