// // ConfirmReblogStatusPreviewView.swift // Tusker // // Created by Shadowfacts on 9/17/22. // Copyright © 2022 Shadowfacts. All rights reserved. // import UIKit class ConfirmReblogStatusPreviewView: UIView { private static let htmlConverter = HTMLConverter( font: .preferredFont(forTextStyle: .caption2), monospaceFont: UIFontMetrics(forTextStyle: .caption2).scaledFont(for: .monospacedSystemFont(ofSize: 17, weight: .regular)), color: .label, paragraphStyle: .default ) private var avatarTask: Task? init(status: StatusMO) { super.init(frame: .zero) let hStack = UIStackView() hStack.axis = .horizontal hStack.spacing = 8 hStack.alignment = .leading hStack.translatesAutoresizingMaskIntoConstraints = false addSubview(hStack) NSLayoutConstraint.activate([ hStack.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 8), hStack.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -8), hStack.topAnchor.constraint(equalTo: topAnchor), hStack.bottomAnchor.constraint(equalTo: bottomAnchor), ]) let avatarSize: CGFloat = 30 let avatarImageView = UIImageView() avatarImageView.layer.masksToBounds = true avatarImageView.layer.cornerRadius = Preferences.shared.avatarStyle.cornerRadiusFraction * avatarSize hStack.addArrangedSubview(avatarImageView) NSLayoutConstraint.activate([ avatarImageView.widthAnchor.constraint(equalToConstant: avatarSize), avatarImageView.heightAnchor.constraint(equalToConstant: avatarSize), ]) if let avatar = status.account.avatar { avatarTask = Task { let (_, image) = await ImageCache.avatars.get(avatar) try Task.checkCancellation() avatarImageView.image = image } } let vStack = UIStackView() vStack.axis = .vertical vStack.spacing = 2 vStack.alignment = .fill vStack.setContentHuggingPriority(.defaultLow, for: .horizontal) hStack.addArrangedSubview(vStack) let displayNameLabel = AccountDisplayNameLabel() displayNameLabel.font = UIFont(descriptor: .preferredFontDescriptor(withTextStyle: .caption1).addingAttributes([.traits: [UIFontDescriptor.TraitKey.weight: UIFont.Weight.semibold]]), size: 0) displayNameLabel.adjustsFontSizeToFitWidth = true displayNameLabel.adjustsFontForContentSizeCategory = true displayNameLabel.updateForAccountDisplayName(account: status.account) vStack.addArrangedSubview(displayNameLabel) let contentView = StatusContentTextView() contentView.isUserInteractionEnabled = false contentView.isScrollEnabled = false contentView.backgroundColor = nil contentView.textContainerInset = .zero contentView.adjustsFontForContentSizeCategory = true // TODO: line limit contentView.setTextFrom(status: status, content: ConfirmReblogStatusPreviewView.htmlConverter.convert(status.content)) contentView.translatesAutoresizingMaskIntoConstraints = false vStack.addArrangedSubview(contentView) NSLayoutConstraint.activate([ contentView.heightAnchor.constraint(lessThanOrEqualToConstant: 200), ]) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } deinit { avatarTask?.cancel() } }