Skip to content

Commit 67d9464

Browse files
authored
Reader: Logged-out experience (#23781)
* Remove remaining isLoggedIn usages from ReaderStreamVC * Fix alignment of Reader expand/collapse buttons * Make isCompact private * Reset Reader selection state on logout * Add logged-out experience for iPhone * Hide Reader, Notifications on iPad * Revert pbxproj change
1 parent 40ef2f4 commit 67d9464

11 files changed

+71
-51
lines changed

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,13 @@ final class ReaderPresenter: NSObject, SplitViewDisplayable {
3737

3838
// TODO: (reader) update to allow seamless transitions between split view and tabs
3939
@objc func prepareForTabBarPresentation() -> UINavigationController {
40+
guard AccountHelper.isDotcomAvailable() else {
41+
return UINavigationController(rootViewController: ReaderLoggedOutViewController())
42+
}
43+
4044
sidebar.onViewDidLoad = { [weak self] in
4145
self?.showInitialSelection()
4246
}
43-
4447
sidebarViewModel.isCompact = true
4548
sidebarViewModel.restoreSelection(defaultValue: nil)
4649
mainNavigationController = UINavigationController(rootViewController: sidebar) // Loads sidebar lazily

WordPress/Classes/System/WordPressAppDelegate.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,7 @@ extension WordPressAppDelegate {
706706
ReaderTopicService(coreDataStack: ContextManager.shared).clearInUseFlags()
707707
ReaderPostService(coreDataStack: ContextManager.shared).clearSavedPostFlags()
708708
ReaderSearchSuggestionService(coreDataStack: ContextManager.sharedInstance()).deleteAllSuggestions()
709+
UserDefaults.standard.readerSidebarSelection = nil
709710
}
710711
}
711712

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import UIKit
2+
import SwiftUI
3+
import WordPressUI
4+
5+
final class ReaderLoggedOutViewController: UIViewController {
6+
override func viewDidLoad() {
7+
super.viewDidLoad()
8+
9+
view.backgroundColor = .systemBackground
10+
11+
let stateView = UIHostingView(view: EmptyStateView {
12+
Label(Strings.title, systemImage: "person.crop.circle.badge.plus")
13+
} description: {
14+
Text(Strings.details)
15+
} actions: {
16+
Button(Strings.signIn) { [weak self] in
17+
self?.buttonSignInTapped()
18+
}.buttonStyle(.primary)
19+
})
20+
21+
view.addSubview(stateView)
22+
stateView.pinEdges()
23+
}
24+
25+
private func buttonSignInTapped() {
26+
Task {
27+
await WordPressDotComAuthenticator().signIn(from: self, context: .default)
28+
}
29+
}
30+
}
31+
32+
private enum Strings {
33+
static let title = NSLocalizedString("reader.loggedOut.title", value: "Join the conversation", comment: "Reader logged-out screen title")
34+
static let details = NSLocalizedString("reader.loggedOut.details", value: "Sign in with a WordPress.com account to follow your favorite blogs", comment: "Reader logged-out screen details")
35+
static let signIn = NSLocalizedString("reader.loggedOut.signIn", value: "Sign In", comment: "Reader logged-out screen sign in button")
36+
}

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,20 @@ extension ReaderStreamViewController {
88
// Convenience type for Reader's headers
99
typealias ReaderHeader = UIView & ReaderStreamHeader
1010

11-
func headerForStream(_ topic: ReaderAbstractTopic?, isLoggedIn: Bool, container: UITableViewController) -> UIView? {
11+
func headerForStream(_ topic: ReaderAbstractTopic?, container: UITableViewController) -> UIView? {
1212
if let topic, ReaderHelpers.topicIsFollowing(topic) {
1313
return ReaderHeaderView.makeForFollowing()
1414
}
1515
if let topic,
1616
let header = headerForStream(topic) {
17-
configure(header, topic: topic, isLoggedIn: isLoggedIn, delegate: self)
17+
configure(header, topic: topic, delegate: self)
1818
return header
1919
}
2020
return nil
2121
}
2222

23-
func configure(_ header: ReaderHeader?, topic: ReaderAbstractTopic, isLoggedIn: Bool, delegate: ReaderStreamHeaderDelegate) {
23+
func configure(_ header: ReaderHeader?, topic: ReaderAbstractTopic, delegate: ReaderStreamHeaderDelegate) {
2424
header?.configureHeader(topic)
25-
header?.enableLoggedInFeatures(isLoggedIn)
2625
header?.delegate = delegate
2726
}
2827

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ import AutomatticTracks
7373
private let recentlyBlockedSitePostObjectIDs = NSMutableArray()
7474
private let heightForFooterView = CGFloat(34.0)
7575
private let estimatedHeightsCache = NSCache<AnyObject, AnyObject>()
76-
private var isLoggedIn = false
7776
private var isFeed = false
7877
private var syncIsFillingGap = false
7978
private var indexPathForGapMarker: IndexPath?
@@ -464,7 +463,7 @@ import AutomatticTracks
464463
guard !isEmbeddedInDiscover else {
465464
return
466465
}
467-
guard let headerView = headerForStream(readerTopic, isLoggedIn: isLoggedIn, container: tableViewController) else {
466+
guard let headerView = headerForStream(readerTopic, container: tableViewController) else {
468467
tableView.tableHeaderView = nil
469468
return
470469
}
@@ -518,9 +517,6 @@ import AutomatticTracks
518517
tableViewController.refreshControl = nil
519518
}
520519

521-
// Rather than repeatedly creating a service to check if the user is logged in, cache it here.
522-
isLoggedIn = AccountHelper.isDotcomAvailable()
523-
524520
configureTitleForTopic()
525521
configureShareButtonIfNeeded()
526522
hideResultsStatus()

WordPress/Classes/ViewRelated/Reader/Headers/ReaderListStreamHeader.swift

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,4 @@ import WordPressShared
3636
titleLabel.text = topic.title
3737
detailLabel.text = listTopic.owner
3838
}
39-
40-
@objc open func enableLoggedInFeatures(_ enable: Bool) {
41-
// noop
42-
}
43-
4439
}

WordPress/Classes/ViewRelated/Reader/Headers/ReaderSiteHeaderView.swift

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,6 @@ class ReaderSiteHeaderView: UITableViewHeaderFooterView, ReaderStreamHeader {
2323
fatalError("init(coder:) has not been implemented")
2424
}
2525

26-
func enableLoggedInFeatures(_ enable: Bool) {
27-
headerViewModel.isFollowHidden = !enable
28-
}
29-
3026
func configureHeader(_ topic: ReaderAbstractTopic) {
3127
guard let siteTopic = topic as? ReaderSiteTopic else {
3228
assertionFailure("This header should only be used for site topics.")
@@ -96,12 +92,10 @@ struct ReaderSiteHeader: View {
9692
if viewModel.site?.isExternal == false {
9793
countsDisplay
9894
}
99-
if !viewModel.isFollowHidden {
100-
ReaderFollowButton(isFollowing: viewModel.isFollowingSite,
101-
isEnabled: viewModel.isFollowEnabled,
102-
size: .regular) {
103-
viewModel.updateFollowStatus()
104-
}
95+
ReaderFollowButton(isFollowing: viewModel.isFollowingSite,
96+
isEnabled: viewModel.isFollowEnabled,
97+
size: .regular) {
98+
viewModel.updateFollowStatus()
10599
}
106100
}
107101
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading)
@@ -145,7 +139,6 @@ class ReaderSiteHeaderViewModel: ObservableObject {
145139
@Published var postCount: String
146140
@Published var followerCount: String
147141
@Published var isFollowingSite: Bool
148-
@Published var isFollowHidden: Bool
149142
@Published var isFollowEnabled: Bool
150143

151144
private let onFollowTap: (_ completion: @escaping () -> Void) -> Void
@@ -156,7 +149,6 @@ class ReaderSiteHeaderViewModel: ObservableObject {
156149
postCount: String = "",
157150
followerCount: String = "",
158151
isFollowingSite: Bool = false,
159-
isFollowHidden: Bool = false,
160152
isFollowEnabled: Bool = true,
161153
onFollowTap: @escaping (_ completion: @escaping () -> Void) -> Void = { _ in }) {
162154
self.title = title
@@ -165,7 +157,6 @@ class ReaderSiteHeaderViewModel: ObservableObject {
165157
self.postCount = postCount
166158
self.followerCount = followerCount
167159
self.isFollowingSite = isFollowingSite
168-
self.isFollowHidden = isFollowHidden
169160
self.isFollowEnabled = isFollowEnabled
170161
self.onFollowTap = onFollowTap
171162
}

WordPress/Classes/ViewRelated/Reader/Headers/ReaderStreamHeader.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,5 @@ import Foundation
66

77
@objc public protocol ReaderStreamHeader {
88
weak var delegate: ReaderStreamHeaderDelegate? {get set}
9-
func enableLoggedInFeatures(_ enable: Bool)
109
func configureHeader(_ topic: ReaderAbstractTopic)
1110
}

WordPress/Classes/ViewRelated/Reader/Headers/ReaderTagStreamHeader.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,6 @@ import WordPressShared
3636
WPStyleGuide.applyTagsReaderButtonStyle(followButton)
3737
}
3838

39-
@objc open func enableLoggedInFeatures(_ enable: Bool) {
40-
41-
}
42-
4339
fileprivate func adjustInsetsForTextDirection() {
4440
followButton.flipInsetsForRightToLeftLayoutDirection()
4541
}

WordPress/Classes/ViewRelated/Reader/Sidebar/ReaderSidebarViewController.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ private struct ReaderSidebarSection<Content: View>: View {
172172
Image(systemName: isExpanded ? "chevron.down" : "chevron.right")
173173
.font(.system(size: 14).weight(.semibold))
174174
.foregroundStyle(AppColor.brand)
175+
.frame(width: 14)
175176
}
176177
.contentShape(Rectangle())
177178
}

0 commit comments

Comments
 (0)