// // AccountTableViewCell.swift // Tusker // // Created by Shadowfacts on 9/5/19. // Copyright © 2019 Shadowfacts. All rights reserved. // import UIKit class AccountTableViewCell: UITableViewCell { weak var delegate: TuskerNavigationDelegate? var mastodonController: MastodonController! { delegate?.apiController } @IBOutlet weak var avatarImageView: UIImageView! @IBOutlet weak var displayNameLabel: UILabel! @IBOutlet weak var usernameLabel: UILabel! var accountID: String! var avatarRequest: ImageCache.Request? override func awakeFromNib() { super.awakeFromNib() avatarImageView.layer.masksToBounds = true NotificationCenter.default.addObserver(self, selector: #selector(updateUIForPrefrences), name: .preferencesChanged, object: nil) } @objc func updateUIForPrefrences() { avatarImageView.layer.cornerRadius = Preferences.shared.avatarStyle.cornerRadius(for: avatarImageView) guard let account = mastodonController.cache.account(for: accountID) else { fatalError("Missing cached account \(accountID!)") } displayNameLabel.text = account.realDisplayName } func updateUI(accountID: String) { self.accountID = accountID guard let account = mastodonController.cache.account(for: accountID) else { fatalError("Missing cached account \(accountID)") } avatarRequest = ImageCache.avatars.get(account.avatar) { [weak self] (data) in guard let self = self, let data = data, self.accountID == accountID else { return } self.avatarRequest = nil DispatchQueue.main.async { self.avatarImageView.image = UIImage(data: data) } } usernameLabel.text = "@\(account.acct)" updateUIForPrefrences() } override func prepareForReuse() { super.prepareForReuse() avatarRequest?.cancel() } } extension AccountTableViewCell: SelectableTableViewCell { func didSelectCell() { delegate?.selected(account: accountID) } } extension AccountTableViewCell: MenuPreviewProvider { var navigationDelegate: TuskerNavigationDelegate? { return delegate } func getPreviewProviders(for location: CGPoint, sourceViewController: UIViewController) -> PreviewProviders? { guard let mastodonController = mastodonController else { return nil } return ( content: { ProfileTableViewController(accountID: self.accountID, mastodonController: mastodonController) }, actions: { self.actionsForProfile(accountID: self.accountID, sourceView: self.avatarImageView) } ) } }