From 5e949296bf350af65e52374a305dd3b5eaba6979 Mon Sep 17 00:00:00 2001 From: Chris McGraw <2454408+wargcm@users.noreply.github.com> Date: Thu, 9 May 2024 19:44:56 -0400 Subject: [PATCH 01/13] Update `ReaderTagCell` to new UI --- .../Reader/ReaderPost+Display.swift | 4 +- .../Reader/ReaderTagCardCell.swift | 8 +- .../ViewRelated/Reader/ReaderTagCell.swift | 3 + .../ViewRelated/Reader/ReaderTagCell.xib | 93 ++++++++++++------- 4 files changed, 69 insertions(+), 39 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderPost+Display.swift b/WordPress/Classes/ViewRelated/Reader/ReaderPost+Display.swift index fc4a935209f8..7945bb1b50c2 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderPost+Display.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderPost+Display.swift @@ -24,7 +24,7 @@ extension ReaderPost { } func summaryForDisplay(isPad: Bool = false) -> String? { - if featuredImageURLForDisplay() == nil || isPad { + if isPad { let content = contentForDisplay()? .stringByDecodingXMLCharacters() .replacingOccurrences(of: "
", with: "\n") @@ -33,7 +33,7 @@ extension ReaderPost { .replacingOccurrences(of: "\n{2,}", with: "\n\n", options: .regularExpression) .trim() if let content { - let maxContentLength = isPad ? 4000 : 500 + let maxContentLength = 3000 return String(content.prefix(maxContentLength)) } } diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderTagCardCell.swift b/WordPress/Classes/ViewRelated/Reader/ReaderTagCardCell.swift index d84b1d2b3c2c..a248b759a6d3 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderTagCardCell.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderTagCardCell.swift @@ -84,10 +84,10 @@ class ReaderTagCardCell: UITableViewCell { } struct Constants { - static let phoneDefaultCellSize = CGSize(width: 240, height: 297) - static let phoneLargeCellSize = CGSize(width: 240, height: 500) - static let padDefaultCellSize = CGSize(width: 480, height: 600) - static let padLargeCellSize = CGSize(width: 480, height: 900) + static let phoneDefaultCellSize = CGSize(width: 300, height: 150) + static let phoneLargeCellSize = CGSize(width: 300, height: 300) + static let padDefaultCellSize = CGSize(width: 600, height: 300) + static let padLargeCellSize = CGSize(width: 600, height: 600) } } diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderTagCell.swift b/WordPress/Classes/ViewRelated/Reader/ReaderTagCell.swift index 59e55baf4d97..25532ad3294c 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderTagCell.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderTagCell.swift @@ -10,6 +10,7 @@ class ReaderTagCell: UICollectionViewCell { @IBOutlet private weak var postDateLabel: UILabel! @IBOutlet private weak var titleLabel: UILabel! @IBOutlet private weak var summaryLabel: UILabel! + @IBOutlet private weak var featuredImageViewContainer: UIView! @IBOutlet private weak var featuredImageView: CachedAnimatedImageView! @IBOutlet private weak var countsLabel: UILabel! @IBOutlet private weak var likeButton: UIButton! @@ -90,6 +91,7 @@ private extension ReaderTagCell { func loadFeaturedImage(with post: ReaderPost) { guard let url = post.featuredImageURLForDisplay() else { + featuredImageViewContainer.isHidden = true featuredImageView.isHidden = true return } @@ -105,6 +107,7 @@ private extension ReaderTagCell { siteLabel.isHidden = false titleLabel.isHidden = false summaryLabel.isHidden = false + featuredImageViewContainer.isHidden = false featuredImageView.isHidden = false countsLabel.isHidden = false likeButton.isHidden = false diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderTagCell.xib b/WordPress/Classes/ViewRelated/Reader/ReaderTagCell.xib index fe227266f4a1..14e8aa7832d6 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderTagCell.xib +++ b/WordPress/Classes/ViewRelated/Reader/ReaderTagCell.xib @@ -1,6 +1,6 @@ - + @@ -12,23 +12,23 @@ - + - + - + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - - + + From 5452b61cf32bfc6b4e26abc4b756f41584077f5e Mon Sep 17 00:00:00 2001 From: Chris McGraw <2454408+wargcm@users.noreply.github.com> Date: Fri, 10 May 2024 15:54:00 -0400 Subject: [PATCH 03/13] Reduce stack spacing for `ReaderTagCardEmptyCell` --- .../Classes/ViewRelated/Reader/ReaderTagCardEmptyCell.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderTagCardEmptyCell.swift b/WordPress/Classes/ViewRelated/Reader/ReaderTagCardEmptyCell.swift index 3a9516e8f6c2..699ab8707ecf 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderTagCardEmptyCell.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderTagCardEmptyCell.swift @@ -55,7 +55,7 @@ private struct ReaderTagCardEmptyCellView: View { private var iconLength = 32.0 var body: some View { - VStack(spacing: .DS.Padding.double) { + VStack(spacing: .DS.Padding.single) { Image(systemName: "wifi.slash") .resizable() .frame(width: iconLength, height: iconLength) @@ -64,7 +64,7 @@ private struct ReaderTagCardEmptyCellView: View { // added to double the padding between the Image and the VStack. Spacer().frame(height: .hairlineBorderWidth) - VStack(spacing: .DS.Padding.single) { + VStack(spacing: .DS.Padding.half) { Text(Strings.title) .font(.callout) .fontWeight(.semibold) @@ -73,6 +73,7 @@ private struct ReaderTagCardEmptyCellView: View { .font(.callout) .foregroundStyle(.secondary) .multilineTextAlignment(.center) + .fixedSize(horizontal: false, vertical: true) } Button { From 98188d8cf322f0c7742528a9d81463cc403634b0 Mon Sep 17 00:00:00 2001 From: Chris McGraw <2454408+wargcm@users.noreply.github.com> Date: Fri, 10 May 2024 17:03:00 -0400 Subject: [PATCH 04/13] Update tag header button to filter feed --- .../ViewRelated/Reader/ReaderHelpers.swift | 2 ++ .../Reader/ReaderTagCardCellViewModel.swift | 15 ++++++++++++--- .../Reader/Tab Navigation/ReaderTabView.swift | 11 +++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderHelpers.swift b/WordPress/Classes/ViewRelated/Reader/ReaderHelpers.swift index d43ea891f6b4..9eb5531f24f6 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderHelpers.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderHelpers.swift @@ -22,6 +22,8 @@ extension NSNotification.Name { static let ReaderUserBlockingWillBegin = NSNotification.Name(rawValue: "ReaderUserBlockingWillBegin") // Sent when the user blocking request is complete static let ReaderUserBlockingDidEnd = NSNotification.Name(rawValue: "ReaderUserBlockingDidEnd") + // Sent when the filter from a feed is updated + static let ReaderFilterUpdated = NSNotification.Name(rawValue: "ReaderFilterUpdated") } struct ReaderNotificationKeys { diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderTagCardCellViewModel.swift b/WordPress/Classes/ViewRelated/Reader/ReaderTagCardCellViewModel.swift index 8d6c5951c02b..518e081d15ca 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderTagCardCellViewModel.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderTagCardCellViewModel.swift @@ -36,6 +36,7 @@ class ReaderTagCardCellViewModel: NSObject { let slug: String weak var viewDelegate: ReaderTagCardCellViewModelDelegate? = nil + private let tag: ReaderAbstractTopic private let coreDataStack: CoreDataStackSwift private weak var parentViewController: UIViewController? private weak var collectionView: UICollectionView? @@ -78,6 +79,7 @@ class ReaderTagCardCellViewModel: NSObject { cellSize: @escaping @autoclosure () -> CGSize?) { self.parentViewController = parent self.slug = tag.slug + self.tag = tag self.collectionView = collectionView self.isLoggedIn = isLoggedIn self.viewDelegate = viewDelegate @@ -115,11 +117,18 @@ class ReaderTagCardCellViewModel: NSObject { } func onTagButtonTapped(source: TagButtonSource) { - let controller = ReaderStreamViewController.controllerWithTagSlug(slug) - controller.statSource = .tagsFeed + switch source { + case .footer: + let controller = ReaderStreamViewController.controllerWithTagSlug(slug) + controller.statSource = .tagsFeed + parentViewController?.navigationController?.pushViewController(controller, animated: true) + case .header: + NotificationCenter.default.post(name: .ReaderFilterUpdated, + object: nil, + userInfo: [ReaderNotificationKeys.topic: tag]) + } WPAnalytics.track(source.event) - parentViewController?.navigationController?.pushViewController(controller, animated: true) } struct Constants { diff --git a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift index bebe19498dd3..4c0f1f308fae 100644 --- a/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift +++ b/WordPress/Classes/ViewRelated/Reader/Tab Navigation/ReaderTabView.swift @@ -69,6 +69,7 @@ class ReaderTabView: UIView { NotificationCenter.default.addObserver(self, selector: #selector(topicUnfollowed(_:)), name: .ReaderTopicUnfollowed, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(siteFollowed(_:)), name: .ReaderSiteFollowed, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(filterUpdated(_:)), name: .ReaderFilterUpdated, object: nil) } required init?(coder: NSCoder) { @@ -215,6 +216,16 @@ private extension ReaderTabView { viewModel.fetchReaderMenu() } + @objc func filterUpdated(_ notification: Foundation.Notification) { + guard let userInfo = notification.userInfo, + let topic = userInfo[ReaderNotificationKeys.topic] as? ReaderTagTopic, + let filterProvider = viewModel.streamFilters.first(where: { $0.reuseIdentifier == FilterProvider.ReuseIdentifiers.tags }) else { + return + } + viewModel.setFilterContent(topic: topic) + viewModel.activeStreamFilter = (filterProvider.id, topic) + } + } // MARK: - Appearance From 755b8deac5b6d756b10ab16907a9857d906a20c2 Mon Sep 17 00:00:00 2001 From: Chris McGraw <2454408+wargcm@users.noreply.github.com> Date: Fri, 10 May 2024 19:41:54 -0400 Subject: [PATCH 05/13] Update iPad cell size for `ReaderTagCell` --- .../Reader/ReaderTagCardCell.swift | 4 +-- .../ViewRelated/Reader/ReaderTagCell.xib | 34 +++++++++---------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderTagCardCell.swift b/WordPress/Classes/ViewRelated/Reader/ReaderTagCardCell.swift index a248b759a6d3..bc8ca24c7bab 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderTagCardCell.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderTagCardCell.swift @@ -86,8 +86,8 @@ class ReaderTagCardCell: UITableViewCell { struct Constants { static let phoneDefaultCellSize = CGSize(width: 300, height: 150) static let phoneLargeCellSize = CGSize(width: 300, height: 300) - static let padDefaultCellSize = CGSize(width: 600, height: 300) - static let padLargeCellSize = CGSize(width: 600, height: 600) + static let padDefaultCellSize = CGSize(width: 480, height: 206) + static let padLargeCellSize = CGSize(width: 480, height: 400) } } diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderTagCell.xib b/WordPress/Classes/ViewRelated/Reader/ReaderTagCell.xib index 14e8aa7832d6..3ffc6047ed1a 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderTagCell.xib +++ b/WordPress/Classes/ViewRelated/Reader/ReaderTagCell.xib @@ -12,14 +12,14 @@ - + - + - + - + - + - + - + - + - + - + @@ -88,7 +88,7 @@ - + - + - + - + + + From 4e99197261cb71a8d79f03390401fd05cecbadc2 Mon Sep 17 00:00:00 2001 From: Chris McGraw <2454408+wargcm@users.noreply.github.com> Date: Thu, 16 May 2024 14:11:11 -0400 Subject: [PATCH 13/13] Disable content constraints above large text --- WordPress/Classes/ViewRelated/Reader/ReaderTagCell.swift | 9 +++++++++ WordPress/Classes/ViewRelated/Reader/ReaderTagCell.xib | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderTagCell.swift b/WordPress/Classes/ViewRelated/Reader/ReaderTagCell.swift index d19ea5753cf5..1465d134b7a2 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderTagCell.swift +++ b/WordPress/Classes/ViewRelated/Reader/ReaderTagCell.swift @@ -17,6 +17,7 @@ class ReaderTagCell: UICollectionViewCell { @IBOutlet weak var spacerView: UIView! @IBOutlet weak var titleSpacerView: UIView! @IBOutlet weak var countsLabelSpacerView: UIView! + @IBOutlet private var contentBoundsConstraints: [NSLayoutConstraint]! private lazy var imageLoader = ImageLoader(imageView: featuredImageView) private var viewModel: ReaderTagCellViewModel? @@ -31,12 +32,15 @@ class ReaderTagCell: UICollectionViewCell { spacerView.isGhostableDisabled = true titleSpacerView.isGhostableDisabled = true countsLabelSpacerView.isGhostableDisabled = true + + updateContentConstraints() } override func prepareForReuse() { super.prepareForReuse() imageLoader.prepareForReuse() resetHiddenViews() + updateContentConstraints() } func configure(parent: UIViewController?, post: ReaderPost, isLoggedIn: Bool) { @@ -144,6 +148,11 @@ private extension ReaderTagCell { menuButton.accessibilityHint = AccessibilityConstants.menuButtonHint } + func updateContentConstraints() { + let isExtraLargeCategory = traitCollection.preferredContentSizeCategory >= .extraLarge + contentBoundsConstraints.forEach { $0.isActive = !isExtraLargeCategory } + } + } extension ReaderTagCell: GhostableView { diff --git a/WordPress/Classes/ViewRelated/Reader/ReaderTagCell.xib b/WordPress/Classes/ViewRelated/Reader/ReaderTagCell.xib index ff5249ab19d8..66227cbdbca8 100644 --- a/WordPress/Classes/ViewRelated/Reader/ReaderTagCell.xib +++ b/WordPress/Classes/ViewRelated/Reader/ReaderTagCell.xib @@ -161,6 +161,10 @@ + + + +