From e7e578940c1d6edb2ed6f22646e076b311873f2b Mon Sep 17 00:00:00 2001 From: kean Date: Thu, 9 Jan 2025 14:41:47 -0500 Subject: [PATCH 01/10] Fix l10n typo --- .../Reader/Controllers/ReaderPostActions/ReaderPostMenu.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Reader/Controllers/ReaderPostActions/ReaderPostMenu.swift b/WordPress/Classes/ViewRelated/Reader/Controllers/ReaderPostActions/ReaderPostMenu.swift index 42fa44f212a2..bf629cf820e3 100644 --- a/WordPress/Classes/ViewRelated/Reader/Controllers/ReaderPostActions/ReaderPostMenu.swift +++ b/WordPress/Classes/ViewRelated/Reader/Controllers/ReaderPostActions/ReaderPostMenu.swift @@ -214,7 +214,7 @@ private enum Strings { static let viewInBrowser = NSLocalizedString("reader.postContextMenu.viewInBrowser", value: "View in Browser", comment: "Context menu action") static let blockOrReport = NSLocalizedString("reader.postContextMenu.blockOrReportMenu", value: "Block or Report", comment: "Context menu action") static let goToBlog = NSLocalizedString("reader.postContextMenu.showBlog", value: "Go to Blog", comment: "Context menu action") - static let subscribe = NSLocalizedString("reader.postContextMenu.subscribeT", value: "Subscribe", comment: "Context menu action") + static let subscribe = NSLocalizedString("reader.postContextMenu.subscribe", value: "Subscribe", comment: "Context menu action") static let unsubscribe = NSLocalizedString("reader.postContextMenu.unsubscribe", value: "Unsubscribe", comment: "Context menu action") static let manageNotifications = NSLocalizedString("reader.postContextMenu.manageNotifications", value: "Manage Notifications", comment: "Context menu action") static let blogDetails = NSLocalizedString("reader.postContextMenu.blogDetails", value: "Blog Details", comment: "Context menu action (placeholder value when blog name not available – should never happen)") From 77e064b751cfda4e1ed6bc7fb0272dc56355370d Mon Sep 17 00:00:00 2001 From: kean Date: Thu, 9 Jan 2025 14:48:00 -0500 Subject: [PATCH 02/10] Add Unsubscribe context menu to Reader sidebar sites --- WordPress/Classes/Utility/SharedStrings.swift | 2 ++ .../Controllers/ReaderPostActions/ReaderPostMenu.swift | 6 ++---- .../Sidebar/ReaderSidebarSubscriptionsSection.swift | 10 ++++++++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/WordPress/Classes/Utility/SharedStrings.swift b/WordPress/Classes/Utility/SharedStrings.swift index 628c684947b1..46628c8b667e 100644 --- a/WordPress/Classes/Utility/SharedStrings.swift +++ b/WordPress/Classes/Utility/SharedStrings.swift @@ -29,6 +29,8 @@ enum SharedStrings { /// - warning: This is the legacy value. It's not compliant with the new format but has the correct translation for different languages. static let title = NSLocalizedString("Reader", comment: "The accessibility value of the Reader tab.") static let unfollow = NSLocalizedString("reader.button.unfollow", value: "Unfollow", comment: "Reader sidebar button title") + static let subscribe = NSLocalizedString("reader.button.subscribe", value: "Subscribe", comment: "Context menu action") + static let unsubscribe = NSLocalizedString("reader.button.unsubscribe", value: "Unsubscribe", comment: "Context menu action") static let recent = NSLocalizedString("reader.recent.title", value: "Recent", comment: "Used in multiple contexts, usually as a screen title") static let discover = NSLocalizedString("reader.discover.title", value: "Discover", comment: "Used in multiple contexts, usually as a screen title") static let saved = NSLocalizedString("reader.saved.title", value: "Saved", comment: "Used in multiple contexts, usually as a screen title") diff --git a/WordPress/Classes/ViewRelated/Reader/Controllers/ReaderPostActions/ReaderPostMenu.swift b/WordPress/Classes/ViewRelated/Reader/Controllers/ReaderPostActions/ReaderPostMenu.swift index bf629cf820e3..6bd3e5d084fe 100644 --- a/WordPress/Classes/ViewRelated/Reader/Controllers/ReaderPostActions/ReaderPostMenu.swift +++ b/WordPress/Classes/ViewRelated/Reader/Controllers/ReaderPostActions/ReaderPostMenu.swift @@ -87,7 +87,7 @@ struct ReaderPostMenu { } private var subscribe: UIAction { - UIAction(Strings.subscribe, systemImage: "plus.circle") { + UIAction(SharedStrings.Reader.subscribe, systemImage: "plus.circle") { ReaderSubscriptionHelper().toggleSiteSubscription(forPost: post) track(.subscribe) } @@ -102,7 +102,7 @@ struct ReaderPostMenu { } private var ubsubscribe: UIAction { - UIAction(Strings.unsubscribe, systemImage: "minus.circle", attributes: [.destructive]) { + UIAction(SharedStrings.Reader.unsubscribe, systemImage: "minus.circle", attributes: [.destructive]) { ReaderSubscriptionHelper().toggleSiteSubscription(forPost: post) track(.unsubscribe) } @@ -214,8 +214,6 @@ private enum Strings { static let viewInBrowser = NSLocalizedString("reader.postContextMenu.viewInBrowser", value: "View in Browser", comment: "Context menu action") static let blockOrReport = NSLocalizedString("reader.postContextMenu.blockOrReportMenu", value: "Block or Report", comment: "Context menu action") static let goToBlog = NSLocalizedString("reader.postContextMenu.showBlog", value: "Go to Blog", comment: "Context menu action") - static let subscribe = NSLocalizedString("reader.postContextMenu.subscribe", value: "Subscribe", comment: "Context menu action") - static let unsubscribe = NSLocalizedString("reader.postContextMenu.unsubscribe", value: "Unsubscribe", comment: "Context menu action") static let manageNotifications = NSLocalizedString("reader.postContextMenu.manageNotifications", value: "Manage Notifications", comment: "Context menu action") static let blogDetails = NSLocalizedString("reader.postContextMenu.blogDetails", value: "Blog Details", comment: "Context menu action (placeholder value when blog name not available – should never happen)") static let blockSite = NSLocalizedString("reader.postContextMenu.blockSite", value: "Block Site", comment: "Context menu action") diff --git a/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift b/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift index 40a6100cd2ac..d50c237a8fdd 100644 --- a/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift +++ b/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift @@ -13,8 +13,14 @@ struct ReaderSidebarSubscriptionsSection: View { private var subscriptions: FetchedResults var body: some View { - ForEach(subscriptions, id: \.self) { - ReaderSidebarSubscriptionCell(site: $0) + ForEach(subscriptions, id: \.self) { site in + ReaderSidebarSubscriptionCell(site: site) + .contextMenu { + Button(SharedStrings.Reader.unsubscribe, systemImage: "minus.circle", role: .destructive) { + ReaderSubscriptionHelper().unfollow(site) + } + } + } .onDelete(perform: delete) } From 213a34f7c15e1f3d0c22bf1930a44f38840b00ec Mon Sep 17 00:00:00 2001 From: kean Date: Thu, 9 Jan 2025 14:58:05 -0500 Subject: [PATCH 03/10] Extract ReaderSiteFavoriteButton --- WordPress/Classes/Utility/SharedStrings.swift | 6 ++- .../ReaderSidebarSubscriptionsSection.swift | 37 ++++++++++++------- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/WordPress/Classes/Utility/SharedStrings.swift b/WordPress/Classes/Utility/SharedStrings.swift index 46628c8b667e..c1594a08cede 100644 --- a/WordPress/Classes/Utility/SharedStrings.swift +++ b/WordPress/Classes/Utility/SharedStrings.swift @@ -29,8 +29,10 @@ enum SharedStrings { /// - warning: This is the legacy value. It's not compliant with the new format but has the correct translation for different languages. static let title = NSLocalizedString("Reader", comment: "The accessibility value of the Reader tab.") static let unfollow = NSLocalizedString("reader.button.unfollow", value: "Unfollow", comment: "Reader sidebar button title") - static let subscribe = NSLocalizedString("reader.button.subscribe", value: "Subscribe", comment: "Context menu action") - static let unsubscribe = NSLocalizedString("reader.button.unsubscribe", value: "Unsubscribe", comment: "Context menu action") + static let subscribe = NSLocalizedString("reader.button.subscribe", value: "Subscribe", comment: "A shared button title for Reader") + static let unsubscribe = NSLocalizedString("reader.button.unsubscribe", value: "Unsubscribe", comment: "A shared button title for Reader") + static let addToFavorites = NSLocalizedString("reader.button.addToFavorites", value: "Add to Favorites", comment: "A shared button title for Reader") + static let removeFromFavorites = NSLocalizedString("reader.button.removeFromFavorites", value: "Remove from Favorites", comment: "A shared button title for Reader") static let recent = NSLocalizedString("reader.recent.title", value: "Recent", comment: "Used in multiple contexts, usually as a screen title") static let discover = NSLocalizedString("reader.discover.title", value: "Discover", comment: "Used in multiple contexts, usually as a screen title") static let saved = NSLocalizedString("reader.saved.title", value: "Saved", comment: "Used in multiple contexts, usually as a screen title") diff --git a/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift b/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift index d50c237a8fdd..d75000b4fe6f 100644 --- a/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift +++ b/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift @@ -46,20 +46,8 @@ struct ReaderSidebarSubscriptionCell: View { } if editMode?.wrappedValue.isEditing == true { Spacer() - Button { - if !site.showInMenu { - WPAnalytics.track(.readerAddSiteToFavoritesTapped) - } - - let siteObjectID = TaggedManagedObjectID(site) - ContextManager.shared.performAndSave({ managedObjectContext in - let site = try managedObjectContext.existingObject(with: siteObjectID) - site.showInMenu.toggle() - }, completion: nil, on: DispatchQueue.main) - } label: { - Image(systemName: site.showInMenu ? "star.fill" : "star") - .foregroundStyle(site.showInMenu ? .pink : .secondary) - }.buttonStyle(.plain) + ReaderSiteFavoriteButton(site: site, source: "edit_mode") + .labelStyle(.iconOnly) } } .lineLimit(1) @@ -71,3 +59,24 @@ struct ReaderSidebarSubscriptionCell: View { } } } + +struct ReaderSiteFavoriteButton: View { + let site: ReaderSiteTopic + let source: String + + var body: some View { + Button { + if !site.showInMenu { + WPAnalytics.track(.readerAddSiteToFavoritesTapped, properties: ["via": source]) + } + let siteObjectID = TaggedManagedObjectID(site) + ContextManager.shared.performAndSave({ managedObjectContext in + let site = try managedObjectContext.existingObject(with: siteObjectID) + site.showInMenu.toggle() + }, completion: nil, on: DispatchQueue.main) + } label: { + Label(site.showInMenu ? SharedStrings.Reader.removeFromFavorites : SharedStrings.Reader.addToFavorites, systemImage: site.showInMenu ? "star.fill" : "star") + .foregroundStyle(site.showInMenu ? .pink : .secondary) + }.buttonStyle(.plain) + } +} From bdc9f92af8f4621b614fc84a7d79c5f968effce8 Mon Sep 17 00:00:00 2001 From: kean Date: Thu, 9 Jan 2025 15:03:26 -0500 Subject: [PATCH 04/10] Move actions to ReaderSidebarSubscriptionCell --- .../ReaderSidebarSubscriptionsSection.swift | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift b/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift index d75000b4fe6f..8a4f31847fae 100644 --- a/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift +++ b/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift @@ -13,14 +13,8 @@ struct ReaderSidebarSubscriptionsSection: View { private var subscriptions: FetchedResults var body: some View { - ForEach(subscriptions, id: \.self) { site in - ReaderSidebarSubscriptionCell(site: site) - .contextMenu { - Button(SharedStrings.Reader.unsubscribe, systemImage: "minus.circle", role: .destructive) { - ReaderSubscriptionHelper().unfollow(site) - } - } - + ForEach(subscriptions, id: \.self) { + ReaderSidebarSubscriptionCell(site: $0) } .onDelete(perform: delete) } @@ -57,6 +51,12 @@ struct ReaderSidebarSubscriptionCell: View { ReaderSubscriptionHelper().unfollow(site) }.tint(.red) } + .contextMenu { + ReaderSiteFavoriteButton(site: site, source: "context_menu") + Button(SharedStrings.Reader.unsubscribe, systemImage: "minus.circle", role: .destructive) { + ReaderSubscriptionHelper().unfollow(site) + } + } } } From 2ccb1ad5bef7a39c914bff2d32f1e08e9cc01a88 Mon Sep 17 00:00:00 2001 From: kean Date: Thu, 9 Jan 2025 15:08:54 -0500 Subject: [PATCH 05/10] Extract ReaderSubscriptionContextMenu and add Share --- .../ReaderSidebarSubscriptionsSection.swift | 28 +++++++++++++++++-- .../ReaderSubscriptionCell.swift | 9 +----- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift b/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift index 8a4f31847fae..8c5490fe2700 100644 --- a/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift +++ b/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift @@ -40,27 +40,49 @@ struct ReaderSidebarSubscriptionCell: View { } if editMode?.wrappedValue.isEditing == true { Spacer() - ReaderSiteFavoriteButton(site: site, source: "edit_mode") + ReaderSiteToggleFavoriteButton(site: site, source: "edit_mode") .labelStyle(.iconOnly) } } .lineLimit(1) .tag(ReaderSidebarItem.subscription(TaggedManagedObjectID(site))) + .swipeActions(edge: .leading) { + if let siteURL = URL(string: site.siteURL) { + ShareLink(item: siteURL).tint(.blue) + } + } .swipeActions(edge: .trailing) { Button(SharedStrings.Reader.unfollow, role: .destructive) { ReaderSubscriptionHelper().unfollow(site) }.tint(.red) } .contextMenu { - ReaderSiteFavoriteButton(site: site, source: "context_menu") + ReaderSubscriptionContextMenu(site: site) + } + } +} + +struct ReaderSubscriptionContextMenu: View { + let site: ReaderSiteTopic + + var body: some View { + if let siteURL = URL(string: site.siteURL) { + ShareLink(item: siteURL) + } + if site.following { + ReaderSiteToggleFavoriteButton(site: site, source: "context_menu") Button(SharedStrings.Reader.unsubscribe, systemImage: "minus.circle", role: .destructive) { ReaderSubscriptionHelper().unfollow(site) } + } else { + Button(SharedStrings.Reader.subscribe, systemImage: "plus.circle") { + ReaderSubscriptionHelper().toggleFollowingForSite(site) + } } } } -struct ReaderSiteFavoriteButton: View { +struct ReaderSiteToggleFavoriteButton: View { let site: ReaderSiteTopic let source: String diff --git a/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionCell.swift b/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionCell.swift index 49575ab2542f..b3f7a76555a6 100644 --- a/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionCell.swift +++ b/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionCell.swift @@ -84,14 +84,7 @@ struct ReaderSubscriptionCell: View { private var buttonMore: some View { Menu { - if let siteURL = URL(string: site.siteURL) { - ShareLink(item: siteURL) - } - Button(role: .destructive) { - onDelete(site) - } label: { - Label(SharedStrings.Reader.unfollow, systemImage: "trash") - } + ReaderSubscriptionContextMenu(site: site) } label: { Image(systemName: "ellipsis") .foregroundStyle(.secondary) From da29a35033fc12773ac975fc7105353245725ffe Mon Sep 17 00:00:00 2001 From: kean Date: Thu, 9 Jan 2025 15:21:50 -0500 Subject: [PATCH 06/10] Add Notification Settings and Copy Link buttons --- WordPress/Classes/Utility/SharedStrings.swift | 1 + .../ReaderSidebarSubscriptionsSection.swift | 14 +++++++++++++- .../Subscriptions/ReaderSubscriptionCell.swift | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/Utility/SharedStrings.swift b/WordPress/Classes/Utility/SharedStrings.swift index c1594a08cede..32c4c32adcc8 100644 --- a/WordPress/Classes/Utility/SharedStrings.swift +++ b/WordPress/Classes/Utility/SharedStrings.swift @@ -32,6 +32,7 @@ enum SharedStrings { static let subscribe = NSLocalizedString("reader.button.subscribe", value: "Subscribe", comment: "A shared button title for Reader") static let unsubscribe = NSLocalizedString("reader.button.unsubscribe", value: "Unsubscribe", comment: "A shared button title for Reader") static let addToFavorites = NSLocalizedString("reader.button.addToFavorites", value: "Add to Favorites", comment: "A shared button title for Reader") + static let notificationSettings = NSLocalizedString("reader.button.notificationSettings", value: "Notification Settings", comment: "A shared button title for Reader") static let removeFromFavorites = NSLocalizedString("reader.button.removeFromFavorites", value: "Remove from Favorites", comment: "A shared button title for Reader") static let recent = NSLocalizedString("reader.recent.title", value: "Recent", comment: "Used in multiple contexts, usually as a screen title") static let discover = NSLocalizedString("reader.discover.title", value: "Discover", comment: "Used in multiple contexts, usually as a screen title") diff --git a/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift b/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift index 8c5490fe2700..5ad0ce885afa 100644 --- a/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift +++ b/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift @@ -30,6 +30,7 @@ struct ReaderSidebarSubscriptionsSection: View { struct ReaderSidebarSubscriptionCell: View { @ObservedObject var site: ReaderSiteTopic @Environment(\.editMode) var editMode + @State private var isShowingSettings = false var body: some View { HStack { @@ -57,7 +58,10 @@ struct ReaderSidebarSubscriptionCell: View { }.tint(.red) } .contextMenu { - ReaderSubscriptionContextMenu(site: site) + ReaderSubscriptionContextMenu(site: site, isShowingSettings: $isShowingSettings) + } + .sheet(isPresented: $isShowingSettings) { + ReaderSubscriptionNotificationSettingsView(siteID: site.siteID.intValue) } } } @@ -65,12 +69,20 @@ struct ReaderSidebarSubscriptionCell: View { struct ReaderSubscriptionContextMenu: View { let site: ReaderSiteTopic + @Binding var isShowingSettings: Bool + var body: some View { if let siteURL = URL(string: site.siteURL) { ShareLink(item: siteURL) + Button(SharedStrings.Button.copyLink, systemImage: "doc.on.doc") { + UIPasteboard.general.string = siteURL.absoluteString + } } if site.following { ReaderSiteToggleFavoriteButton(site: site, source: "context_menu") + Button(SharedStrings.Reader.notificationSettings, systemImage: "bell") { + isShowingSettings = true + } Button(SharedStrings.Reader.unsubscribe, systemImage: "minus.circle", role: .destructive) { ReaderSubscriptionHelper().unfollow(site) } diff --git a/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionCell.swift b/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionCell.swift index b3f7a76555a6..0dd5d788bf8f 100644 --- a/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionCell.swift +++ b/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionCell.swift @@ -84,7 +84,7 @@ struct ReaderSubscriptionCell: View { private var buttonMore: some View { Menu { - ReaderSubscriptionContextMenu(site: site) + ReaderSubscriptionContextMenu(site: site, isShowingSettings: $isShowingSettings) } label: { Image(systemName: "ellipsis") .foregroundStyle(.secondary) From 9c8b6dffcf48806a156291051cffc42dd6cf72be Mon Sep 17 00:00:00 2001 From: kean Date: Thu, 9 Jan 2025 15:22:55 -0500 Subject: [PATCH 07/10] Add context menu for sites in Subscriptions view --- .../Reader/Subscriptions/ReaderSubscriptionCell.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionCell.swift b/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionCell.swift index 0dd5d788bf8f..c8f13b4d8d3f 100644 --- a/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionCell.swift +++ b/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionCell.swift @@ -43,6 +43,9 @@ struct ReaderSubscriptionCell: View { } buttonMore } + .contextMenu { + ReaderSubscriptionContextMenu(site: site, isShowingSettings: $isShowingSettings) + } } private func makeButtonNotificationSettings(with status: ReaderSubscriptionNotificationsStatus) -> some View { From 899ec82d0860b4794525f67377f8f8c51209c5c8 Mon Sep 17 00:00:00 2001 From: kean Date: Thu, 9 Jan 2025 15:27:15 -0500 Subject: [PATCH 08/10] Add previews --- .../ReaderSidebarSubscriptionsSection.swift | 18 ++++++++++++++++-- .../Subscriptions/ReaderSubscriptionCell.swift | 6 ++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift b/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift index 5ad0ce885afa..8a56583a2dca 100644 --- a/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift +++ b/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift @@ -57,9 +57,11 @@ struct ReaderSidebarSubscriptionCell: View { ReaderSubscriptionHelper().unfollow(site) }.tint(.red) } - .contextMenu { + .contextMenu(menuItems: { ReaderSubscriptionContextMenu(site: site, isShowingSettings: $isShowingSettings) - } + }, preview: { + ReaderTopicPreviewView(topic: site) + }) .sheet(isPresented: $isShowingSettings) { ReaderSubscriptionNotificationSettingsView(siteID: site.siteID.intValue) } @@ -94,6 +96,18 @@ struct ReaderSubscriptionContextMenu: View { } } +struct ReaderTopicPreviewView: UIViewControllerRepresentable { + let topic: ReaderAbstractTopic + + func makeUIViewController(context: Context) -> ReaderStreamViewController { + ReaderStreamViewController.controllerWithTopic(topic) + } + + func updateUIViewController(_ vc: ReaderStreamViewController, context: Context) { + // Do nothing + } +} + struct ReaderSiteToggleFavoriteButton: View { let site: ReaderSiteTopic let source: String diff --git a/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionCell.swift b/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionCell.swift index c8f13b4d8d3f..f0aa8e01771f 100644 --- a/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionCell.swift +++ b/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionCell.swift @@ -43,9 +43,11 @@ struct ReaderSubscriptionCell: View { } buttonMore } - .contextMenu { + .contextMenu(menuItems: { ReaderSubscriptionContextMenu(site: site, isShowingSettings: $isShowingSettings) - } + }, preview: { + ReaderTopicPreviewView(topic: site) + }) } private func makeButtonNotificationSettings(with status: ReaderSubscriptionNotificationsStatus) -> some View { From ac046d0a1c894328230ecbbaf2fb27cd951dc89d Mon Sep 17 00:00:00 2001 From: kean Date: Thu, 9 Jan 2025 15:33:10 -0500 Subject: [PATCH 09/10] Fix notification settings sometimes being clipped on iPad --- .../ReaderSidebarSubscriptionsSection.swift | 1 + .../ReaderSubscriptionCell.swift | 13 +++--------- ...SubscriptionNotificationSettingsView.swift | 20 ++++++------------- 3 files changed, 10 insertions(+), 24 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift b/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift index 8a56583a2dca..a89275cb4cd1 100644 --- a/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift +++ b/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift @@ -64,6 +64,7 @@ struct ReaderSidebarSubscriptionCell: View { }) .sheet(isPresented: $isShowingSettings) { ReaderSubscriptionNotificationSettingsView(siteID: site.siteID.intValue) + .presentationDetents([.medium, .large]) } } } diff --git a/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionCell.swift b/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionCell.swift index f0aa8e01771f..655fbac5501b 100644 --- a/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionCell.swift +++ b/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionCell.swift @@ -73,17 +73,9 @@ struct ReaderSubscriptionCell: View { .padding(.trailing, 6) } .buttonStyle(.plain) - .popover(isPresented: $isShowingSettings) { settings } - } - - @ViewBuilder - private var settings: some View { - if horizontalSizeClass == .compact { - ReaderSubscriptionNotificationSettingsView(siteID: site.siteID.intValue, isCompact: true) - .presentationDetents([.medium, .large]) - .edgesIgnoringSafeArea(.all) - } else { + .sheet(isPresented: $isShowingSettings) { ReaderSubscriptionNotificationSettingsView(siteID: site.siteID.intValue) + .presentationDetents([.medium, .large]) } } @@ -93,6 +85,7 @@ struct ReaderSubscriptionCell: View { } label: { Image(systemName: "ellipsis") .foregroundStyle(.secondary) + .frame(width: 44, height: 44) } .buttonStyle(.plain) } diff --git a/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionNotificationSettingsView.swift b/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionNotificationSettingsView.swift index 9242977fe0e1..350679a1d34f 100644 --- a/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionNotificationSettingsView.swift +++ b/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionNotificationSettingsView.swift @@ -3,30 +3,22 @@ import UIKit struct ReaderSubscriptionNotificationSettingsView: UIViewControllerRepresentable { let siteID: Int - var isCompact = false @Environment(\.dismiss) var dismiss func makeUIViewController(context: Context) -> UIViewController { let vc = NotificationSiteSubscriptionViewController(siteId: siteID) - if isCompact { - vc.navigationItem.rightBarButtonItem = UIBarButtonItem(title: SharedStrings.Button.done, primaryAction: .init { _ in - dismiss() - }) - // - warning: UIKit is used to prevent the modifiers from the - // containing list to affect this screen/ - return UINavigationController(rootViewController: vc) - } - return vc + vc.navigationItem.rightBarButtonItem = UIBarButtonItem(title: SharedStrings.Button.done, primaryAction: .init { _ in + dismiss() + }) + // - warning: UIKit is used to prevent the modifiers from the + // containing list to affect this screen/ + return UINavigationController(rootViewController: vc) } func updateUIViewController(_ uiViewController: UIViewController, context: Context) { // Do nothing } - - func sizeThatFits(_ proposal: ProposedViewSize, uiViewController: UIViewController, context: Context) -> CGSize? { - isCompact ? nil : CGSize(width: 320, height: 434) - } } extension NotificationSiteSubscriptionViewController { From 264f633b9a788e2b294033b13c424e89f839b59c Mon Sep 17 00:00:00 2001 From: kean Date: Thu, 9 Jan 2025 15:50:01 -0500 Subject: [PATCH 10/10] Fix layout in ReaderSubscriptionCel actions --- .../ReaderSidebarSubscriptionsSection.swift | 1 + .../Subscriptions/ReaderSubscriptionCell.swift | 15 ++++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift b/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift index a89275cb4cd1..b435a270b9da 100644 --- a/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift +++ b/WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarSubscriptionsSection.swift @@ -65,6 +65,7 @@ struct ReaderSidebarSubscriptionCell: View { .sheet(isPresented: $isShowingSettings) { ReaderSubscriptionNotificationSettingsView(siteID: site.siteID.intValue) .presentationDetents([.medium, .large]) + .edgesIgnoringSafeArea(.bottom) } } } diff --git a/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionCell.swift b/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionCell.swift index 655fbac5501b..c976a7d1298e 100644 --- a/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionCell.swift +++ b/WordPress/Classes/ViewRelated/Reader/Subscriptions/ReaderSubscriptionCell.swift @@ -38,10 +38,13 @@ struct ReaderSubscriptionCell: View { Spacer() - if let status = ReaderSubscriptionNotificationsStatus(site: site) { - makeButtonNotificationSettings(with: status) + HStack(spacing: 0) { + if let status = ReaderSubscriptionNotificationsStatus(site: site) { + makeButtonNotificationSettings(with: status) + } + buttonMore } - buttonMore + .padding(.trailing, -16) } .contextMenu(menuItems: { ReaderSubscriptionContextMenu(site: site, isShowingSettings: $isShowingSettings) @@ -70,12 +73,13 @@ struct ReaderSubscriptionCell: View { } .font(.subheadline) .frame(width: 34, alignment: .center) - .padding(.trailing, 6) + .contentShape(Rectangle()) } .buttonStyle(.plain) .sheet(isPresented: $isShowingSettings) { ReaderSubscriptionNotificationSettingsView(siteID: site.siteID.intValue) .presentationDetents([.medium, .large]) + .edgesIgnoringSafeArea(.bottom) } } @@ -85,7 +89,8 @@ struct ReaderSubscriptionCell: View { } label: { Image(systemName: "ellipsis") .foregroundStyle(.secondary) - .frame(width: 44, height: 44) + .frame(width: 40, height: 40) + .contentShape(Rectangle()) } .buttonStyle(.plain) }