123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- import Foundation
- import UIKit
- import DcCore
- class ChatListCell: UITableViewCell {
- let badgeSize: CGFloat = 54
- lazy var avatar: InitialsBadge = {
- let badge = InitialsBadge(size: badgeSize)
- badge.setColor(UIColor.lightGray)
- badge.isAccessibilityElement = false
- return badge
- }()
- lazy var stackView: UIStackView = {
- let stackView = UIStackView(arrangedSubviews: [titleLabel, subtitleLabel])
- stackView.axis = .vertical
- stackView.translatesAutoresizingMaskIntoConstraints = false
- stackView.alignment = .leading
- stackView.clipsToBounds = true
- return stackView
- }()
- lazy var titleLabel: UILabel = {
- let label = UILabel()
- label.font = UIFont.preferredFont(forTextStyle: .headline)
- label.adjustsFontForContentSizeCategory = true
- label.lineBreakMode = .byTruncatingTail
- label.textColor = DcColors.defaultTextColor
- label.translatesAutoresizingMaskIntoConstraints = false
- return label
- }()
- lazy var subtitleLabel: UILabel = {
- let label = UILabel()
- label.textColor = DcColors.middleGray
- label.lineBreakMode = .byTruncatingTail
- label.font = .preferredFont(forTextStyle: .subheadline)
- label.adjustsFontForContentSizeCategory = true
- label.translatesAutoresizingMaskIntoConstraints = false
- return label
- }()
- override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
- super.init(style: style, reuseIdentifier: reuseIdentifier)
- selectionStyle = .none
- backgroundColor = DcColors.contactCellBackgroundColor
- contentView.backgroundColor = DcColors.contactCellBackgroundColor
- setupSubviews()
- }
- required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
- private func setupSubviews() {
- let margin: CGFloat = 10
- avatar.translatesAutoresizingMaskIntoConstraints = false
- contentView.addSubview(avatar)
- contentView.addConstraints([
- avatar.constraintWidthTo(badgeSize),
- avatar.constraintHeightTo(badgeSize),
- avatar.constraintAlignLeadingTo(contentView, paddingLeading: badgeSize / 4),
- avatar.constraintCenterYTo(contentView),
- ])
- contentView.addSubview(stackView)
- contentView.addConstraints([
- stackView.constraintCenterYTo(contentView),
- stackView.constraintToTrailingOf(avatar, paddingLeading: margin),
- stackView.constraintAlignTrailingTo(contentView),
- ])
- }
- private func setImage(_ img: UIImage) {
- avatar.setImage(img)
- }
- private func resetBackupImage() {
- avatar.setColor(UIColor.clear)
- avatar.setName("")
- }
- private func setBackupImage(name: String, color: UIColor) {
- avatar.setColor(color)
- avatar.setName(name)
- }
- private func setColor(_ color: UIColor) {
- avatar.setColor(color)
- }
- // use this update-method to update cell in cellForRowAt whenever it is possible - other set-methods will be set private in progress
- func updateCell(cellViewModel: AvatarCellViewModel) {
- // subtitle
- switch cellViewModel.type {
- case .chat(let chatData):
- let chat = DcContext.shared.getChat(chatId: chatData.chatId)
- titleLabel.attributedText = cellViewModel.title.boldAt(indexes: cellViewModel.titleHighlightIndexes, fontSize: titleLabel.font.pointSize)
- if let img = chat.profileImage {
- resetBackupImage()
- setImage(img)
- } else {
- setBackupImage(name: chat.name, color: chat.color)
- }
- subtitleLabel.attributedText = nil
- case .contact(let contactData):
- let contact = DcContact(id: contactData.contactId)
- titleLabel.attributedText = cellViewModel.title.boldAt(indexes: cellViewModel.titleHighlightIndexes, fontSize: titleLabel.font.pointSize)
- if let profileImage = contact.profileImage {
- avatar.setImage(profileImage)
- } else {
- setBackupImage(name: cellViewModel.title, color: contact.color)
- }
- subtitleLabel.attributedText = cellViewModel.subtitle.boldAt(indexes: cellViewModel.subtitleHighlightIndexes,
- fontSize: subtitleLabel.font.pointSize)
- default:
- return
- }
- }
- }
|