NIP05Badge.swift (3662B)
1 // 2 // NIP05Badge.swift 3 // damus 4 // 5 // Created by William Casarin on 2023-01-11. 6 // 7 8 import FaviconFinder 9 import Kingfisher 10 import SwiftUI 11 12 struct NIP05Badge: View { 13 let nip05: NIP05 14 let pubkey: Pubkey 15 let damus_state: DamusState 16 let show_domain: Bool 17 let nip05_domain_favicon: FaviconURL? 18 19 init(nip05: NIP05, pubkey: Pubkey, damus_state: DamusState, show_domain: Bool, nip05_domain_favicon: FaviconURL?) { 20 self.nip05 = nip05 21 self.pubkey = pubkey 22 self.damus_state = damus_state 23 self.show_domain = show_domain 24 self.nip05_domain_favicon = nip05_domain_favicon 25 } 26 27 var nip05_color: Bool { 28 return use_nip05_color(pubkey: pubkey, contacts: damus_state.contacts) 29 } 30 31 var Seal: some View { 32 Group { 33 if nip05_color { 34 LINEAR_GRADIENT 35 .mask(Image("verified.fill") 36 .resizable() 37 ).frame(width: 18, height: 18) 38 } else if show_domain { 39 Image("verified") 40 .resizable() 41 .frame(width: 18, height: 18) 42 .nip05_colorized(gradient: nip05_color) 43 } 44 } 45 } 46 47 var domainBadge: some View { 48 Group { 49 if let nip05_domain_favicon { 50 KFImage(nip05_domain_favicon.source) 51 .imageContext(.favicon, disable_animation: true) 52 .resizable() 53 .aspectRatio(contentMode: .fit) 54 .frame(width: 18, height: 18) 55 .clipped() 56 } else { 57 EmptyView() 58 } 59 } 60 } 61 62 var username_matches_nip05: Bool { 63 guard let name = damus_state.profiles.lookup(id: pubkey)?.map({ p in p?.name }).value 64 else { 65 return false 66 } 67 68 return name.lowercased() == nip05.username.lowercased() 69 } 70 71 var nip05_string: String { 72 if nip05.username == "_" || username_matches_nip05 { 73 return nip05.host 74 } else { 75 return "\(nip05.username)@\(nip05.host)" 76 } 77 } 78 79 var body: some View { 80 HStack(spacing: 2) { 81 Seal 82 83 Group { 84 if show_domain { 85 Text(nip05_string) 86 .nip05_colorized(gradient: nip05_color) 87 } 88 89 if nip05_domain_favicon != nil { 90 domainBadge 91 } 92 } 93 .onTapGesture { 94 damus_state.nav.push(route: Route.NIP05DomainEvents(events: NIP05DomainEventsModel(state: damus_state, domain: nip05.host), nip05_domain_favicon: nip05_domain_favicon)) 95 } 96 } 97 98 } 99 } 100 101 extension View { 102 func nip05_colorized(gradient: Bool) -> some View { 103 if gradient { 104 return AnyView(self.foregroundStyle(LINEAR_GRADIENT)) 105 } else { 106 return AnyView(self.foregroundColor(.gray)) 107 } 108 109 } 110 } 111 112 func use_nip05_color(pubkey: Pubkey, contacts: Contacts) -> Bool { 113 return contacts.is_friend_or_self(pubkey) ? true : false 114 } 115 116 struct NIP05Badge_Previews: PreviewProvider { 117 static var previews: some View { 118 let test_state = test_damus_state 119 VStack { 120 NIP05Badge(nip05: NIP05(username: "jb55", host: "jb55.com"), pubkey: test_state.pubkey, damus_state: test_state, show_domain: true, nip05_domain_favicon: nil) 121 122 NIP05Badge(nip05: NIP05(username: "_", host: "jb55.com"), pubkey: test_state.pubkey, damus_state: test_state, show_domain: true, nip05_domain_favicon: nil) 123 } 124 } 125 } 126