Tusker/Tusker/Views/Profile Header/ProfileHeaderTableViewCell....

126 lines
4.2 KiB
Swift
Raw Normal View History

2018-08-28 01:27:34 +00:00
//
// ProfileHeaderTableViewCell.swift
// Tusker
//
// Created by Shadowfacts on 8/27/18.
// Copyright © 2018 Shadowfacts. All rights reserved.
//
import UIKit
2018-09-11 14:52:21 +00:00
import Pachyderm
2018-08-28 01:27:34 +00:00
protocol ProfileHeaderTableViewCellDelegate: TuskerNavigationDelegate {
2018-08-28 21:53:59 +00:00
func showMoreOptions()
2018-08-28 01:27:34 +00:00
}
2018-08-28 23:49:31 +00:00
class ProfileHeaderTableViewCell: UITableViewCell, PreferencesAdaptive {
2018-08-28 01:27:34 +00:00
var delegate: ProfileHeaderTableViewCellDelegate?
2018-09-24 12:49:39 +00:00
@IBOutlet weak var headerImageView: UIImageView!
@IBOutlet weak var avatarContainerView: UIView!
@IBOutlet weak var avatarImageView: UIImageView!
2018-08-28 01:27:34 +00:00
@IBOutlet weak var displayNameLabel: UILabel!
@IBOutlet weak var usernameLabel: UILabel!
2018-09-24 12:49:39 +00:00
@IBOutlet weak var followsYouLabel: UILabel!
2018-08-28 01:27:34 +00:00
@IBOutlet weak var noteLabel: HTMLContentLabel!
2018-09-18 16:59:07 +00:00
var accountID: String!
2018-08-28 01:27:34 +00:00
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
2018-08-28 01:27:34 +00:00
}
2018-08-28 23:49:31 +00:00
func updateUIForPreferences() {
2018-09-18 16:59:07 +00:00
guard let account = MastodonCache.account(for: accountID) else { fatalError("Missing cached account \(accountID!)") }
2018-08-28 23:49:31 +00:00
avatarContainerView.layer.cornerRadius = Preferences.shared.avatarStyle.cornerRadius(for: avatarContainerView)
avatarImageView.layer.cornerRadius = Preferences.shared.avatarStyle.cornerRadius(for: avatarImageView)
displayNameLabel.text = account.realDisplayName
2018-08-28 23:49:31 +00:00
}
2018-09-18 16:59:07 +00:00
func updateUI(for accountID: String) {
self.accountID = accountID
guard let account = MastodonCache.account(for: accountID) else { fatalError("Missing cached account \(accountID)") }
2018-08-28 01:27:34 +00:00
2018-08-28 23:49:31 +00:00
updateUIForPreferences()
2018-08-28 01:27:34 +00:00
usernameLabel.text = "@\(account.acct)"
avatarImageView.image = nil
2018-09-11 14:52:21 +00:00
avatarURL = account.avatar
AvatarCache.shared.get(account.avatar) { image in
DispatchQueue.main.async {
self.avatarImageView.image = image
self.avatarURL = nil
2018-08-28 01:27:34 +00:00
}
}
2018-09-11 14:52:21 +00:00
headerImageDownloadTask = URLSession.shared.dataTask(with: account.header) { 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
2018-08-28 01:27:34 +00:00
}
}
2018-09-11 14:52:21 +00:00
headerImageDownloadTask!.resume()
2018-08-28 01:27:34 +00:00
// todo: HTML parsing
noteLabel.text = account.note
noteLabel.delegate = self
2018-09-24 12:49:39 +00:00
if let relationship = MastodonCache.relationship(for: accountID) {
followsYouLabel.isHidden = !relationship.followedBy
} else {
MastodonCache.relationship(for: accountID) { relationship in
DispatchQueue.main.async {
self.followsYouLabel.isHidden = !(relationship?.followedBy ?? false)
}
}
}
2018-08-28 01:27:34 +00:00
}
override func prepareForReuse() {
if let url = avatarURL {
AvatarCache.shared.cancel(url)
}
}
2018-08-28 21:53:59 +00:00
@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)
}
2018-08-28 01:27:34 +00:00
}
extension ProfileHeaderTableViewCell: HTMLContentLabelDelegate {
func selected(mention: Mention) {
delegate?.selected(mention: mention)
}
2018-09-11 14:52:21 +00:00
func selected(tag: Hashtag) {
2018-08-28 01:27:34 +00:00
delegate?.selected(tag: tag)
}
func selected(url: URL) {
delegate?.selected(url: url)
}
}