From 96c802d65cce67fa6936387de672875149073086 Mon Sep 17 00:00:00 2001 From: Alex Grebenyuk Date: Thu, 11 Sep 2025 09:03:13 -0400 Subject: [PATCH 1/4] Add Freshly Pressed --- .../WordPressKit/ReaderPostServiceRemote+Cards.swift | 1 + .../WordPressKitObjC/ReaderPostServiceRemote.m | 4 ++++ .../Controllers/ReaderDiscoverViewController.swift | 6 ++++-- .../Reader/Controllers/ReaderHelpers.swift | 12 ++++++++++++ .../Reader/Headers/ReaderDiscoverHeaderView.swift | 6 ++++++ 5 files changed, 27 insertions(+), 2 deletions(-) diff --git a/Modules/Sources/WordPressKit/ReaderPostServiceRemote+Cards.swift b/Modules/Sources/WordPressKit/ReaderPostServiceRemote+Cards.swift index e5c45ef241ef..f89a47939e4c 100644 --- a/Modules/Sources/WordPressKit/ReaderPostServiceRemote+Cards.swift +++ b/Modules/Sources/WordPressKit/ReaderPostServiceRemote+Cards.swift @@ -14,6 +14,7 @@ public enum ReaderSortingOption: String, CaseIterable { public enum ReaderStream: String { case discover = "discover" + case freshlyPressed = "freshly-pressed" case firstPosts = "first-posts" } diff --git a/Modules/Sources/WordPressKitObjC/ReaderPostServiceRemote.m b/Modules/Sources/WordPressKitObjC/ReaderPostServiceRemote.m index bfb56a7bd80d..0e28369fcbf7 100644 --- a/Modules/Sources/WordPressKitObjC/ReaderPostServiceRemote.m +++ b/Modules/Sources/WordPressKitObjC/ReaderPostServiceRemote.m @@ -40,6 +40,10 @@ - (void)fetchPostsFromEndpoint:(NSURL *)endpoint if (algorithm) { params[ParamsKeyAlgorithm] = algorithm; } + // TODO: refactor (add a new parameter + if ([endpoint.path hasSuffix:@"/freshly-pressed"]) { + [params removeAllObjects]; + } [self fetchPostsFromEndpoint:endpoint withParameters:params success:success failure:failure]; } diff --git a/WordPress/Classes/ViewRelated/Reader/Controllers/ReaderDiscoverViewController.swift b/WordPress/Classes/ViewRelated/Reader/Controllers/ReaderDiscoverViewController.swift index c03c926ab802..ddf28cda1e04 100644 --- a/WordPress/Classes/ViewRelated/Reader/Controllers/ReaderDiscoverViewController.swift +++ b/WordPress/Classes/ViewRelated/Reader/Controllers/ReaderDiscoverViewController.swift @@ -7,7 +7,7 @@ import WordPressShared class ReaderDiscoverViewController: UIViewController, ReaderDiscoverHeaderViewDelegate { private let headerView = ReaderDiscoverHeaderView() - private var selectedChannel: ReaderDiscoverChannel = .recommended + private var selectedChannel: ReaderDiscoverChannel = .freshlyPresed private let topic: ReaderAbstractTopic private var streamVC: ReaderStreamViewController? private weak var selectInterestsVC: ReaderSelectInterestsViewController? @@ -83,7 +83,7 @@ class ReaderDiscoverViewController: UIViewController, ReaderDiscoverHeaderViewDe .filter { $0.slug != ReaderTagTopic.dailyPromptTag } .map(ReaderDiscoverChannel.tag) - headerView.configure(channels: [.recommended, .firstPosts, .latest, .dailyPrompts] + channels) + headerView.configure(channels: [.freshlyPresed, .recommended, .firstPosts, .latest, .dailyPrompts] + channels) headerView.setSelectedChannel(selectedChannel) } @@ -95,6 +95,8 @@ class ReaderDiscoverViewController: UIViewController, ReaderDiscoverHeaderViewDe private func makeViewController(for channel: ReaderDiscoverChannel) -> ReaderStreamViewController { switch channel { + case .freshlyPresed: + ReaderStreamViewController.controllerWithTopic(ReaderHelpers.getFreshlyPressedTopic()) case .recommended: ReaderDiscoverStreamViewController(topic: topic) case .firstPosts: diff --git a/WordPress/Classes/ViewRelated/Reader/Controllers/ReaderHelpers.swift b/WordPress/Classes/ViewRelated/Reader/Controllers/ReaderHelpers.swift index 8802271ecfa7..b27b78d586d2 100644 --- a/WordPress/Classes/ViewRelated/Reader/Controllers/ReaderHelpers.swift +++ b/WordPress/Classes/ViewRelated/Reader/Controllers/ReaderHelpers.swift @@ -118,6 +118,18 @@ struct ReaderNotificationKeys { return topic.path.hasSuffix("/freshly-pressed") } + public static func getFreshlyPressedTopic(in context: NSManagedObjectContext = ContextManager.shared.mainContext) -> ReaderSiteTopic { + let path = "/rest/v1.2/freshly-pressed" + if let topic = try? ReaderSiteTopic.lookup(withFeedURL: path, in: context) { + return topic + } + let topic = context.insertNewObject(ofType: ReaderSiteTopic.self) + topic.feedURL = path + topic.path = path + try? context.save() + return topic + } + /// Check if the specified topic is for Discover /// /// - Parameters: diff --git a/WordPress/Classes/ViewRelated/Reader/Headers/ReaderDiscoverHeaderView.swift b/WordPress/Classes/ViewRelated/Reader/Headers/ReaderDiscoverHeaderView.swift index 3f96ded9dc00..07e6bcdbf157 100644 --- a/WordPress/Classes/ViewRelated/Reader/Headers/ReaderDiscoverHeaderView.swift +++ b/WordPress/Classes/ViewRelated/Reader/Headers/ReaderDiscoverHeaderView.swift @@ -191,6 +191,9 @@ private final class ReaderDiscoverChannelView: UIView { } enum ReaderDiscoverChannel: Hashable { + /// Curated posts. + case freshlyPresed + /// The default channel showing your selected tags. case recommended @@ -207,6 +210,8 @@ enum ReaderDiscoverChannel: Hashable { var localizedTitle: String { switch self { + case .freshlyPresed: + NSLocalizedString("reader.discover.channel.freshlyPresed", value: "Freshly Pressed", comment: "Header view channel (filter)") case .recommended: NSLocalizedString("reader.discover.channel.recommended", value: "Recommended", comment: "Header view channel (filter)") case .firstPosts: @@ -230,6 +235,7 @@ enum ReaderDiscoverChannel: Hashable { private var analyticsID: String { switch self { + case .freshlyPresed: "freshly_presed" case .recommended: "recommended" case .firstPosts: "first_posts" case .latest: "latest" From 61716039a794d8ef3a58654adf43bfdbfe02d796 Mon Sep 17 00:00:00 2001 From: Alex Grebenyuk Date: Tue, 25 Nov 2025 09:09:25 -0500 Subject: [PATCH 2/4] Remove temporary path code --- Modules/Sources/WordPressKitObjC/ReaderPostServiceRemote.m | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Modules/Sources/WordPressKitObjC/ReaderPostServiceRemote.m b/Modules/Sources/WordPressKitObjC/ReaderPostServiceRemote.m index 0e28369fcbf7..bfb56a7bd80d 100644 --- a/Modules/Sources/WordPressKitObjC/ReaderPostServiceRemote.m +++ b/Modules/Sources/WordPressKitObjC/ReaderPostServiceRemote.m @@ -40,10 +40,6 @@ - (void)fetchPostsFromEndpoint:(NSURL *)endpoint if (algorithm) { params[ParamsKeyAlgorithm] = algorithm; } - // TODO: refactor (add a new parameter - if ([endpoint.path hasSuffix:@"/freshly-pressed"]) { - [params removeAllObjects]; - } [self fetchPostsFromEndpoint:endpoint withParameters:params success:success failure:failure]; } From 5bc5dbd357c598f69e46f41a52d9bb2d52ae9fe9 Mon Sep 17 00:00:00 2001 From: Alex Grebenyuk Date: Tue, 25 Nov 2025 09:45:15 -0500 Subject: [PATCH 3/4] Add workaround for mshots --- Modules/Sources/WordPressKitObjC/RemoteReaderPost.m | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Modules/Sources/WordPressKitObjC/RemoteReaderPost.m b/Modules/Sources/WordPressKitObjC/RemoteReaderPost.m index 8035c4c6d45c..c28b528b8274 100644 --- a/Modules/Sources/WordPressKitObjC/RemoteReaderPost.m +++ b/Modules/Sources/WordPressKitObjC/RemoteReaderPost.m @@ -507,7 +507,14 @@ - (NSString *)featuredImageFromPostDictionary:(NSDictionary *)dict } - (NSString *)editorialImageFromPostDictionary:(NSDictionary *)dict { - return [dict stringForKeyPath:@"editorial.image"]; + NSString *imageURL = [dict stringForKeyPath:@"editorial.image"]; + // A workaround for https://linear.app/a8c/issue/CMM-994/reader-invalid-featured-images-for-posts-in-freshly-pressed-feed + // The app does not support `mshots` images. We also never want to show + // screenshots of posts as featured images, so it's safe to skip these. + if ([imageURL containsString:@"wp.com/mshots/"]) { + return nil; + } + return imageURL; } - (NSString *)userSpecifiedFeaturedImageFromPostDictionary:(NSDictionary *)dict { From 505077c64f1b1fbf723157324870150ec24cc98d Mon Sep 17 00:00:00 2001 From: Alex Grebenyuk Date: Fri, 28 Nov 2025 11:37:02 -0500 Subject: [PATCH 4/4] Update release notes --- RELEASE-NOTES.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 9403f69b9fff..8ce67ab86ff7 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -1,6 +1,6 @@ 26.6 ----- - +* [**] Add "Freshly Pressed" to Discover in Reader [#24828] 26.5 -----