// // UIViewController+StatusTableViewCellDelegate.swift // Tusker // // Created by Shadowfacts on 8/27/18. // Copyright © 2018 Shadowfacts. All rights reserved. // import UIKit import MastodonKit import SafariServices extension StatusTableViewCellDelegate where Self: UIViewController { func selected(account: Account) { // don't open if the account is the same as the current one if let profileController = self as? ProfileTableViewController, profileController.account == account { return } guard let navigationController = navigationController else { fatalError("Can't show profile VC when not in navigation controller") } let vc = ProfileTableViewController.create(for: account) navigationController.pushViewController(vc, animated: true) } func selected(mention: Mention) { } func selected(tag: Tag) { } func selected(url: URL) { let vc = SFSafariViewController(url: url) present(vc, animated: true) } func selected(status: Status) { // don't open if the conversation is the same as the current one if let conversationController = self as? ConversationViewController, conversationController.mainStatus == status { return } guard let navigationController = navigationController else { fatalError("Can't show conversation VC when not in navigation controller") } let vc = ConversationViewController.create(for: status) navigationController.pushViewController(vc, animated: true) } func reply(to status: Status) { let vc = ComposeViewController.create(inReplyTo: status) present(vc, animated: true) } func showLargeImage(_ image: UIImage, description: String?, animatingFrom originView: UIView) { guard let self = self as? UIViewController & LargeImageViewControllerDelegate else { return } let vc = LargeImageViewController.create(image: image, description: description) vc.delegate = self var frame = originView.convert(originView.bounds, to: view) if let scrollView = view as? UIScrollView { let scale = scrollView.zoomScale let width = frame.width * scale let height = frame.height * scale let x = frame.minX * scale - scrollView.contentOffset.x + scrollView.frame.minX let y = frame.minY * scale - scrollView.contentOffset.y + scrollView.frame.minY frame = CGRect(x: x, y: y, width: width, height: height) } vc.originFrame = frame vc.originCornerRadius = originView.layer.cornerRadius vc.transitioningDelegate = self present(vc, animated: true) } func updatedStatus(for cell: StatusTableViewCell, status: Status) { } } extension LargeImageViewControllerDelegate where Self: UIViewController { func closeLargeImage() { dismiss(animated: true) } } extension UIViewController: UIViewControllerTransitioningDelegate { public func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { if presented is LargeImageViewController { return LargeImageExpandAnimationController() } else { return nil } } public func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { if let dismissed = dismissed as? LargeImageViewController { return LargeImageShrinkAnimationController(interactionController: dismissed.dismissInteractionController) } else { return nil } } public func interactionControllerForDismissal(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { if let animator = animator as? LargeImageShrinkAnimationController, let interactionController = animator.interactionController, interactionController.inProgress { return interactionController } else { return nil } } }