// // ConversationMainStatusTableViewCell.swift // Tusker // // Created by Shadowfacts on 8/28/18. // Copyright © 2018 Shadowfacts. All rights reserved. // import UIKit import Combine import Pachyderm class ConversationMainStatusTableViewCell: BaseStatusTableViewCell { static let dateFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateStyle = .medium formatter.timeStyle = .medium return formatter }() @IBOutlet weak var profileDetailContainerView: UIView! @IBOutlet weak var favoriteAndReblogCountStackView: UIStackView! @IBOutlet weak var totalFavoritesButton: UIButton! @IBOutlet weak var totalReblogsButton: UIButton! @IBOutlet weak var timestampAndClientLabel: UILabel! var profileAccessibilityElement: UIAccessibilityElement! override func awakeFromNib() { super.awakeFromNib() profileAccessibilityElement = UIAccessibilityElement(accessibilityContainer: self) profileAccessibilityElement.accessibilityFrameInContainerSpace = profileDetailContainerView.convert(profileDetailContainerView.frame, to: self) accessibilityElements = [ profileAccessibilityElement!, contentWarningLabel!, collapseButton!, contentTextView!, attachmentsView!, pollView!, totalFavoritesButton!, totalReblogsButton!, timestampAndClientLabel!, replyButton!, favoriteButton!, reblogButton!, moreButton!, ] contentTextView.defaultFont = .systemFont(ofSize: 18) profileDetailContainerView.addInteraction(UIContextMenuInteraction(delegate: self)) } override func doUpdateUI(status: StatusMO, state: StatusState) { super.doUpdateUI(status: status, state: state) var timestampAndClientText = ConversationMainStatusTableViewCell.dateFormatter.string(from: status.createdAt) if let application = status.applicationName { timestampAndClientText += " • \(application)" } timestampAndClientLabel.text = timestampAndClientText } override func updateStatusState(status: StatusMO) { super.updateStatusState(status: status) // todo: localize me totalFavoritesButton.setTitle("\(status.favouritesCount) Favorite\(status.favouritesCount == 1 ? "" : "s")", for: .normal) totalReblogsButton.setTitle("\(status.reblogsCount) Reblog\(status.reblogsCount == 1 ? "" : "s")", for: .normal) } override func updateUI(account: AccountMO) { super.updateUI(account: account) profileAccessibilityElement.accessibilityLabel = account.displayNameWithoutCustomEmoji } override func updateUIForPreferences(account: AccountMO, status: StatusMO) { super.updateUIForPreferences(account: account, status: status) favoriteAndReblogCountStackView.isHidden = !Preferences.shared.showFavoriteAndReblogCounts } @IBAction func totalFavoritesPressed() { if let delegate = delegate { // accounts aren't known, pass nil so the VC will load them let vc = delegate.statusActionAccountList(action: .favorite, statusID: statusID, statusState: statusState.copy(), accountIDs: nil) vc.showInacurateCountWarning = true delegate.show(vc) } } @IBAction func totalReblogsPressed() { if let delegate = delegate { // accounts aren't known, pass nil so the VC will load them let vc = delegate.statusActionAccountList(action: .reblog, statusID: statusID, statusState: statusState.copy(), accountIDs: nil) vc.showInacurateCountWarning = true delegate.show(vc) } } } extension ConversationMainStatusTableViewCell: UIContextMenuInteractionDelegate { func contextMenuInteraction(_ interaction: UIContextMenuInteraction, configurationForMenuAtLocation location: CGPoint) -> UIContextMenuConfiguration? { return UIContextMenuConfiguration(identifier: nil) { ProfileViewController(accountID: self.accountID, mastodonController: self.mastodonController) } actionProvider: { (_) in return UIMenu(title: "", image: nil, identifier: nil, options: [], children: self.actionsForProfile(accountID: self.accountID, sourceView: self.avatarImageView)) } } }