-
Notifications
You must be signed in to change notification settings - Fork 1.1k
/
WPTabBarController+ReaderTabNavigation.swift
143 lines (123 loc) · 4.84 KB
/
WPTabBarController+ReaderTabNavigation.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/// Generic type for the UIViewController in the Reader Content View
protocol ReaderContentViewController: UIViewController {
func setContent(_ content: ReaderContent)
}
// MARK: - DefinesVariableStatusBarStyle Support
extension WPTabBarController {
override open var preferredStatusBarStyle: UIStatusBarStyle {
.default
}
override open var childForStatusBarStyle: UIViewController? {
guard
let topViewController = readerNavigationController?.topViewController,
(topViewController as? DefinesVariableStatusBarStyle) != nil
else {
return nil
}
return topViewController
}
}
// MARK: - Reader Factory
extension WPTabBarController {
var readerTabViewController: ReaderTabViewController? {
readerNavigationController?.topViewController as? ReaderTabViewController
}
@objc func makeReaderTabViewController() -> ReaderTabViewController {
return ReaderTabViewController(viewModel: readerTabViewModel) { [unowned self] viewModel in
return self.makeReaderTabView(viewModel)
}
}
@objc func makeReaderTabViewModel() -> ReaderTabViewModel {
let viewModel = ReaderTabViewModel(
readerContentFactory: { [unowned self] in
self.makeReaderContentViewController(with: $0)
},
searchNavigationFactory: { [unowned self] in
self.navigateToReaderSearch()
},
tabItemsStore: ReaderTabItemsStore(),
settingsPresenter: ReaderManageScenePresenter()
)
return viewModel
}
private func makeReaderContentViewController(with content: ReaderContent) -> ReaderContentViewController {
if content.topicType == .discover, let topic = content.topic {
let controller = ReaderCardsStreamViewController.controller(topic: topic)
controller.shouldShowCommentSpotlight = readerTabViewModel.shouldShowCommentSpotlight
return controller
} else if let topic = content.topic {
return ReaderStreamViewController.controllerWithTopic(topic)
} else {
return ReaderStreamViewController.controllerForContentType(content.type)
}
}
private func makeReaderTabView(_ viewModel: ReaderTabViewModel) -> ReaderTabView {
return ReaderTabView(viewModel: self.readerTabViewModel)
}
}
// MARK: - Reader Navigation
extension WPTabBarController {
/// reader navigation methods
func navigateToReaderSearch() {
let searchController = ReaderSearchViewController.controller()
navigateToReader(searchController)
}
func navigateToReaderSearch(withSearchText searchText: String) {
let searchController = ReaderSearchViewController.controller(withSearchText: searchText)
navigateToReader(searchController)
}
func navigateToReaderSite(_ topic: ReaderSiteTopic) {
let contentController = ReaderStreamViewController.controllerWithTopic(topic)
navigateToReader(contentController)
}
func navigateToReaderTag(_ tagSlug: String) {
let contentController = ReaderStreamViewController.controllerWithTagSlug(tagSlug)
navigateToReader(contentController)
}
func navigateToReader(_ pushControlller: UIViewController? = nil) {
showReaderTab()
readerNavigationController?.popToRootViewController(animated: false)
guard let controller = pushControlller else {
return
}
readerNavigationController?.pushViewController(controller, animated: true)
}
func resetReaderDiscoverNudgeFlow() {
readerTabViewModel.shouldShowCommentSpotlight = false
}
/// methods to select one of the default Reader tabs
@objc func switchToSavedPosts() {
let title = NSLocalizedString("Saved", comment: "Title of the Saved Reader Tab")
switchToTitle(title)
}
func switchToFollowedSites() {
navigateToReader()
readerTabViewModel.switchToTab(where: {
ReaderHelpers.topicIsFollowing($0)
})
}
func switchToDiscover() {
navigateToReader()
readerTabViewModel.switchToTab(where: {
ReaderHelpers.topicIsDiscover($0)
})
}
func switchToMyLikes() {
navigateToReader()
readerTabViewModel.switchToTab(where: {
ReaderHelpers.topicIsLiked($0)
})
}
/// switches to a menu item topic that satisfies the given predicate with a topic value
func switchToTopic(where predicate: (ReaderAbstractTopic) -> Bool) {
navigateToReader()
readerTabViewModel.switchToTab(where: predicate)
}
/// switches to a menu item topic whose title matched the passed value
func switchToTitle(_ title: String) {
navigateToReader()
readerTabViewModel.switchToTab(where: {
$0 == title
})
}
}