Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
signalapp
GitHub Repository: signalapp/Signal-iOS
Path: blob/main/SignalUI/ContactSharing/ContactFieldViewHelper.swift
1 views
//
// Copyright 2018 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//

import Contacts
public import SignalServiceKit

public class ContactFieldViewHelper {

    public class func contactFieldView(forAvatarImage avatarImage: UIImage) -> UIView {
        let avatarView = AvatarImageView()
        avatarView.image = avatarImage
        avatarView.autoSetDimensions(to: .square(56))

        // Container allows to provide additional vertical margin around avatar.
        let containerView = UIView.container()
        containerView.addSubview(avatarView)
        avatarView.autoPinHeightToSuperview(withMargin: 4)
        avatarView.autoPinEdge(toSuperviewEdge: .leading)
        NSLayoutConstraint.autoSetPriority(.defaultHigh) {
            avatarView.autoPinEdge(toSuperviewEdge: .trailing, relation: .lessThanOrEqual)
        }
        return containerView
    }

    public class func contactFieldView(forContactName contactName: String) -> UIView {
        return simpleFieldView(name: nil, value: contactName)
    }

    public class func contactFieldView(forOrganizationName organizationName: String) -> UIView {
        return simpleFieldView(
            name: OWSLocalizedString("CONTACT_FIELD_ORGANIZATION", comment: "Label for the 'organization' field of a contact."),
            value: organizationName,
        )
    }

    public class func contactFieldView(forPhoneNumber phoneNumber: OWSContactPhoneNumber) -> UIView {
        let formattedPhoneNumber = PhoneNumber.bestEffortLocalizedPhoneNumber(e164: phoneNumber.phoneNumber)
        return simpleFieldView(name: phoneNumber.localizedLabel, value: formattedPhoneNumber)
    }

    public class func contactFieldView(forEmail email: OWSContactEmail) -> UIView {
        return simpleFieldView(name: email.localizedLabel, value: email.email)
    }

    private class func simpleFieldView(name: String?, value: String?) -> UIView {
        let stackView = UIStackView()
        stackView.axis = .vertical
        stackView.alignment = .leading
        stackView.spacing = 3

        if let name {
            let nameLabel = UILabel()
            nameLabel.text = name.lowercased()
            nameLabel.font = .dynamicTypeSubheadline
            nameLabel.textColor = Theme.secondaryTextAndIconColor
            nameLabel.lineBreakMode = .byTruncatingTail
            stackView.addArrangedSubview(nameLabel)
        }

        let valueLabel = UILabel()
        valueLabel.text = value
        valueLabel.font = .dynamicTypeBody
        valueLabel.textColor = Theme.primaryTextColor
        valueLabel.lineBreakMode = .byTruncatingTail
        stackView.addArrangedSubview(valueLabel)

        return stackView
    }

    public class func contactFieldView(forAddress address: OWSContactAddress) -> UIView {
        owsAssertDebug(address.isValid)

        let stackView = UIStackView()
        stackView.axis = .vertical
        stackView.alignment = .leading
        stackView.spacing = 3

        let nameLabel = UILabel()
        nameLabel.text = address.localizedLabel
        nameLabel.font = UIFont.dynamicTypeSubheadline
        nameLabel.textColor = Theme.secondaryTextAndIconColor
        nameLabel.lineBreakMode = .byTruncatingTail
        stackView.addArrangedSubview(nameLabel)

        if let postalAddress = address.cnLabeledValue()?.value {
            let formatter = CNPostalAddressFormatter()
            formatter.style = .mailingAddress
            let formattedAddress = formatter.string(from: postalAddress)

            let valueLabel = UILabel()
            valueLabel.text = formattedAddress
            valueLabel.font = UIFont.dynamicTypeBody
            valueLabel.textColor = Theme.primaryTextColor
            valueLabel.lineBreakMode = .byWordWrapping
            valueLabel.numberOfLines = 0
            stackView.addArrangedSubview(valueLabel)
        }

        return stackView
    }
}