// // NotificationTableViewCell.swift // PrivadoVPN // // Created by Lizaveta Malinouskaya on 25.08.21. // Copyright © 2021 Privado LLC. All rights reserved. // import UIKit class NotificationTableViewCellIPAD: UITableViewCell, NotificationCellInput { // MARK: - Constant enum Constant { enum Color { static let title = Colors.Notification.title.color static let bg = Colors.Notification.bg.color static let accent = Colors.Notification.accent.color static let separator = Colors.Notification.separator.color } enum Geometry { static let horizontalOffset: CGFloat = 19 static let lineHeight: CGFloat = 18 static let titleTop: CGFloat = 22 static let dateTop: CGFloat = 11 static let textTop: CGFloat = 11 static let separatorTop: CGFloat = 15 static let separatorHeight: CGFloat = 0.5 static let textWidth: CGFloat = 270 } enum Font { static let title = UIFont.primary(size: 12, weight: .semibold) static let body = UIFont.primary(size: 10, weight: .regular) static let date = UIFont.primary(size: 8, weight: .medium) } } // MARK: - Property private var titleLabel: UILabel? private var dateLabel: UILabel? private var bodyTextView: UITextView? private var linkAction: NotificationCellLinkAction? // MARK: - init public override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) self.selectionStyle = .none self.backgroundColor = Constant.Color.bg self.contentView.isUserInteractionEnabled = false self.setupUI() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } // MARK: - Interface func display(viewAdapter: NotificationCellAdapter) { self.titleLabel?.attributedText = viewAdapter.attrTitle self.bodyTextView?.attributedText = viewAdapter.body self.dateLabel?.text = viewAdapter.date self.linkAction = viewAdapter.linkAction } // MARK: - UI private func setupUI() { self.titleLabel = self.initTitle(with: self) self.dateLabel = self.setupDateLabel(with: self) self.bodyTextView = self.setupBodyText(with: self) self.setupSeparator(with: self) } private func activateBaseConstraints(for view: UIView, and container: UITableViewCell) { NSLayoutConstraint.activate([ view.widthAnchor.constraint(equalToConstant: Constant.Geometry.textWidth), view.leftAnchor.constraint(equalTo: container.leftAnchor, constant: Constant.Geometry.horizontalOffset), view.rightAnchor.constraint(equalTo: container.rightAnchor, constant: -Constant.Geometry.horizontalOffset) ]) } private func initTitle(with container: UITableViewCell) -> UILabel { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false label.numberOfLines = 5 label.font = Constant.Font.title label.textColor = Constant.Color.title label.lineBreakMode = .byTruncatingTail label.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal) container.addSubview(label) self.activateBaseConstraints(for: label, and: container) NSLayoutConstraint.activate([ label.topAnchor.constraint(equalTo: container.topAnchor, constant: Constant.Geometry.titleTop) ]) return label } private func setupDateLabel(with container: UITableViewCell) -> UILabel? { guard let top = self.titleLabel else { return nil } let date = UILabel() date.translatesAutoresizingMaskIntoConstraints = false date.font = Constant.Font.date date.textColor = Constant.Color.accent container.addSubview(date) self.activateBaseConstraints(for: date, and: container) NSLayoutConstraint.activate([ date.topAnchor.constraint(equalTo: top.bottomAnchor, constant: Constant.Geometry.dateTop) ]) return date } private func setupBodyText(with container: UITableViewCell) -> UITextView? { guard let top = self.dateLabel else { return nil } let textView = UITextView() textView.translatesAutoresizingMaskIntoConstraints = false textView.isScrollEnabled = false textView.dataDetectorTypes = .all textView.isEditable = false textView.backgroundColor = .clear textView.textContainerInset = .zero textView.textContainer.lineFragmentPadding = 0 textView.tintColor = .white textView.font = Constant.Font.body textView.delegate = self container.addSubview(textView) self.activateBaseConstraints(for: textView, and: container) NSLayoutConstraint.activate([ textView.topAnchor.constraint(equalTo: top.bottomAnchor, constant: Constant.Geometry.textTop) ]) return textView } private func setupSeparator(with container: UITableViewCell) { guard let top = self.bodyTextView else { return } let separator = UIView() separator.translatesAutoresizingMaskIntoConstraints = false separator.backgroundColor = Constant.Color.separator container.addSubview(separator) self.activateBaseConstraints(for: separator, and: container) NSLayoutConstraint.activate([ separator.topAnchor.constraint(equalTo: top.bottomAnchor, constant: Constant.Geometry.separatorTop), separator.heightAnchor.constraint(equalToConstant: Constant.Geometry.separatorHeight), separator.bottomAnchor.constraint(equalTo: container.bottomAnchor) ]) } } extension NotificationTableViewCellIPAD: UITextViewDelegate { func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool { self.linkAction?(URL) return false } }