// // ProfileHeaderTableViewCell.swift // Tusker // // Created by Shadowfacts on 8/27/18. // Copyright © 2018 Shadowfacts. All rights reserved. // import UIKit import MastodonKit protocol ProfileHeaderTableViewCellDelegate: StatusTableViewCellDelegate { func showMoreOptions() } class ProfileHeaderTableViewCell: UITableViewCell, PreferencesAdaptive { var delegate: ProfileHeaderTableViewCellDelegate? @IBOutlet weak var displayNameLabel: UILabel! @IBOutlet weak var usernameLabel: UILabel! @IBOutlet weak var noteLabel: HTMLContentLabel! @IBOutlet weak var avatarContainerView: UIView! @IBOutlet weak var avatarImageView: UIImageView! @IBOutlet weak var headerImageView: UIImageView! var account: Account! var avatarURL: URL? var headerImageDownloadTask: URLSessionDataTask? override func awakeFromNib() { avatarContainerView.layer.masksToBounds = true avatarImageView.layer.masksToBounds = true avatarImageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(avatarPressed))) avatarImageView.isUserInteractionEnabled = true headerImageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(headerPressed))) headerImageView.isUserInteractionEnabled = true } func updateUIForPreferences() { avatarContainerView.layer.cornerRadius = Preferences.shared.avatarStyle.cornerRadius(for: avatarContainerView) avatarImageView.layer.cornerRadius = Preferences.shared.avatarStyle.cornerRadius(for: avatarImageView) displayNameLabel.text = account.realDisplayName } func updateUI(for account: Account) { self.account = account updateUIForPreferences() usernameLabel.text = "@\(account.acct)" avatarImageView.image = nil if let url = URL(string: account.avatar) { avatarURL = url AvatarCache.shared.get(url) { image in DispatchQueue.main.async { self.avatarImageView.image = image self.avatarURL = nil } } } if let url = URL(string: account.header) { headerImageDownloadTask = URLSession.shared.dataTask(with: url) { data, response, error in guard error == nil, let data = data, let image = UIImage(data: data) else { return } DispatchQueue.main.async { self.headerImageView.image = image self.headerImageDownloadTask = nil } } headerImageDownloadTask!.resume() } // todo: HTML parsing noteLabel.text = account.note noteLabel.delegate = self } override func prepareForReuse() { if let url = avatarURL { AvatarCache.shared.cancel(url) } } @IBAction func morePressed(_ sender: Any) { delegate?.showMoreOptions() } @objc func avatarPressed() { delegate?.showLargeImage(avatarImageView.image!, description: nil, animatingFrom: avatarImageView) } @objc func headerPressed() { delegate?.showLargeImage(headerImageView.image!, description: nil, animatingFrom: headerImageView) } } extension ProfileHeaderTableViewCell: HTMLContentLabelDelegate { func selected(mention: Mention) { delegate?.selected(mention: mention) } func selected(tag: Tag) { delegate?.selected(tag: tag) } func selected(url: URL) { delegate?.selected(url: url) } }