damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

commit 1b21a7a7b76239438a70c3827b03907becf9715b
parent 9e6e22fa2dc34299292253bda02282bf6581fa23
Author: William Casarin <jb55@jb55.com>
Date:   Thu, 29 Dec 2022 16:55:36 -0800

User relays view

Changelog-Added: Added relay list to user profiles

Diffstat:
Mdamus.xcodeproj/project.pbxproj | 8++++++--
Mdamus/Models/ProfileModel.swift | 2++
Mdamus/Views/ProfileView.swift | 11+++++++++++
Mdamus/Views/RecommendedRelayView.swift | 15++++++++++++++-
Adamus/Views/UserRelaysView.swift | 46++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 79 insertions(+), 3 deletions(-)

diff --git a/damus.xcodeproj/project.pbxproj b/damus.xcodeproj/project.pbxproj @@ -110,6 +110,7 @@ 4CACA9D5280C31E100D9BBE8 /* ReplyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CACA9D4280C31E100D9BBE8 /* ReplyView.swift */; }; 4CACA9DC280C38C000D9BBE8 /* Profiles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CACA9DB280C38C000D9BBE8 /* Profiles.swift */; }; 4CB55EF3295E5D59007FD187 /* RecommendedRelayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB55EF2295E5D59007FD187 /* RecommendedRelayView.swift */; }; + 4CB55EF5295E679D007FD187 /* UserRelaysView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB55EF4295E679D007FD187 /* UserRelaysView.swift */; }; 4CD7641B28A1641400B6928F /* EndBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CD7641A28A1641400B6928F /* EndBlock.swift */; }; 4CE4F8CD281352B30009DFBB /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE4F8CC281352B30009DFBB /* Notifications.swift */; }; 4CE4F9DE2852768D00C00DD9 /* ConfigView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE4F9DD2852768D00C00DD9 /* ConfigView.swift */; }; @@ -290,6 +291,7 @@ 4CACA9D4280C31E100D9BBE8 /* ReplyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReplyView.swift; sourceTree = "<group>"; }; 4CACA9DB280C38C000D9BBE8 /* Profiles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Profiles.swift; sourceTree = "<group>"; }; 4CB55EF2295E5D59007FD187 /* RecommendedRelayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendedRelayView.swift; sourceTree = "<group>"; }; + 4CB55EF4295E679D007FD187 /* UserRelaysView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserRelaysView.swift; sourceTree = "<group>"; }; 4CD7641A28A1641400B6928F /* EndBlock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EndBlock.swift; sourceTree = "<group>"; }; 4CE4F8CC281352B30009DFBB /* Notifications.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Notifications.swift; sourceTree = "<group>"; }; 4CE4F9DD2852768D00C00DD9 /* ConfigView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfigView.swift; sourceTree = "<group>"; }; @@ -489,6 +491,7 @@ BAB68BEC29543FA3007BA466 /* SelectWalletView.swift */, E9E4ED0A295867B900DD7078 /* ThreadV2View.swift */, 4CB55EF2295E5D59007FD187 /* RecommendedRelayView.swift */, + 4CB55EF4295E679D007FD187 /* UserRelaysView.swift */, ); path = Views; sourceTree = "<group>"; @@ -781,6 +784,7 @@ 4CE6DEE927F7A08100C66700 /* ContentView.swift in Sources */, 4CEE2AF5280B29E600AB5EEF /* TimeAgo.swift in Sources */, 4C75EFAD28049CFB0006080F /* PostButton.swift in Sources */, + 4CB55EF5295E679D007FD187 /* UserRelaysView.swift in Sources */, 4C363AA228296A7E006E126D /* SearchView.swift in Sources */, 4C285C8A2838B985008A31F1 /* ProfilePictureSelector.swift in Sources */, 4C75EFB92804A2740006080F /* EventView.swift in Sources */, @@ -1043,7 +1047,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = damus/damus.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 8; + CURRENT_PROJECT_VERSION = 9; DEVELOPMENT_ASSET_PATHS = "\"damus/Preview Content\""; DEVELOPMENT_TEAM = XK7H4JAB3D; ENABLE_PREVIEWS = YES; @@ -1082,7 +1086,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = damus/damus.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 8; + CURRENT_PROJECT_VERSION = 9; DEVELOPMENT_ASSET_PATHS = "\"damus/Preview Content\""; DEVELOPMENT_TEAM = XK7H4JAB3D; ENABLE_PREVIEWS = YES; diff --git a/damus/Models/ProfileModel.swift b/damus/Models/ProfileModel.swift @@ -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) } diff --git a/damus/Views/ProfileView.swift b/damus/Views/ProfileView.swift @@ -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()) + } } } } diff --git a/damus/Views/RecommendedRelayView.swift b/damus/Views/RecommendedRelayView.swift @@ -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 { diff --git a/damus/Views/UserRelaysView.swift b/damus/Views/UserRelaysView.swift @@ -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: []) + } +}