Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
signalapp
GitHub Repository: signalapp/Signal-iOS
Path: blob/main/Signal/src/ViewControllers/AppSettings/Payments/PaymentModelCell.swift
1 views
//
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//

import SignalServiceKit
import SignalUI
public import UIKit

public class PaymentModelCell: UITableViewCell {
    static let reuseIdentifier = "PaymentModelCell"

    let contactAvatarView = ConversationAvatarView(sizeClass: avatarSizeClass, localUserDisplayMode: .asUser)
    let nameLabel = UILabel()
    let statusLabel = UILabel()
    let amountLabel = UILabel()
    let hStack = UIStackView()
    let vStack = UIStackView()

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        OWSTableItem.configureCell(self)
        backgroundColor = .clear
        selectionStyle = .none

        amountLabel.setCompressionResistanceHigh()
        amountLabel.setContentHuggingHigh()

        vStack.addArrangedSubview(nameLabel)
        vStack.addArrangedSubview(statusLabel)
        vStack.axis = .vertical
        vStack.alignment = .fill
        vStack.setContentHuggingHorizontalLow()

        hStack.axis = .horizontal
        hStack.alignment = .center
        hStack.distribution = .fill
        hStack.spacing = Self.hStackSpacing
        hStack.isLayoutMarginsRelativeArrangement = true
        hStack.layoutMargins = UIEdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)
        contentView.addSubview(hStack)
        hStack.autoPinEdgesToSuperviewMargins()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private static var avatarSizeClass = ConversationAvatarView.Configuration.SizeClass.thirtySix

    private static var hStackSpacing: CGFloat = 12

    public static var separatorInsetLeading: CGFloat {
        CGFloat(avatarSizeClass.diameter) + hStackSpacing
    }

    func configure(paymentItem: PaymentsHistoryItem) {

        var arrangedSubviews = [UIView]()

        nameLabel.font = .dynamicTypeBodyClamped
        nameLabel.textColor = Theme.primaryTextColor

        statusLabel.font = .dynamicTypeSubheadlineClamped
        statusLabel.textColor = .Signal.tertiaryLabel

        amountLabel.font = .dynamicTypeBodyClamped
        amountLabel.textColor = (
            paymentItem.isIncoming
                ? UIColor.ows_accentGreen
                : Theme.primaryTextColor,
        )

        var avatarView: UIView
        if let address = paymentItem.address {
            contactAvatarView.updateWithSneakyTransactionIfNecessary { config in
                config.dataSource = .address(address)
            }
            avatarView = contactAvatarView
        } else {
            let avatarSize = Self.avatarSizeClass.diameter
            avatarView = PaymentsViewUtils.buildUnidentifiedTransactionAvatar(avatarSize: avatarSize)
        }
        if paymentItem.isUnread {
            let avatarWrapper = UIView.container()
            avatarWrapper.addSubview(avatarView)
            avatarView.autoPinEdgesToSuperviewEdges()
            avatarView = avatarWrapper
            avatarView.addCircleBadge(color: .Signal.accent)
        }
        arrangedSubviews.append(avatarView)

        nameLabel.text = paymentItem.displayName

        // We don't want to render the amount for incoming
        // transactions until they are verified.
        amountLabel.text = paymentItem.formattedPaymentAmount

        arrangedSubviews.append(vStack)
        arrangedSubviews.append(amountLabel)
        hStack.removeAllSubviews()
        for subview in arrangedSubviews {
            hStack.addArrangedSubview(subview)
        }

        statusLabel.text = paymentItem.statusDescription(isLongForm: false)

        accessoryType = .disclosureIndicator
    }

    override public func prepareForReuse() {
        super.prepareForReuse()

        contactAvatarView.reset()
        nameLabel.text = nil
        statusLabel.text = nil
        amountLabel.text = nil
    }
}