92 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
import Foundation
 | 
						|
 | 
						|
struct SearchDataPayload: Decodable {
 | 
						|
    let users: [UserSearchResult]
 | 
						|
}
 | 
						|
 | 
						|
struct UserSearchResult: Decodable, Identifiable {
 | 
						|
    let userId: UUID
 | 
						|
//    let login: String
 | 
						|
//    let fullName: String?
 | 
						|
//    let customName: String?
 | 
						|
//    let createdAt: Date?
 | 
						|
    let profile: SearchProfile?
 | 
						|
 | 
						|
    var id: UUID { userId }
 | 
						|
}
 | 
						|
 | 
						|
struct SearchProfile: Decodable {
 | 
						|
    let userId: UUID
 | 
						|
    let login: String
 | 
						|
    let fullName: String?
 | 
						|
    let customName: String?
 | 
						|
    let bio: String?
 | 
						|
 | 
						|
    let isVerified: Bool
 | 
						|
    let isSystem: Bool
 | 
						|
    
 | 
						|
    let lastSeen: Int?
 | 
						|
    let createdAt: Date?
 | 
						|
}
 | 
						|
 | 
						|
extension UserSearchResult {
 | 
						|
    var officialFullName: String? {
 | 
						|
        trimmed(profile?.fullName)
 | 
						|
    }
 | 
						|
 | 
						|
    var preferredCustomName: String? {
 | 
						|
        trimmed(profile?.customName)
 | 
						|
    }
 | 
						|
 | 
						|
    var login: String? {
 | 
						|
        trimmed(profile?.login)
 | 
						|
    }
 | 
						|
 | 
						|
    var loginHandle: String {
 | 
						|
        if let login {
 | 
						|
            return "@\(login)"
 | 
						|
        }
 | 
						|
        return "@\(userId.uuidString)"
 | 
						|
    }
 | 
						|
 | 
						|
    var displayName: String {
 | 
						|
        if let official = officialFullName {
 | 
						|
            return official
 | 
						|
        }
 | 
						|
        if let custom = preferredCustomName {
 | 
						|
            return custom
 | 
						|
        }
 | 
						|
        if let login = login {
 | 
						|
            return "@\(login)"
 | 
						|
        }
 | 
						|
        return "@\(userId.uuidString)"
 | 
						|
    }
 | 
						|
 | 
						|
    var avatarInitial: String {
 | 
						|
        let source = officialFullName
 | 
						|
            ?? preferredCustomName
 | 
						|
            ?? login
 | 
						|
            ?? userId.uuidString
 | 
						|
 | 
						|
        if let character = source.first(where: { !$0.isWhitespace && $0 != "@" }) {
 | 
						|
            return String(character).uppercased()
 | 
						|
        }
 | 
						|
        return "?"
 | 
						|
    }
 | 
						|
 | 
						|
    var isOfficial: Bool {
 | 
						|
        profile?.isVerified ?? false
 | 
						|
    }
 | 
						|
 | 
						|
    var createdAt: Date? {
 | 
						|
        profile?.createdAt
 | 
						|
    }
 | 
						|
 | 
						|
    private func trimmed(_ value: String?) -> String? {
 | 
						|
        guard let value = value?.trimmingCharacters(in: .whitespacesAndNewlines), !value.isEmpty else {
 | 
						|
            return nil
 | 
						|
        }
 | 
						|
        return value
 | 
						|
    }
 | 
						|
}
 |