mirror of https://github.com/lukechilds/damus.git
Browse Source
Changelog-Added: Added Reactions Viewtranslations_damus-localizations-en-us-xcloc-localized-contents-en-us-xliff--master_es_419
12 changed files with 267 additions and 38 deletions
@ -0,0 +1,75 @@ |
|||
// |
|||
// LikesModel.swift |
|||
// damus |
|||
// |
|||
// Created by William Casarin on 2023-01-11. |
|||
// |
|||
|
|||
import Foundation |
|||
|
|||
|
|||
class ReactionsModel: ObservableObject { |
|||
let state: DamusState |
|||
let target: String |
|||
let sub_id: String |
|||
@Published var reactions: [NostrEvent] |
|||
|
|||
init (state: DamusState, target: String) { |
|||
self.state = state |
|||
self.target = target |
|||
self.sub_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: UUID().description, relay_id: relay_id, events: reactions, damus_state: state) |
|||
break |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,39 @@ |
|||
// |
|||
// EventDetailBar.swift |
|||
// damus |
|||
// |
|||
// Created by William Casarin on 2023-01-08. |
|||
// |
|||
|
|||
import SwiftUI |
|||
|
|||
struct EventDetailBar: View { |
|||
let state: DamusState |
|||
let target: String |
|||
@StateObject var bar: ActionBarModel |
|||
|
|||
var body: some View { |
|||
HStack { |
|||
Text("\(bar.boosts)") |
|||
.font(.body.bold()) |
|||
Text("Reposts") |
|||
|
|||
NavigationLink(destination: ReactionsView(damus_state: state, model: ReactionsModel(state: state, target: target))) { |
|||
Text("\(bar.likes)") |
|||
.font(.body.bold()) |
|||
Text("Reactions") |
|||
} |
|||
.buttonStyle(PlainButtonStyle()) |
|||
|
|||
Text("\(bar.tips)") |
|||
.font(.body.bold()) |
|||
Text("Tips") |
|||
} |
|||
} |
|||
} |
|||
|
|||
struct EventDetailBar_Previews: PreviewProvider { |
|||
static var previews: some View { |
|||
EventDetailBar(state: test_damus_state(), target: "", bar: ActionBarModel.empty()) |
|||
} |
|||
} |
@ -0,0 +1,36 @@ |
|||
// |
|||
// ReactionView.swift |
|||
// damus |
|||
// |
|||
// Created by William Casarin on 2023-01-11. |
|||
// |
|||
|
|||
import SwiftUI |
|||
|
|||
struct ReactionView: View { |
|||
let damus_state: DamusState |
|||
let reaction: NostrEvent |
|||
|
|||
var content: String { |
|||
if reaction.content == "" || reaction.content == "+" { |
|||
return "❤️" |
|||
} |
|||
return reaction.content |
|||
} |
|||
|
|||
var body: some View { |
|||
HStack { |
|||
Text(content) |
|||
.font(Font.headline) |
|||
.frame(width: 50, height: 50) |
|||
|
|||
FollowUserView(target: .pubkey(reaction.pubkey), damus_state: damus_state) |
|||
} |
|||
} |
|||
} |
|||
|
|||
struct ReactionView_Previews: PreviewProvider { |
|||
static var previews: some View { |
|||
ReactionView(damus_state: test_damus_state(), reaction: NostrEvent(id: "", content: "🤙🏼", pubkey: "")) |
|||
} |
|||
} |
@ -0,0 +1,38 @@ |
|||
// |
|||
// ReactionsView.swift |
|||
// damus |
|||
// |
|||
// Created by William Casarin on 2023-01-11. |
|||
// |
|||
|
|||
import SwiftUI |
|||
|
|||
struct ReactionsView: View { |
|||
let damus_state: DamusState |
|||
@StateObject var model: ReactionsModel |
|||
|
|||
var body: some View { |
|||
ScrollView { |
|||
LazyVStack { |
|||
ForEach(model.reactions, id: \.id) { ev in |
|||
ReactionView(damus_state: damus_state, reaction: ev) |
|||
} |
|||
} |
|||
.padding() |
|||
} |
|||
.navigationBarTitle("Reactions") |
|||
.onAppear { |
|||
model.subscribe() |
|||
} |
|||
.onDisappear { |
|||
model.unsubscribe() |
|||
} |
|||
} |
|||
} |
|||
|
|||
struct ReactionsView_Previews: PreviewProvider { |
|||
static var previews: some View { |
|||
let state = test_damus_state() |
|||
ReactionsView(damus_state: state, model: ReactionsModel(state: state, target: "pubkey")) |
|||
} |
|||
} |
Loading…
Reference in new issue