import UIKit import SessionUIKit final class SimplifiedConversationCell : UITableViewCell { var threadViewModel: ThreadViewModel! { didSet { update() } } static let reuseIdentifier = "SimplifiedConversationCell" // MARK: UI Components private lazy var accentLineView: UIView = { let result = UIView() result.backgroundColor = Colors.destructive return result }() private lazy var profilePictureView = ProfilePictureView() private lazy var displayNameLabel: UILabel = { let result = UILabel() result.font = .boldSystemFont(ofSize: Values.mediumFontSize) result.textColor = Colors.text result.lineBreakMode = .byTruncatingTail return result }() // MARK: Initialization override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) setUpViewHierarchy() } required init?(coder: NSCoder) { super.init(coder: coder) setUpViewHierarchy() } private func setUpViewHierarchy() { // Background color backgroundColor = Colors.cellBackground // Highlight color let selectedBackgroundView = UIView() selectedBackgroundView.backgroundColor = Colors.cellSelected self.selectedBackgroundView = selectedBackgroundView // Accent line view accentLineView.set(.width, to: Values.accentLineThickness) accentLineView.set(.height, to: 68) // Profile picture view let profilePictureViewSize = Values.mediumProfilePictureSize profilePictureView.set(.width, to: profilePictureViewSize) profilePictureView.set(.height, to: profilePictureViewSize) profilePictureView.size = profilePictureViewSize // Main stack view let stackView = UIStackView(arrangedSubviews: [ accentLineView, profilePictureView, displayNameLabel, UIView.hSpacer(0) ]) stackView.axis = .horizontal stackView.alignment = .center stackView.spacing = Values.mediumSpacing addSubview(stackView) stackView.pin(to: self) } // MARK: Updating private func update() { AssertIsOnMainThread() guard let thread = threadViewModel?.threadRecord else { return } let isBlocked: Bool if let thread = thread as? TSContactThread { isBlocked = SSKEnvironment.shared.blockingManager.isRecipientIdBlocked(thread.contactSessionID()) } else { isBlocked = false } accentLineView.alpha = isBlocked ? 1 : 0 profilePictureView.update(for: thread) displayNameLabel.text = getDisplayName() } private func getDisplayName() -> String { if threadViewModel.isGroupThread { if threadViewModel.name.isEmpty { return "Unknown Group" } else { return threadViewModel.name } } else { if threadViewModel.threadRecord.isNoteToSelf() { return NSLocalizedString("NOTE_TO_SELF", comment: "") } else { let hexEncodedPublicKey = threadViewModel.contactSessionID! return Storage.shared.getContact(with: hexEncodedPublicKey)?.displayName(for: .regular) ?? hexEncodedPublicKey } } } }