refactor similar RepostsModel and ReactionsModel into one parent class
Closes: #650
This commit is contained in:
committed by
William Casarin
parent
0bdec912f8
commit
ff1815cce0
@@ -9,9 +9,63 @@ import Foundation
|
|||||||
|
|
||||||
|
|
||||||
class EventsModel: ObservableObject {
|
class EventsModel: ObservableObject {
|
||||||
var has_event: Set<String> = Set()
|
let state: DamusState
|
||||||
|
let target: String
|
||||||
|
let kind: NostrKind
|
||||||
|
let sub_id = UUID().uuidString
|
||||||
|
let profiles_id = UUID().uuidString
|
||||||
|
|
||||||
@Published var events: [NostrEvent] = []
|
@Published var events: [NostrEvent] = []
|
||||||
|
|
||||||
init() {
|
init(state: DamusState, target: String, kind: NostrKind) {
|
||||||
|
self.state = state
|
||||||
|
self.target = target
|
||||||
|
self.kind = kind
|
||||||
|
}
|
||||||
|
|
||||||
|
private func get_filter() -> NostrFilter {
|
||||||
|
var filter = NostrFilter.filter_kinds([kind.rawValue])
|
||||||
|
filter.referenced_ids = [target]
|
||||||
|
filter.limit = 500
|
||||||
|
return filter
|
||||||
|
}
|
||||||
|
|
||||||
|
func subscribe() {
|
||||||
|
state.pool.subscribe(sub_id: sub_id,
|
||||||
|
filters: [get_filter()],
|
||||||
|
handler: handle_nostr_event)
|
||||||
|
}
|
||||||
|
|
||||||
|
func unsubscribe() {
|
||||||
|
state.pool.unsubscribe(sub_id: sub_id)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func handle_event(relay_id: String, ev: NostrEvent) {
|
||||||
|
guard ev.kind == kind.rawValue else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
guard last_etag(tags: ev.tags) == target else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if insert_uniq_sorted_event(events: &self.events, new_ev: ev, cmp: { a, b in a.created_at < b.created_at } ) {
|
||||||
|
objectWillChange.send()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func handle_nostr_event(relay_id: String, ev: NostrConnectionEvent) {
|
||||||
|
guard case .nostr_event(let nev) = ev else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
switch nev {
|
||||||
|
case .event(_, let ev):
|
||||||
|
handle_event(relay_id: relay_id, ev: ev)
|
||||||
|
case .notice(_):
|
||||||
|
break
|
||||||
|
case .eose(_):
|
||||||
|
load_profiles(profiles_subid: profiles_id, relay_id: relay_id, events: events, damus_state: state)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,71 +8,9 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
|
|
||||||
class ReactionsModel: ObservableObject {
|
final class ReactionsModel: EventsModel {
|
||||||
let state: DamusState
|
|
||||||
let target: String
|
|
||||||
let sub_id: String
|
|
||||||
let profiles_id: String
|
|
||||||
|
|
||||||
@Published var reactions: [NostrEvent]
|
init(state: DamusState, target: String) {
|
||||||
|
super.init(state: state, target: target, kind: .like)
|
||||||
init (state: DamusState, target: String) {
|
|
||||||
self.state = state
|
|
||||||
self.target = target
|
|
||||||
self.sub_id = UUID().description
|
|
||||||
self.profiles_id = UUID().description
|
|
||||||
self.reactions = []
|
|
||||||
}
|
|
||||||
|
|
||||||
func get_filter() -> NostrFilter {
|
|
||||||
var filter = NostrFilter.filter_kinds([7])
|
|
||||||
filter.referenced_ids = [target]
|
|
||||||
filter.limit = 500
|
|
||||||
return filter
|
|
||||||
}
|
|
||||||
|
|
||||||
func subscribe() {
|
|
||||||
let filter = get_filter()
|
|
||||||
let filters = [filter]
|
|
||||||
self.state.pool.subscribe(sub_id: sub_id, filters: filters, handler: handle_nostr_event)
|
|
||||||
}
|
|
||||||
|
|
||||||
func unsubscribe() {
|
|
||||||
self.state.pool.unsubscribe(sub_id: sub_id)
|
|
||||||
}
|
|
||||||
|
|
||||||
func handle_event(relay_id: String, ev: NostrEvent) {
|
|
||||||
guard ev.kind == 7 else {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
guard let reacted_to = last_etag(tags: ev.tags) else {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
guard reacted_to == self.target else {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if insert_uniq_sorted_event(events: &self.reactions, new_ev: ev, cmp: { a, b in a.created_at < b.created_at } ) {
|
|
||||||
objectWillChange.send()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func handle_nostr_event(relay_id: String, ev: NostrConnectionEvent) {
|
|
||||||
guard case .nostr_event(let nev) = ev else {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
switch nev {
|
|
||||||
case .event(_, let ev):
|
|
||||||
handle_event(relay_id: relay_id, ev: ev)
|
|
||||||
|
|
||||||
case .notice(_):
|
|
||||||
break
|
|
||||||
case .eose(_):
|
|
||||||
load_profiles(profiles_subid: profiles_id, relay_id: relay_id, events: reactions, damus_state: state)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,71 +7,9 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
class RepostsModel: ObservableObject {
|
final class RepostsModel: EventsModel {
|
||||||
let state: DamusState
|
|
||||||
let target: String
|
init(state: DamusState, target: String) {
|
||||||
let sub_id: String
|
super.init(state: state, target: target, kind: .boost)
|
||||||
let profiles_id: String
|
|
||||||
|
|
||||||
@Published var reposts: [NostrEvent]
|
|
||||||
|
|
||||||
init (state: DamusState, target: String) {
|
|
||||||
self.state = state
|
|
||||||
self.target = target
|
|
||||||
self.sub_id = UUID().description
|
|
||||||
self.profiles_id = UUID().description
|
|
||||||
self.reposts = []
|
|
||||||
}
|
|
||||||
|
|
||||||
func get_filter() -> NostrFilter {
|
|
||||||
var filter = NostrFilter.filter_kinds([NostrKind.boost.rawValue])
|
|
||||||
filter.referenced_ids = [target]
|
|
||||||
filter.limit = 500
|
|
||||||
return filter
|
|
||||||
}
|
|
||||||
|
|
||||||
func subscribe() {
|
|
||||||
let filter = get_filter()
|
|
||||||
let filters = [filter]
|
|
||||||
self.state.pool.subscribe(sub_id: sub_id, filters: filters, handler: handle_nostr_event)
|
|
||||||
}
|
|
||||||
|
|
||||||
func unsubscribe() {
|
|
||||||
self.state.pool.unsubscribe(sub_id: sub_id)
|
|
||||||
}
|
|
||||||
|
|
||||||
func handle_event(relay_id: String, ev: NostrEvent) {
|
|
||||||
guard ev.kind == NostrKind.boost.rawValue else {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
guard let reposted_event = last_etag(tags: ev.tags) else {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
guard reposted_event == self.target else {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if insert_uniq_sorted_event(events: &self.reposts, new_ev: ev, cmp: { a, b in a.created_at < b.created_at } ) {
|
|
||||||
objectWillChange.send()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func handle_nostr_event(relay_id: String, ev: NostrConnectionEvent) {
|
|
||||||
guard case .nostr_event(let nev) = ev else {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
switch nev {
|
|
||||||
case .event(_, let ev):
|
|
||||||
handle_event(relay_id: relay_id, ev: ev)
|
|
||||||
|
|
||||||
case .notice(_):
|
|
||||||
break
|
|
||||||
case .eose(_):
|
|
||||||
load_profiles(profiles_subid: profiles_id, relay_id: relay_id, events: reposts, damus_state: state)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ struct ReactionsView: View {
|
|||||||
var body: some View {
|
var body: some View {
|
||||||
ScrollView {
|
ScrollView {
|
||||||
LazyVStack {
|
LazyVStack {
|
||||||
ForEach(model.reactions, id: \.id) { ev in
|
ForEach(model.events, id: \.id) { ev in
|
||||||
ReactionView(damus_state: damus_state, reaction: ev)
|
ReactionView(damus_state: damus_state, reaction: ev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ struct RepostsView: View {
|
|||||||
var body: some View {
|
var body: some View {
|
||||||
ScrollView {
|
ScrollView {
|
||||||
LazyVStack {
|
LazyVStack {
|
||||||
ForEach(model.reposts, id: \.id) { ev in
|
ForEach(model.events, id: \.id) { ev in
|
||||||
RepostView(damus_state: damus_state, repost: ev)
|
RepostView(damus_state: damus_state, repost: ev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user