|
| 1 | +import AsyncImageKit |
1 | 2 | import Foundation |
| 3 | +import SafariServices |
| 4 | +import SwiftUI |
2 | 5 | import WordPressData |
3 | 6 | import WordPressReader |
4 | 7 | import WordPressShared |
@@ -466,7 +469,7 @@ class ReaderDetailCoordinator { |
466 | 469 | WPAppAnalytics.track(.readerSitePreviewed, withProperties: properties) |
467 | 470 | } |
468 | 471 |
|
469 | | - private func showTopic(_ topic: String) { |
| 472 | + func showTopic(_ topic: String) { |
470 | 473 | let controller = ReaderStreamViewController.controllerWithTagSlug(topic) |
471 | 474 | controller.trackingContext.source = ScreenTrackingSource(ScreenID.Reader.article, component: ElementID.Reader.tagChip) |
472 | 475 | viewController?.navigationController?.pushViewController(controller, animated: true) |
@@ -534,7 +537,7 @@ class ReaderDetailCoordinator { |
534 | 537 | scrollToHashIfNeeded() |
535 | 538 | } |
536 | 539 |
|
537 | | - private func followSite(completion: @escaping () -> Void) { |
| 540 | + private func toggleFollowSite(completion: @escaping () -> Void) { |
538 | 541 | guard let post else { |
539 | 542 | return |
540 | 543 | } |
@@ -691,28 +694,48 @@ class ReaderDetailCoordinator { |
691 | 694 | } |
692 | 695 | } |
693 | 696 |
|
694 | | -// MARK: - ReaderDetailHeaderViewDelegate |
695 | | -extension ReaderDetailCoordinator: ReaderDetailHeaderViewDelegate { |
696 | | - func didTapBlogName() { |
697 | | - previewSite() |
698 | | - } |
699 | | - |
700 | | - func didTapTagButton() { |
701 | | - showTag() |
702 | | - } |
703 | | - |
704 | | - func didTapHeaderAvatar() { |
705 | | - previewSite() |
| 697 | +// MARK: - ReaderPostHeaderViewDelegate |
| 698 | +extension ReaderDetailCoordinator: ReaderPostHeaderViewDelegate { |
| 699 | + func readerPostHeaderView(_ view: ReaderPostHeaderView, didTap element: ReaderPostHeaderView.Element) { |
| 700 | + switch element { |
| 701 | + case .siteName: |
| 702 | + previewSite() |
| 703 | + case .subscribe: |
| 704 | + view.isShowingSubscribeLoadingIndicator = true |
| 705 | + toggleFollowSite { [weak self] in |
| 706 | + view.isShowingSubscribeLoadingIndicator = false |
| 707 | + self?.view?.updateHeader() |
| 708 | + } |
| 709 | + case .author: |
| 710 | + showAuthorProfile() |
| 711 | + case .featuredImage: |
| 712 | + showFeaturedImage(view.featuredImageView) |
| 713 | + } |
706 | 714 | } |
707 | 715 |
|
708 | | - func didTapFollowButton(completion: @escaping () -> Void) { |
709 | | - followSite(completion: completion) |
| 716 | + private func showFeaturedImage(_ sender: AsyncImageView) { |
| 717 | + guard let post, let imageURL = post.featuredImage.flatMap(URL.init) else { |
| 718 | + return |
| 719 | + } |
| 720 | + let lightboxVC = LightboxViewController(sourceURL: imageURL, host: MediaHost(post)) |
| 721 | + MainActor.assumeIsolated { |
| 722 | + lightboxVC.thumbnail = sender.image |
| 723 | + } |
| 724 | + lightboxVC.configureZoomTransition(sourceView: sender) |
| 725 | + viewController?.present(lightboxVC, animated: true) |
710 | 726 | } |
711 | 727 |
|
712 | | - func didSelectTopic(_ topic: String) { |
713 | | - showTopic(topic) |
| 728 | + private func showAuthorProfile() { |
| 729 | + guard let post else { return } |
| 730 | + let viewModel = ReaderUserProfileViewModel(post: post) |
| 731 | + let profileVC = UIHostingController(rootView: ReaderUserProfileView(viewModel: viewModel)) |
| 732 | + let navigationVC = UINavigationController(rootViewController: profileVC) |
| 733 | + profileVC.navigationItem.leftBarButtonItem = UIBarButtonItem(systemItem: .close, primaryAction: .init { [weak profileVC] _ in |
| 734 | + profileVC?.presentingViewController?.dismiss(animated: true) |
| 735 | + }) |
| 736 | + navigationVC.sheetPresentationController?.detents = [.medium()] |
| 737 | + viewController?.present(navigationVC, animated: true) |
714 | 738 | } |
715 | | - |
716 | 739 | } |
717 | 740 |
|
718 | 741 | extension ReaderDetailCoordinator: ReaderDetailLikesViewDelegate { |
|
0 commit comments