User relays view

Changelog-Added: Added relay list to user profiles
This commit is contained in:
William Casarin
2022-12-29 16:55:36 -08:00
parent 9e6e22fa2d
commit 1b21a7a7b7
5 changed files with 79 additions and 3 deletions

View File

@@ -11,6 +11,7 @@ class ProfileModel: ObservableObject, Equatable {
@Published var events: [NostrEvent] = []
@Published var contacts: NostrEvent? = nil
@Published var following: Int = 0
@Published var relays: [String: RelayInfo]? = nil
let pubkey: String
let damus: DamusState
@@ -71,6 +72,7 @@ class ProfileModel: ObservableObject, Equatable {
func handle_profile_contact_event(_ ev: NostrEvent) {
self.contacts = ev
self.following = count_pubkeys(ev.tags)
self.relays = decode_json_relays(ev.content)
if damus.contacts.is_friend(ev.pubkey) {
self.damus.contacts.add_friend_contact(ev)
}

View File

@@ -240,6 +240,17 @@ struct ProfileView: View {
followers.subscribe()
}
}
if let relays = profile.relays {
NavigationLink(destination: UserRelaysView(state: damus_state, pubkey: profile.pubkey, relays: Array(relays.keys).sorted())) {
Text("\(relays.keys.count)")
.font(.subheadline.weight(.medium))
Text("Relays")
.font(.subheadline)
.foregroundColor(.gray)
}
.buttonStyle(PlainButtonStyle())
}
}
}
}

View File

@@ -10,12 +10,25 @@ import SwiftUI
struct RecommendedRelayView: View {
let damus: DamusState
let relay: String
let add_button: Bool
init(damus: DamusState, relay: String) {
self.damus = damus
self.relay = relay
self.add_button = true
}
init(damus: DamusState, relay: String, add_button: Bool) {
self.damus = damus
self.relay = relay
self.add_button = add_button
}
var body: some View {
HStack {
Text(relay)
Spacer()
if let ev = damus.contacts.event {
if let ev = damus.contacts.event, add_button {
if let privkey = damus.keypair.privkey {
Button("Add") {
guard let ev = add_relay(ev: ev, privkey: privkey, current_relays: damus.pool.descriptors, relay: relay, info: .rw) else {

View File

@@ -0,0 +1,46 @@
//
// UserRelaysView.swift
// damus
//
// Created by William Casarin on 2022-12-29.
//
import SwiftUI
struct UserRelaysView: View {
let state: DamusState
let pubkey: String
let relays: [String]
@State var relay_state: [(String, Bool)]
init (state: DamusState, pubkey: String, relays: [String]) {
self.state = state
self.pubkey = pubkey
self.relays = relays
let relay_state = UserRelaysView.make_relay_state(pool: state.pool, relays: relays)
self._relay_state = State(initialValue: relay_state)
}
static func make_relay_state(pool: RelayPool, relays: [String]) -> [(String, Bool)] {
return relays.map({ r in
return (r, pool.get_relay(r) == nil)
}).sorted { (a, b) in a.0 < b.0 }
}
var body: some View {
List(relay_state, id: \.0) { (r, add) in
RecommendedRelayView(damus: state, relay: r, add_button: add)
}
.onReceive(handle_notify(.relays_changed)) { _ in
self.relay_state = UserRelaysView.make_relay_state(pool: state.pool, relays: self.relays)
}
.navigationBarTitle("Relays")
}
}
struct UserRelaysView_Previews: PreviewProvider {
static var previews: some View {
UserRelaysView(state: test_damus_state(), pubkey: "", relays: [])
}
}