Initial actionbar model refactor
This commit is contained in:
@@ -32,7 +32,7 @@ struct ZapButton: View {
|
|||||||
let lnurl: String
|
let lnurl: String
|
||||||
|
|
||||||
@ObservedObject var zaps: ZapsDataModel
|
@ObservedObject var zaps: ZapsDataModel
|
||||||
@StateObject var button: ZapButtonModel = ZapButtonModel()
|
@ObservedObject var button: ZapButtonModel
|
||||||
|
|
||||||
var our_zap: Zapping? {
|
var our_zap: Zapping? {
|
||||||
zaps.zaps.first(where: { z in z.request.ev.pubkey == damus_state.pubkey })
|
zaps.zaps.first(where: { z in z.request.ev.pubkey == damus_state.pubkey })
|
||||||
@@ -178,7 +178,7 @@ struct ZapButton_Previews: PreviewProvider {
|
|||||||
let pending_zap = PendingZap(amount_msat: 1000, target: ZapTarget.note(id: "noteid", author: "author"), request: .normal(test_zap_request), type: .pub, state: .external(.init(state: .fetching_invoice)))
|
let pending_zap = PendingZap(amount_msat: 1000, target: ZapTarget.note(id: "noteid", author: "author"), request: .normal(test_zap_request), type: .pub, state: .external(.init(state: .fetching_invoice)))
|
||||||
let zaps = ZapsDataModel([.pending(pending_zap)])
|
let zaps = ZapsDataModel([.pending(pending_zap)])
|
||||||
|
|
||||||
ZapButton(damus_state: test_damus_state(), target: ZapTarget.note(id: test_event.id, author: test_event.pubkey), lnurl: "lnurl", zaps: zaps)
|
ZapButton(damus_state: test_damus_state(), target: ZapTarget.note(id: test_event.id, author: test_event.pubkey), lnurl: "lnurl", zaps: zaps, button: ZapButtonModel())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,15 +14,15 @@ enum Zapped {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class ActionBarModel: ObservableObject {
|
class ActionBarModel: ObservableObject {
|
||||||
@Published var our_like: NostrEvent?
|
private(set) var our_like: NostrEvent?
|
||||||
@Published var our_boost: NostrEvent?
|
private(set) var our_boost: NostrEvent?
|
||||||
@Published var our_reply: NostrEvent?
|
private(set) var our_reply: NostrEvent?
|
||||||
@Published var our_zap: Zapping?
|
private(set) var our_zap: Zapping?
|
||||||
@Published var likes: Int
|
private(set) var likes: Int
|
||||||
@Published var boosts: Int
|
private(set) var boosts: Int
|
||||||
@Published private(set) var zaps: Int
|
private(set) var zaps: Int
|
||||||
@Published var zap_total: Int64
|
private(set) var zap_total: Int64
|
||||||
@Published var replies: Int
|
private(set) var replies: Int
|
||||||
|
|
||||||
static func empty() -> ActionBarModel {
|
static func empty() -> ActionBarModel {
|
||||||
return ActionBarModel(likes: 0, boosts: 0, zaps: 0, zap_total: 0, replies: 0, our_like: nil, our_boost: nil, our_zap: nil, our_reply: nil)
|
return ActionBarModel(likes: 0, boosts: 0, zaps: 0, zap_total: 0, replies: 0, our_like: nil, our_boost: nil, our_zap: nil, our_reply: nil)
|
||||||
@@ -65,6 +65,20 @@ class ActionBarModel: ObservableObject {
|
|||||||
self.objectWillChange.send()
|
self.objectWillChange.send()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func set_likes(likes: Int) {
|
||||||
|
guard likes != self.likes else { return }
|
||||||
|
|
||||||
|
self.likes = likes
|
||||||
|
self.objectWillChange.send()
|
||||||
|
}
|
||||||
|
|
||||||
|
func set_our_like(our_like: NostrEvent) {
|
||||||
|
guard self.our_like == nil else { return }
|
||||||
|
|
||||||
|
self.our_like = our_like
|
||||||
|
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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -269,7 +269,7 @@ class HomeModel {
|
|||||||
case .success(let n):
|
case .success(let n):
|
||||||
let boosted = Counted(event: ev, id: e, total: n)
|
let boosted = Counted(event: ev, id: e, total: n)
|
||||||
notify(.boosted, boosted)
|
notify(.boosted, boosted)
|
||||||
notify(.update_stats, e)
|
self.damus_state.events.get_cache_data(ev.id).bar_model.update(damus: self.damus_state, evid: ev.id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -113,6 +113,8 @@ class EventData {
|
|||||||
var relative_time: RelativeTimeModel = RelativeTimeModel()
|
var relative_time: RelativeTimeModel = RelativeTimeModel()
|
||||||
var validated: ValidationResult
|
var validated: ValidationResult
|
||||||
var media_metadata_model: MediaMetaModel
|
var media_metadata_model: MediaMetaModel
|
||||||
|
var bar_model: ActionBarModel
|
||||||
|
var zap_button_model: ZapButtonModel
|
||||||
|
|
||||||
var translations: TranslateStatus {
|
var translations: TranslateStatus {
|
||||||
return translations_model.state
|
return translations_model.state
|
||||||
@@ -133,6 +135,8 @@ class EventData {
|
|||||||
self.validated = .unknown
|
self.validated = .unknown
|
||||||
self.media_metadata_model = MediaMetaModel()
|
self.media_metadata_model = MediaMetaModel()
|
||||||
self.preview_model = .init(state: .not_loaded)
|
self.preview_model = .init(state: .not_loaded)
|
||||||
|
self.bar_model = ActionBarModel()
|
||||||
|
self.zap_button_model = ZapButtonModel()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,12 +21,6 @@ struct EventActionBar: View {
|
|||||||
|
|
||||||
@ObservedObject var bar: ActionBarModel
|
@ObservedObject var bar: ActionBarModel
|
||||||
|
|
||||||
init(damus_state: DamusState, event: NostrEvent, bar: ActionBarModel? = nil) {
|
|
||||||
self.damus_state = damus_state
|
|
||||||
self.event = event
|
|
||||||
_bar = ObservedObject(wrappedValue: bar ?? make_actionbar_model(ev: event.id, damus: damus_state))
|
|
||||||
}
|
|
||||||
|
|
||||||
var lnurl: String? {
|
var lnurl: String? {
|
||||||
damus_state.profiles.lookup(id: event.pubkey)?.lnurl
|
damus_state.profiles.lookup(id: event.pubkey)?.lnurl
|
||||||
}
|
}
|
||||||
@@ -88,7 +82,7 @@ struct EventActionBar: View {
|
|||||||
|
|
||||||
if let lnurl = self.lnurl {
|
if let lnurl = self.lnurl {
|
||||||
Spacer()
|
Spacer()
|
||||||
ZapButton(damus_state: damus_state, target: ZapTarget.note(id: event.id, author: event.pubkey), lnurl: lnurl, zaps: self.damus_state.events.get_cache_data(self.event.id).zaps_model)
|
ZapButton(damus_state: damus_state, target: ZapTarget.note(id: event.id, author: event.pubkey), lnurl: lnurl, zaps: self.damus_state.events.get_cache_data(self.event.id).zaps_model, button: damus_state.events.get_cache_data(event.id).zap_button_model)
|
||||||
}
|
}
|
||||||
|
|
||||||
Spacer()
|
Spacer()
|
||||||
@@ -136,9 +130,9 @@ struct EventActionBar: View {
|
|||||||
if liked.id != event.id {
|
if liked.id != event.id {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
self.bar.likes = liked.total
|
self.bar.set_likes(likes: liked.total)
|
||||||
if liked.event.pubkey == damus_state.keypair.pubkey {
|
if liked.event.pubkey == damus_state.keypair.pubkey {
|
||||||
self.bar.our_like = liked.event
|
self.bar.set_our_like(our_like: liked.event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -150,7 +144,7 @@ struct EventActionBar: View {
|
|||||||
|
|
||||||
let like_ev = make_like_event(pubkey: damus_state.pubkey, privkey: privkey, liked: event)
|
let like_ev = make_like_event(pubkey: damus_state.pubkey, privkey: privkey, liked: event)
|
||||||
|
|
||||||
self.bar.our_like = like_ev
|
self.bar.set_our_like(our_like: like_ev)
|
||||||
|
|
||||||
generator.impactOccurred()
|
generator.impactOccurred()
|
||||||
|
|
||||||
|
|||||||
@@ -16,15 +16,6 @@ struct SelectedEventView: View {
|
|||||||
event.pubkey
|
event.pubkey
|
||||||
}
|
}
|
||||||
|
|
||||||
@StateObject var bar: ActionBarModel
|
|
||||||
|
|
||||||
init(damus: DamusState, event: NostrEvent, size: EventViewKind) {
|
|
||||||
self.damus = damus
|
|
||||||
self.event = event
|
|
||||||
self.size = size
|
|
||||||
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)
|
||||||
@@ -63,24 +54,20 @@ struct SelectedEventView: View {
|
|||||||
Divider()
|
Divider()
|
||||||
.padding([.bottom], 4)
|
.padding([.bottom], 4)
|
||||||
|
|
||||||
|
let bar = damus.events.get_cache_data(event.id).bar_model
|
||||||
if !bar.is_empty {
|
if !bar.is_empty {
|
||||||
EventDetailBar(state: damus, target: event.id, target_pk: event.pubkey)
|
EventDetailBar(state: damus, target: event.id, target_pk: event.pubkey)
|
||||||
.padding(.horizontal)
|
.padding(.horizontal)
|
||||||
Divider()
|
Divider()
|
||||||
}
|
}
|
||||||
|
|
||||||
EventActionBar(damus_state: damus, event: event)
|
EventActionBar(damus_state: damus, event: event, bar: bar)
|
||||||
.padding([.top], 4)
|
.padding([.top], 4)
|
||||||
.padding(.horizontal)
|
.padding(.horizontal)
|
||||||
|
|
||||||
Divider()
|
Divider()
|
||||||
.padding([.top], 4)
|
.padding([.top], 4)
|
||||||
}
|
}
|
||||||
.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)
|
|
||||||
}
|
|
||||||
.compositingGroup()
|
.compositingGroup()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -153,7 +153,7 @@ struct TextEvent: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var ActionBar: some View {
|
var ActionBar: some View {
|
||||||
return EventActionBar(damus_state: damus, event: event)
|
return EventActionBar(damus_state: damus, event: event, bar: get_actionbar(state: damus, evid: event.id))
|
||||||
.padding([.top], 4)
|
.padding([.top], 4)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -229,3 +229,7 @@ struct TextEvent_Previews: PreviewProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func get_actionbar(state: DamusState, evid: String) -> ActionBarModel {
|
||||||
|
return state.events.get_cache_data(evid).bar_model
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user