// // AccountTableViewCell.swift // Tusker // // Created by Shadowfacts on 9/5/19. // Copyright © 2019 Shadowfacts. All rights reserved. // import UIKit import SwiftSoup class AccountTableViewCell: UITableViewCell { weak var delegate: TuskerNavigationDelegate? var mastodonController: MastodonController! { delegate?.apiController } @IBOutlet weak var avatarImageView: UIImageView! @IBOutlet weak var displayNameLabel: EmojiLabel! @IBOutlet weak var usernameLabel: UILabel! @IBOutlet weak var noteLabel: EmojiLabel! var accountID: String! private var avatarRequest: ImageCache.Request? private var isGrayscale = false 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.persistentContainer.account(for: accountID) else { fatalError("Missing cached account \(accountID!)") } displayNameLabel.updateForAccountDisplayName(account: account) if isGrayscale != Preferences.shared.grayscaleImages { updateGrayscaleableUI(account: account) } } func updateUI(accountID: String) { self.accountID = accountID guard let account = mastodonController.persistentContainer.account(for: accountID) else { fatalError("Missing cached account \(accountID)") } usernameLabel.text = "@\(account.acct)" updateGrayscaleableUI(account: account) updateUIForPrefrences() } private func updateGrayscaleableUI(account: AccountMO) { isGrayscale = Preferences.shared.grayscaleImages let accountID = self.accountID let avatarURL = account.avatar avatarRequest = ImageCache.avatars.get(avatarURL) { [weak self] (data) in guard let self = self, let data = data, self.accountID == accountID else { return } self.avatarRequest = nil let image: UIImage? if self.isGrayscale { image = ImageGrayscalifier.convert(url: avatarURL, data: data) } else { image = UIImage(data: data) } DispatchQueue.main.async { self.avatarImageView.image = image } } let doc = try! SwiftSoup.parse(account.note) noteLabel.text = try! doc.text() noteLabel.setEmojis(account.emojis, identifier: account.id) } 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: { ProfileViewController(accountID: self.accountID, mastodonController: mastodonController) }, actions: { self.actionsForProfile(accountID: self.accountID, sourceView: self.avatarImageView) } ) } }