140 lines
5.5 KiB
Swift
140 lines
5.5 KiB
Swift
//
|
|
// NotificationTableViewCell.swift
|
|
// PrivadoVPN
|
|
//
|
|
// Created by Zhandos Bolatbekov on 21.01.2021.
|
|
// Copyright © 2021 Privado LLC. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import UIKit
|
|
|
|
protocol NotificationCellInput {
|
|
func display(viewAdapter: NotificationCellAdapter)
|
|
}
|
|
|
|
class NotificationTableViewCell: UITableViewCell, NotificationCellInput {
|
|
|
|
private enum Constants {
|
|
|
|
enum Color {
|
|
static let background = UIColor(rgb: 0x202864)
|
|
static let separator = UIColor(rgb: 0x192147)
|
|
static let bodyTint = UIColor(rgb: 0x28d799)
|
|
}
|
|
|
|
static let titleFont = UIFont(name: "SFProText-Semibold", size: 20)
|
|
static let dateFont = UIFont(name: "SFProText-Semibold", size: 20)
|
|
|
|
static let titleTop: CGFloat = 25
|
|
static let titleLeft: CGFloat = 34
|
|
|
|
static let dateRight: CGFloat = 52
|
|
|
|
static let bodyLeft: CGFloat = 34
|
|
static let bodyRight: CGFloat = 52
|
|
static let bodyTop: CGFloat = 10
|
|
static let bodyBottom: CGFloat = 20
|
|
|
|
static let separatorBottom: CGFloat = 2
|
|
static let separatorHeight: CGFloat = 1
|
|
}
|
|
|
|
private let titleLabel: UILabel = {
|
|
let label = UILabel()
|
|
label.translatesAutoresizingMaskIntoConstraints = false
|
|
label.font = Constants.titleFont
|
|
label.textColor = .white
|
|
label.lineBreakMode = .byTruncatingTail
|
|
label.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
|
|
label.numberOfLines = 0
|
|
return label
|
|
}()
|
|
private lazy var bodyTextView: UITextView = {
|
|
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 = Constants.Color.bodyTint
|
|
textView.delegate = self
|
|
return textView
|
|
}()
|
|
private let dateLabel: UILabel = {
|
|
let label = UILabel()
|
|
label.translatesAutoresizingMaskIntoConstraints = false
|
|
label.font = Constants.dateFont
|
|
label.textColor = .white
|
|
label.setContentCompressionResistancePriority(.required, for: .horizontal)
|
|
return label
|
|
}()
|
|
private let separatorView: UIView = {
|
|
let view = UIView()
|
|
view.translatesAutoresizingMaskIntoConstraints = false
|
|
view.backgroundColor = Constants.Color.separator
|
|
return view
|
|
}()
|
|
|
|
private var linkAction: NotificationCellLinkAction?
|
|
|
|
// MARK: - Init
|
|
|
|
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
|
|
super.init(style: style, reuseIdentifier: reuseIdentifier)
|
|
self.selectionStyle = .none
|
|
self.backgroundColor = Constants.Color.background
|
|
self.contentView.isUserInteractionEnabled = false
|
|
self.configureUI()
|
|
}
|
|
|
|
required init?(coder: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
|
|
// MARK: - Interface
|
|
|
|
func display(viewAdapter: NotificationCellAdapter) {
|
|
self.titleLabel.text = viewAdapter.title
|
|
self.bodyTextView.attributedText = viewAdapter.body
|
|
self.dateLabel.text = viewAdapter.date
|
|
self.linkAction = viewAdapter.linkAction
|
|
}
|
|
|
|
// MARK: - Methods
|
|
|
|
private func configureUI() {
|
|
[self.titleLabel, self.dateLabel, self.bodyTextView, self.separatorView].forEach(self.addSubview(_:))
|
|
|
|
NSLayoutConstraint.activate([
|
|
self.titleLabel.topAnchor.constraint(equalTo: self.topAnchor, constant: Constants.titleTop),
|
|
self.titleLabel.leftAnchor.constraint(equalTo: self.leftAnchor, constant: Constants.titleLeft),
|
|
self.titleLabel.rightAnchor.constraint(lessThanOrEqualTo: self.dateLabel.leftAnchor, constant: -16),
|
|
|
|
self.dateLabel.topAnchor.constraint(equalTo: self.titleLabel.topAnchor),
|
|
self.dateLabel.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -Constants.dateRight),
|
|
|
|
self.separatorView.leftAnchor.constraint(equalTo: self.leftAnchor, constant: Constants.bodyLeft),
|
|
self.separatorView.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -Constants.bodyRight),
|
|
self.separatorView.heightAnchor.constraint(equalToConstant: Constants.separatorHeight),
|
|
self.separatorView.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -Constants.separatorBottom),
|
|
|
|
self.bodyTextView.topAnchor.constraint(greaterThanOrEqualTo: self.dateLabel.bottomAnchor, constant: Constants.bodyTop),
|
|
self.bodyTextView.topAnchor.constraint(equalTo: self.titleLabel.bottomAnchor, constant: Constants.bodyTop),
|
|
self.bodyTextView.leftAnchor.constraint(equalTo: self.leftAnchor, constant: Constants.bodyLeft),
|
|
self.bodyTextView.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -Constants.bodyRight),
|
|
self.bodyTextView.bottomAnchor.constraint(equalTo: self.separatorView.topAnchor, constant: -Constants.bodyBottom)
|
|
])
|
|
}
|
|
}
|
|
|
|
extension NotificationTableViewCell: UITextViewDelegate {
|
|
|
|
func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
|
|
self.linkAction?(URL)
|
|
return false
|
|
}
|
|
}
|