RelayView.swift (2713B)
1 // 2 // RelayView.swift 3 // damus 4 // 5 // Created by William Casarin on 2022-10-16. 6 // 7 8 import SwiftUI 9 10 struct RelayView: View { 11 let state: DamusState 12 let relay: String 13 14 let timer = Timer.publish(every: 2, on: .main, in: .common).autoconnect() 15 @State var conn_color: Color = .gray 16 17 func update_connection_color() { 18 for relay in state.pool.relays { 19 if relay.id == self.relay { 20 let c = relay.connection 21 if c.isConnected { 22 conn_color = .green 23 } else if c.isConnecting || c.isReconnecting { 24 conn_color = .yellow 25 } else { 26 conn_color = .red 27 } 28 } 29 } 30 } 31 32 var body: some View { 33 HStack { 34 Circle() 35 .frame(width: 8.0, height: 8.0) 36 .foregroundColor(conn_color) 37 Text(relay) 38 } 39 .onReceive(timer) { _ in 40 update_connection_color() 41 } 42 .onAppear() { 43 update_connection_color() 44 } 45 .swipeActions { 46 if let privkey = state.keypair.privkey { 47 RemoveAction(privkey: privkey) 48 } 49 } 50 .contextMenu { 51 CopyAction(relay: relay) 52 53 if let privkey = state.keypair.privkey { 54 RemoveAction(privkey: privkey) 55 } 56 } 57 } 58 59 func CopyAction(relay: String) -> some View { 60 Button { 61 UIPasteboard.general.setValue(relay, forPasteboardType: "public.plain-text") 62 } label: { 63 Label(NSLocalizedString("Copy", comment: "Button to copy a relay server address."), systemImage: "doc.on.doc") 64 } 65 } 66 67 func RemoveAction(privkey: String) -> some View { 68 Button { 69 guard let ev = state.contacts.event else { 70 return 71 } 72 73 let descriptors = state.pool.descriptors 74 guard let new_ev = remove_relay( ev: ev, current_relays: descriptors, privkey: privkey, relay: relay) else { 75 return 76 } 77 78 process_contact_event(pool: state.pool, contacts: state.contacts, pubkey: state.pubkey, ev: new_ev) 79 state.pool.send(.event(new_ev)) 80 } label: { 81 Label(NSLocalizedString("Delete", comment: "Button to delete a relay server that the user connects to."), systemImage: "trash") 82 } 83 .tint(.red) 84 } 85 } 86 87 struct RelayView_Previews: PreviewProvider { 88 static var previews: some View { 89 RelayView(state: test_damus_state(), relay: "wss://relay.damus.io", conn_color: .red) 90 } 91 }