92 lines
3.6 KiB
Swift
92 lines
3.6 KiB
Swift
// Copyright © 2021 Metabolist. All rights reserved.
|
|
|
|
import Kingfisher
|
|
import UIKit
|
|
import ViewModels
|
|
|
|
final class SecondaryNavigationTitleView: UIView {
|
|
private let viewModel: NavigationViewModel
|
|
private let avatarImageView = AnimatedImageView()
|
|
private let displayNameLabel = UILabel()
|
|
private let accountLabel = UILabel()
|
|
private let stackView = UIStackView()
|
|
|
|
init(viewModel: NavigationViewModel) {
|
|
self.viewModel = viewModel
|
|
|
|
super.init(frame: .zero)
|
|
|
|
initialSetup()
|
|
applyViewModel()
|
|
}
|
|
|
|
@available(*, unavailable)
|
|
required init?(coder: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
}
|
|
|
|
private extension SecondaryNavigationTitleView {
|
|
func initialSetup() {
|
|
addSubview(avatarImageView)
|
|
avatarImageView.translatesAutoresizingMaskIntoConstraints = false
|
|
avatarImageView.layer.cornerRadius = .barButtonItemDimension / 2
|
|
avatarImageView.contentMode = .scaleAspectFill
|
|
avatarImageView.clipsToBounds = true
|
|
|
|
addSubview(stackView)
|
|
stackView.translatesAutoresizingMaskIntoConstraints = false
|
|
stackView.axis = .vertical
|
|
stackView.spacing = .ultraCompactSpacing
|
|
|
|
stackView.addArrangedSubview(displayNameLabel)
|
|
displayNameLabel.adjustsFontForContentSizeCategory = true
|
|
displayNameLabel.adjustsFontSizeToFitWidth = true
|
|
displayNameLabel.minimumScaleFactor = 0.5
|
|
displayNameLabel.font = .preferredFont(forTextStyle: .headline)
|
|
|
|
stackView.addArrangedSubview(accountLabel)
|
|
accountLabel.adjustsFontForContentSizeCategory = true
|
|
accountLabel.adjustsFontSizeToFitWidth = true
|
|
accountLabel.minimumScaleFactor = 0.5
|
|
accountLabel.font = .preferredFont(forTextStyle: .footnote)
|
|
accountLabel.textColor = .secondaryLabel
|
|
|
|
NSLayoutConstraint.activate([
|
|
avatarImageView.widthAnchor.constraint(equalToConstant: .barButtonItemDimension),
|
|
avatarImageView.heightAnchor.constraint(equalToConstant: .barButtonItemDimension),
|
|
avatarImageView.leadingAnchor.constraint(equalTo: leadingAnchor),
|
|
avatarImageView.centerYAnchor.constraint(equalTo: centerYAnchor),
|
|
stackView.leadingAnchor.constraint(equalTo: avatarImageView.trailingAnchor, constant: .defaultSpacing),
|
|
stackView.topAnchor.constraint(equalTo: topAnchor),
|
|
stackView.trailingAnchor.constraint(equalTo: trailingAnchor),
|
|
stackView.bottomAnchor.constraint(equalTo: bottomAnchor)
|
|
])
|
|
}
|
|
|
|
func applyViewModel() {
|
|
let avatarURL = viewModel.identityContext.appPreferences.animateAvatars == .everywhere
|
|
&& !viewModel.identityContext.appPreferences.shouldReduceMotion
|
|
? viewModel.identityContext.identity.account?.avatar
|
|
: viewModel.identityContext.identity.account?.avatarStatic
|
|
|
|
avatarImageView.kf.setImage(with: avatarURL)
|
|
|
|
if let displayName = viewModel.identityContext.identity.account?.displayName,
|
|
!displayName.isEmpty {
|
|
let mutableDisplayName = NSMutableAttributedString(string: displayName)
|
|
|
|
if let emojis = viewModel.identityContext.identity.account?.emojis {
|
|
mutableDisplayName.insert(emojis: emojis, view: displayNameLabel)
|
|
mutableDisplayName.resizeAttachments(toLineHeight: displayNameLabel.font.lineHeight)
|
|
}
|
|
|
|
displayNameLabel.attributedText = mutableDisplayName
|
|
} else {
|
|
displayNameLabel.isHidden = true
|
|
}
|
|
|
|
accountLabel.text = viewModel.identityContext.identity.handle
|
|
}
|
|
}
|