89 lines
2.5 KiB
Swift
89 lines
2.5 KiB
Swift
//
|
|
// DisplayName.swift
|
|
// damus
|
|
//
|
|
// Created by William Casarin on 2023-03-14.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
enum DisplayName: Equatable {
|
|
case both(username: String, displayName: String)
|
|
case one(String)
|
|
|
|
init (profile: Profile?, pubkey: Pubkey) {
|
|
self = parse_display_name(name: profile?.name, display_name: profile?.display_name, pubkey: pubkey)
|
|
}
|
|
|
|
init (name: String?, display_name: String?, pubkey: Pubkey) {
|
|
self = parse_display_name(name: name, display_name: display_name, pubkey: pubkey)
|
|
}
|
|
|
|
var displayName: String {
|
|
switch self {
|
|
case .one(let one):
|
|
return one
|
|
case .both(username: _, displayName: let displayName):
|
|
return displayName
|
|
}
|
|
}
|
|
|
|
var username: String {
|
|
switch self {
|
|
case .one(let one):
|
|
return one
|
|
case .both(username: let username, displayName: _):
|
|
return username
|
|
}
|
|
}
|
|
|
|
func nameComponents() -> PersonNameComponents {
|
|
var components = PersonNameComponents()
|
|
switch self {
|
|
case .one(let one):
|
|
components.nickname = one
|
|
return components
|
|
case .both(username: let username, displayName: let displayName):
|
|
components.nickname = username
|
|
let names = displayName.split(separator: " ")
|
|
if let name = names.first {
|
|
components.givenName = String(name)
|
|
components.familyName = names.dropFirst().joined(separator: " ")
|
|
}
|
|
return components
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
func parse_display_name(name: String?, display_name: String?, pubkey: Pubkey) -> DisplayName {
|
|
if pubkey == ANON_PUBKEY {
|
|
return .one(NSLocalizedString("Anonymous", comment: "Placeholder display name of anonymous user."))
|
|
}
|
|
|
|
if name == nil && display_name == nil {
|
|
return .one(abbrev_bech32_pubkey(pubkey: pubkey))
|
|
}
|
|
|
|
let name = name?.isEmpty == false ? name : nil
|
|
let disp_name = display_name?.isEmpty == false ? display_name : nil
|
|
|
|
if let name, let disp_name, name != disp_name {
|
|
return .both(username: name, displayName: disp_name)
|
|
}
|
|
|
|
if let one = name ?? disp_name {
|
|
return .one(one)
|
|
}
|
|
|
|
return .one(abbrev_bech32_pubkey(pubkey: pubkey))
|
|
}
|
|
|
|
func abbrev_bech32_pubkey(pubkey: Pubkey) -> String {
|
|
return abbrev_pubkey(String(pubkey.npub.dropFirst(4)))
|
|
}
|
|
|
|
func abbrev_pubkey(_ pubkey: String, amount: Int = 8) -> String {
|
|
return pubkey.prefix(amount) + ":" + pubkey.suffix(amount)
|
|
}
|