damus

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

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