metatext/Views/AccountView.swift

134 lines
5.1 KiB
Swift
Raw Normal View History

2020-09-23 01:00:56 +00:00
// Copyright © 2020 Metabolist. All rights reserved.
import Kingfisher
import UIKit
class AccountView: UIView {
let avatarImageView = AnimatedImageView()
2020-09-26 00:52:59 +00:00
let displayNameLabel = UILabel()
let accountLabel = UILabel()
2020-09-23 01:00:56 +00:00
let noteTextView = TouchFallthroughTextView()
private var accountConfiguration: AccountContentConfiguration
init(configuration: AccountContentConfiguration) {
self.accountConfiguration = configuration
super.init(frame: .zero)
initialSetup()
}
@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension AccountView: UIContentView {
var configuration: UIContentConfiguration {
get { accountConfiguration }
set {
guard let accountConfiguration = newValue as? AccountContentConfiguration else { return }
self.accountConfiguration = accountConfiguration
avatarImageView.kf.cancelDownloadTask()
applyAccountConfiguration()
}
}
}
2020-09-26 00:57:35 +00:00
extension AccountView: UITextViewDelegate {
func textView(
_ textView: UITextView,
shouldInteractWith URL: URL,
in characterRange: NSRange,
interaction: UITextItemInteraction) -> Bool {
switch interaction {
case .invokeDefaultAction:
accountConfiguration.viewModel.urlSelected(URL)
return false
case .preview: return false
case .presentActions: return false
@unknown default: return false
}
}
}
2020-09-23 01:00:56 +00:00
private extension AccountView {
2020-09-26 00:52:59 +00:00
static let spacing: CGFloat = 8
static let stackViewSpacing: CGFloat = 4
static let avatarDimension: CGFloat = 50
2020-09-23 01:00:56 +00:00
func initialSetup() {
2020-09-26 00:52:59 +00:00
let stackView = UIStackView()
2020-09-23 01:00:56 +00:00
2020-09-26 00:52:59 +00:00
addSubview(avatarImageView)
addSubview(stackView)
avatarImageView.translatesAutoresizingMaskIntoConstraints = false
avatarImageView.layer.cornerRadius = Self.avatarDimension / 2
avatarImageView.clipsToBounds = true
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.axis = .vertical
stackView.spacing = Self.stackViewSpacing
stackView.addArrangedSubview(displayNameLabel)
stackView.addArrangedSubview(accountLabel)
stackView.addArrangedSubview(noteTextView)
displayNameLabel.numberOfLines = 0
displayNameLabel.font = .preferredFont(forTextStyle: .headline)
displayNameLabel.adjustsFontForContentSizeCategory = true
accountLabel.numberOfLines = 0
accountLabel.font = .preferredFont(forTextStyle: .subheadline)
accountLabel.adjustsFontForContentSizeCategory = true
accountLabel.textColor = .secondaryLabel
2020-09-23 01:00:56 +00:00
noteTextView.isScrollEnabled = false
2020-09-26 00:52:59 +00:00
noteTextView.backgroundColor = .clear
2020-09-26 00:57:35 +00:00
noteTextView.delegate = self
2020-09-23 01:00:56 +00:00
NSLayoutConstraint.activate([
2020-09-26 00:52:59 +00:00
avatarImageView.widthAnchor.constraint(equalToConstant: Self.avatarDimension),
avatarImageView.heightAnchor.constraint(equalToConstant: Self.avatarDimension),
avatarImageView.topAnchor.constraint(equalTo: readableContentGuide.topAnchor),
avatarImageView.leadingAnchor.constraint(equalTo: readableContentGuide.leadingAnchor),
avatarImageView.bottomAnchor.constraint(lessThanOrEqualTo: readableContentGuide.bottomAnchor),
stackView.leadingAnchor.constraint(equalTo: avatarImageView.trailingAnchor, constant: Self.spacing),
stackView.topAnchor.constraint(equalTo: readableContentGuide.topAnchor),
stackView.trailingAnchor.constraint(equalTo: readableContentGuide.trailingAnchor),
stackView.bottomAnchor.constraint(equalTo: readableContentGuide.bottomAnchor)
2020-09-23 01:00:56 +00:00
])
applyAccountConfiguration()
}
func applyAccountConfiguration() {
avatarImageView.kf.setImage(with: accountConfiguration.viewModel.avatarURL)
2020-09-26 00:52:59 +00:00
if accountConfiguration.viewModel.displayName == "" {
displayNameLabel.isHidden = true
} else {
let mutableDisplayName = NSMutableAttributedString(string: accountConfiguration.viewModel.displayName)
mutableDisplayName.insert(emoji: accountConfiguration.viewModel.emoji, view: displayNameLabel)
mutableDisplayName.resizeAttachments(toLineHeight: displayNameLabel.font.lineHeight)
displayNameLabel.attributedText = mutableDisplayName
}
accountLabel.text = accountConfiguration.viewModel.accountName
let noteFont = UIFont.preferredFont(forTextStyle: .callout)
let mutableNote = NSMutableAttributedString(attributedString: accountConfiguration.viewModel.note)
let noteRange = NSRange(location: 0, length: mutableNote.length)
mutableNote.removeAttribute(.font, range: noteRange)
mutableNote.addAttributes(
[.font: noteFont as Any,
.foregroundColor: UIColor.label],
range: noteRange)
mutableNote.insert(emoji: accountConfiguration.viewModel.emoji, view: noteTextView)
mutableNote.resizeAttachments(toLineHeight: noteFont.lineHeight)
noteTextView.attributedText = mutableNote
2020-09-23 01:00:56 +00:00
}
}