Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 6 additions & 9 deletions WordPress/Classes/Services/ReaderCardService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -47,14 +47,15 @@ class ReaderCardService {

func fetch(isFirstPage: Bool, refreshCount: Int = 0, success: @escaping (Int, Bool) -> Void, failure: @escaping (Error?) -> Void) {
followedInterestsService.fetchFollowedInterestsLocally { [weak self] topics in
guard let self,
let interests = topics,
!interests.isEmpty else {
failure(Errors.noInterests)
guard let self, let interests = topics else {
failure(URLError(.unknown)) // Should never happen
return
}

let slugs = interests.map { $0.slug }
var slugs = interests.map { $0.slug }
if slugs.isEmpty {
slugs = ["dailyprompt", "wordpress"] // Matches wp.com
}
let success: ([RemoteReaderCard], String?) -> Void = { [weak self] cards, pageHandle in
guard let self else {
return
Expand Down Expand Up @@ -157,10 +158,6 @@ class ReaderCardService {
isFirstPage ? nil : self.pageHandle
}

enum Errors: Error {
case noInterests
}

private enum Constants {
static let paginationMultiplier = 100
static let firstPage = 1
Expand Down
71 changes: 0 additions & 71 deletions WordPress/Classes/Services/ReaderSearchSuggestionService.swift

This file was deleted.

10 changes: 10 additions & 0 deletions WordPress/Classes/Stores/UserPersistentRepositoryUtility.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ private enum UPRUConstants {
static let readerSidebarSelectionKey = "readerSidebarSelectionKey"
static let isReaderSelectedKey = "isReaderSelectedKey"
static let readerSearchHistoryKey = "readerSearchHistoryKey"
static let readerDidSelectInterestsKey = "readerDidSelectInterestsKey"
}

protocol UserPersistentRepositoryUtility: AnyObject {
Expand Down Expand Up @@ -190,4 +191,13 @@ extension UserPersistentRepositoryUtility {
.set(newValue, forKey: UPRUConstants.readerSearchHistoryKey)
}
}

var readerDidSelectInterestsKey: Bool {
get {
UserPersistentStoreFactory.instance().bool(forKey: UPRUConstants.readerDidSelectInterestsKey)
}
set {
UserPersistentStoreFactory.instance().set(newValue, forKey: UPRUConstants.readerDidSelectInterestsKey)
}
}
}
2 changes: 2 additions & 0 deletions WordPress/Classes/System/Root View/ReaderPresenter.swift
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ final class ReaderPresenter: NSObject, SplitViewDisplayable {
case .organization(let objectID):
show(makeViewController(withTopicID: objectID))
}

hideSupplementaryColumnIfNeeded()
}

private func popMainNavigationController() {
Expand Down
4 changes: 3 additions & 1 deletion WordPress/Classes/System/WordPressAppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -705,8 +705,10 @@ extension WordPressAppDelegate {
ReaderPostService(coreDataStack: ContextManager.shared).clearInUseFlags()
ReaderTopicService(coreDataStack: ContextManager.shared).clearInUseFlags()
ReaderPostService(coreDataStack: ContextManager.shared).clearSavedPostFlags()
ReaderSearchSuggestionService(coreDataStack: ContextManager.sharedInstance()).deleteAllSuggestions()
UserDefaults.standard.isReaderSelected = false
UserDefaults.standard.readerSidebarSelection = nil
UserDefaults.standard.readerSearchHistory = []
UserDefaults.standard.readerDidSelectInterestsKey = false
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ class ReaderDiscoverViewController: UIViewController, ReaderDiscoverHeaderViewDe
private var selectedChannel: ReaderDiscoverChannel = .recommended
private let topic: ReaderAbstractTopic
private var streamVC: ReaderStreamViewController?
private weak var selectInterestsVC: ReaderSelectInterestsViewController?
private let selectInterestsCoordinator = ReaderSelectInterestsCoordinator()
private let tags: ManagedObjectsObserver<ReaderTagTopic>
private let viewContext: NSManagedObjectContext
private var cancellables: [AnyCancellable] = []
Expand Down Expand Up @@ -36,6 +38,8 @@ class ReaderDiscoverViewController: UIViewController, ReaderDiscoverHeaderViewDe
setupHeaderView()

configureStream(for: selectedChannel)

showSelectInterestsIfNeeded()
}

private func setupNavigation() {
Expand Down Expand Up @@ -112,13 +116,51 @@ class ReaderDiscoverViewController: UIViewController, ReaderDiscoverHeaderViewDe
ReaderCardService.removeAllCards()
}

// MARK: - ReaderDiscoverHeaderViewDelegate
// MARK: ReaderDiscoverHeaderViewDelegate

func readerDiscoverHeaderView(_ view: ReaderDiscoverHeaderView, didChangeSelection selection: ReaderDiscoverChannel) {
self.selectedChannel = selection
configureStream(for: selection)
WPAnalytics.track(.readerDiscoverChannelSelected, properties: selection.analyticsProperties)
}

// MARK: Select Interests

private func showSelectInterestsIfNeeded() {
guard !UserDefaults.standard.readerDidSelectInterestsKey else {
return
}
selectInterestsCoordinator.isFollowingInterests { [weak self] isFollowing in
if !isFollowing {
self?.showSelectInterestsScreen()
}
}
}

private func showSelectInterestsScreen() {
guard selectInterestsVC == nil else { return }

let selectInterestsVC = ReaderSelectInterestsViewController(configuration: .discover)
selectInterestsVC.isModalInPresentation = true
selectInterestsVC.didSaveInterests = { [weak self] _ in
self?.didSaveInterests()
}
present(selectInterestsVC, animated: true)
self.selectInterestsVC = selectInterestsVC
}

private func didSaveInterests() {
UserDefaults.standard.readerDidSelectInterestsKey = true

guard selectInterestsVC != nil else { return }
dismiss(animated: true) {
if let streamVC = self.streamVC {
streamVC.scrollViewToTop()
streamVC.displayLoadingStream()
streamVC.syncIfAppropriate(forceSync: true)
}
}
}
}

private class ReaderDiscoverStreamViewController: ReaderStreamViewController {
Expand Down Expand Up @@ -167,11 +209,6 @@ private class ReaderDiscoverStreamViewController: ReaderStreamViewController {
addObservers()
}

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
displaySelectInterestsIfNeeded()
}

// MARK: - UITableView

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
Expand Down Expand Up @@ -233,10 +270,6 @@ private class ReaderDiscoverStreamViewController: ReaderStreamViewController {
return cell
}

private func isTableViewAtTheTop() -> Bool {
return tableView.contentOffset.y == 0
}

@objc private func reload(_ notification: Foundation.Notification) {
tableView.reloadData()
}
Expand Down Expand Up @@ -279,7 +312,7 @@ private class ReaderDiscoverStreamViewController: ReaderStreamViewController {

override func syncIfAppropriate(forceSync: Bool = false) {
// Only sync if the tableview is at the top, otherwise this will change tableview's offset
if isTableViewAtTheTop() {
if tableView.contentOffset.y <= 0 {
super.syncIfAppropriate(forceSync: forceSync)
}
}
Expand Down Expand Up @@ -333,20 +366,6 @@ private class ReaderDiscoverStreamViewController: ReaderStreamViewController {
}
}

// MARK: - Select Interests Display
private extension ReaderDiscoverStreamViewController {
func displaySelectInterestsIfNeeded() {
selectInterestsVC.userIsFollowingTopics { [weak self] isFollowing in
guard let self else { return }
if isFollowing {
self.hideSelectInterestsView()
} else {
self.showSelectInterestsView()
}
}
}
}

// MARK: - ReaderTopicsTableCardCellDelegate

extension ReaderDiscoverStreamViewController: ReaderTopicsTableCardCellDelegate {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -177,12 +177,6 @@ import AutomatticTracks

private var showConfirmation = true

lazy var selectInterestsVC = ReaderSelectInterestsViewController(configuration: .discover)

/// Tracks whether or not we should force sync
/// This is set to true after the Reader Manage view is dismissed
var shouldForceRefresh = false

var isEmbeddedInDiscover = false

private var isCompact = true {
Expand All @@ -197,7 +191,11 @@ import AutomatticTracks
oldValue?.removeFromSuperview()
if let emptyStateView {
view.addSubview(emptyStateView)
emptyStateView.pinEdges(to: view.safeAreaLayoutGuide)
emptyStateView.pinEdges(.horizontal, to: view.safeAreaLayoutGuide)
NSLayoutConstraint.activate([
emptyStateView.topAnchor.constraint(equalTo: tableView.tableHeaderView?.bottomAnchor ?? view.safeAreaLayoutGuide.topAnchor),
emptyStateView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
])

footerView.isHidden = true
hideGhost()
Expand Down Expand Up @@ -523,7 +521,7 @@ import AutomatticTracks
recentlyBlockedSitePostObjectIDs.removeAllObjects()
updateAndPerformFetchRequest()
configureStreamHeader()
tableView.setContentOffset(CGPoint.zero, animated: false)
tableView.setContentOffset(CGPoint(x: 0, y: -(tableView.adjustedContentInset.top)), animated: false)
content.refresh()

if synchronize {
Expand Down Expand Up @@ -577,16 +575,9 @@ import AutomatticTracks

// MARK: - Instance Methods

/// Scrolls to the top of the list of posts.
@objc func scrollViewToTop() {
guard tableView.numberOfRows(inSection: .zero) > 0 else {
tableView.setContentOffset(.zero, animated: true)
return
}

/// `scrollToRow` somehow works better when the first cell has dynamic height. With `setContentOffset`,
/// sometimes it doesn't perfectly scroll to the top, thus making the top cell appear clipped.
tableView.scrollToRow(at: IndexPath(row: .zero, section: .zero), at: .top, animated: true)
// Uses `contentInset.top` to accomodate for the safe area insets
tableView.setContentOffset(CGPoint(x: 0, y: -(tableView.adjustedContentInset.top)), animated: true)
}

/// Returns the analytics property dictionary for the current topic.
Expand Down Expand Up @@ -1550,48 +1541,7 @@ extension ReaderStreamViewController {
emptyStateView = makeEmptyStateView(.noFollowedSites)
}

func showSelectInterestsView() {
guard selectInterestsVC.parent == nil else {
return
}

selectInterestsVC.view.frame = self.view.bounds
self.add(selectInterestsVC)

selectInterestsVC.didSaveInterests = { [weak self] _ in
guard let self else {
return
}
self.hideSelectInterestsView()
}
}

func hideSelectInterestsView(showLoadingStream: Bool = true) {
guard selectInterestsVC.parent != nil else {
if shouldForceRefresh {
scrollViewToTop()
displayLoadingStream()
syncIfAppropriate(forceSync: true)
shouldForceRefresh = false
}

return
}

scrollViewToTop()
displayLoadingStream()
syncIfAppropriate(forceSync: true)

UIView.animate(withDuration: 0.2, animations: {
self.selectInterestsVC.view.alpha = 0
}) { _ in
self.selectInterestsVC.remove()
self.selectInterestsVC.view.alpha = 1
}
}

func hideResultsStatus() {
hideSelectInterestsView()
emptyStateView = nil
footerView.isHidden = false
tableView.tableHeaderView?.isHidden = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,11 +136,6 @@ class ReaderSelectInterestsViewController: UIViewController {
saveSelectedInterests()
}

// MARK: - Display logic
func userIsFollowingTopics(completion: @escaping (Bool) -> Void) {
coordinator.isFollowingInterests(completion: completion)
}

// MARK: - Private: Configuration
private func configureCollectionView() {
let nib = UINib(nibName: String(describing: ReaderInterestsCollectionViewCell.self), bundle: nil)
Expand Down
Loading