Skip to content

Commit 9e972b6

Browse files
authored
Enable quick access to notifications from Reader (#23882)
* Enable quick access to notifications from Reader * Fix spacing * Update release notes
1 parent 629899b commit 9e972b6

File tree

6 files changed

+66
-25
lines changed

6 files changed

+66
-25
lines changed

RELEASE-NOTES.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
* [*] [internal] Update Gravatar SDK to 3.0.0 [#23701]
88
* [*] Use the Gravatar Quick Editor to update the avatar [#23729]
99
* [*] (Hidden under a feature flag) User Management for self-hosted sites. [#23768]
10+
* [*] Enable quick access to notifications from Reader on iPad [#23882]
11+
* [*] Add support for restricted posts in Reader [#23853]
1012

1113
25.5
1214
-----

WordPress/Classes/System/Root View/ReaderPresenter.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,17 @@ final class ReaderPresenter: NSObject, SplitViewDisplayable {
122122
if screen == .discover {
123123
return ReaderDiscoverViewController(topic: topic)
124124
} else {
125-
return ReaderStreamViewController.controllerWithTopic(topic)
125+
let streamVC = ReaderStreamViewController.controllerWithTopic(topic)
126+
streamVC.isNotificationsBarButtonEnabled = true
127+
return streamVC
126128
}
127129
} else {
128130
return makeErrorViewController() // This should never happen
129131
}
130132
case .saved:
131-
return ReaderStreamViewController.controllerForContentType(.saved)
133+
let streamVC = ReaderStreamViewController.controllerForContentType(.saved)
134+
streamVC.isNotificationsBarButtonEnabled = true
135+
return streamVC
132136
case .search:
133137
return ReaderSearchViewController()
134138
}

WordPress/Classes/ViewRelated/Blog/My Site/MySiteViewController.swift

Lines changed: 5 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -286,33 +286,15 @@ final class MySiteViewController: UIViewController, UIScrollViewDelegate, NoSite
286286
navigationController?.navigationBar.accessibilityIdentifier = "my-site-navigation-bar"
287287

288288
if isSidebarModeEnabled {
289-
navigationItem.rightBarButtonItems = makeRegularClassSizeNavigationItems()
290-
291-
notificationsButtonViewModel.$image.dropFirst()
292-
.receive(on: DispatchQueue.main) // Skip on hop
293-
.sink { [weak self] _ in
294-
guard let self else { return }
295-
self.navigationItem.rightBarButtonItems = self.makeRegularClassSizeNavigationItems()
296-
}.store(in: &cancellables)
289+
notificationsButtonViewModel.$image.sink { [weak self] in
290+
guard let self else { return }
291+
self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: $0, style: .plain, target: self, action: #selector(buttonShowNotificationsTapped))
292+
}.store(in: &cancellables)
297293
}
298294
}
299295

300-
private func makeRegularClassSizeNavigationItems() -> [UIBarButtonItem] {
301-
return [
302-
UIBarButtonItem(image: notificationsButtonViewModel.image, style: .plain, target: self, action: #selector(buttonShowNotificationsTapped))
303-
]
304-
}
305-
306296
@objc private func buttonShowNotificationsTapped(_ sender: UIBarButtonItem) {
307-
let notificationsVC = UIStoryboard(name: "Notifications", bundle: nil).instantiateInitialViewController() as! NotificationsViewController
308-
notificationsVC.isSidebarModeEnabled = true
309-
310-
let navigationVC = UINavigationController(rootViewController: notificationsVC)
311-
navigationVC.modalPresentationStyle = .popover
312-
navigationVC.preferredContentSize = CGSize(width: 375, height: 800)
313-
navigationVC.popoverPresentationController?.sourceItem = sender
314-
navigationVC.popoverPresentationController?.permittedArrowDirections = [.up]
315-
present(navigationVC, animated: true)
297+
NotificationsViewController.showInPopover(from: self, sourceItem: sender)
316298
}
317299

318300
private func configureNavBarAppearance(animated: Bool) {

WordPress/Classes/ViewRelated/Notifications/Controllers/NotificationsViewController/NotificationsViewController.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,18 @@ class NotificationsViewController: UIViewController, UITableViewDataSource, UITa
117117

118118
// MARK: - View Lifecycle
119119

120+
static func showInPopover(from presentingVC: UIViewController, sourceItem: UIPopoverPresentationControllerSourceItem) {
121+
let notificationsVC = UIStoryboard(name: "Notifications", bundle: nil).instantiateInitialViewController() as! NotificationsViewController
122+
notificationsVC.isSidebarModeEnabled = true
123+
124+
let navigationVC = UINavigationController(rootViewController: notificationsVC)
125+
navigationVC.modalPresentationStyle = .popover
126+
navigationVC.preferredContentSize = CGSize(width: 375, height: 800)
127+
navigationVC.popoverPresentationController?.sourceItem = sourceItem
128+
navigationVC.popoverPresentationController?.permittedArrowDirections = [.up]
129+
presentingVC.present(navigationVC, animated: true)
130+
}
131+
120132
required init?(coder aDecoder: NSCoder) {
121133
super.init(coder: aDecoder)
122134

WordPress/Classes/ViewRelated/Reader/Controllers/ReaderDiscoverViewController.swift

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ class ReaderDiscoverViewController: UIViewController, ReaderDiscoverHeaderViewDe
1414
private let tags: ManagedObjectsObserver<ReaderTagTopic>
1515
private let viewContext: NSManagedObjectContext
1616
private var cancellables: [AnyCancellable] = []
17+
private let notificationsButtonViewModel = NotificationsButtonViewModel()
18+
private var notificationsButtonCancellable: AnyCancellable?
1719

1820
init(topic: ReaderAbstractTopic) {
1921
wpAssert(ReaderHelpers.topicIsDiscover(topic))
@@ -42,8 +44,29 @@ class ReaderDiscoverViewController: UIViewController, ReaderDiscoverHeaderViewDe
4244
showSelectInterestsIfNeeded()
4345
}
4446

47+
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
48+
super.traitCollectionDidChange(previousTraitCollection)
49+
50+
setupNotificationsBarButtonItem()
51+
}
52+
4553
private func setupNavigation() {
4654
navigationItem.largeTitleDisplayMode = .never
55+
setupNotificationsBarButtonItem()
56+
}
57+
58+
private func setupNotificationsBarButtonItem() {
59+
notificationsButtonCancellable = nil
60+
if traitCollection.horizontalSizeClass == .regular {
61+
notificationsButtonCancellable = notificationsButtonViewModel.$image.sink { [weak self] in
62+
guard let self else { return }
63+
self.navigationItem.rightBarButtonItems = [UIBarButtonItem(image: $0, style: .plain, target: self, action: #selector(buttonShowNotificationsTapped))]
64+
}
65+
}
66+
}
67+
68+
@objc private func buttonShowNotificationsTapped(_ sender: UIBarButtonItem) {
69+
NotificationsViewController.showInPopover(from: self, sourceItem: sender)
4770
}
4871

4972
private func setupHeaderView() {

WordPress/Classes/ViewRelated/Reader/Controllers/ReaderStreamViewController.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ import AutomatticTracks
7878
private var didBumpStats = false
7979
@Lazy private var titleView = ReaderNavigationCustomTitleView()
8080
internal let scrollViewTranslationPublisher = PassthroughSubject<Bool, Never>()
81+
private let notificationsButtonViewModel = NotificationsButtonViewModel()
82+
private var notificationsButtonCancellable: AnyCancellable?
8183

8284
/// Content management
8385
let content = ReaderTableContent()
@@ -176,6 +178,7 @@ import AutomatticTracks
176178
private var showConfirmation = true
177179

178180
var isEmbeddedInDiscover = false
181+
var isNotificationsBarButtonEnabled = false
179182
var preferredTableHeaderView: UIView?
180183

181184
var isCompact = true {
@@ -350,13 +353,28 @@ import AutomatticTracks
350353
super.traitCollectionDidChange(previousTraitCollection)
351354

352355
isCompact = traitCollection.horizontalSizeClass == .compact
356+
setupNotificationsBarButtonItem()
353357
}
354358

355359
private func didChangeIsCompact(_ isCompact: Bool) {
356360
(tableView.tableHeaderView as? ReaderBaseHeaderView)?.isCompact = isCompact
357361
tableView.reloadData()
358362
}
359363

364+
private func setupNotificationsBarButtonItem() {
365+
notificationsButtonCancellable = nil
366+
if isNotificationsBarButtonEnabled && traitCollection.horizontalSizeClass == .regular {
367+
notificationsButtonCancellable = notificationsButtonViewModel.$image.sink { [weak self] in
368+
guard let self else { return }
369+
self.navigationItem.rightBarButtonItems = [UIBarButtonItem(image: $0, style: .plain, target: self, action: #selector(buttonShowNotificationsTapped))]
370+
}
371+
}
372+
}
373+
374+
@objc private func buttonShowNotificationsTapped(_ sender: UIBarButtonItem) {
375+
NotificationsViewController.showInPopover(from: self, sourceItem: sender)
376+
}
377+
360378
// MARK: - Topic acquisition
361379

362380
/// Fetches a site topic for the value of the `siteID` property.

0 commit comments

Comments
 (0)