Skip to content

Commit

Permalink
Search: More refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
Dimillian committed May 17, 2021
1 parent 1ea558f commit 8df14f1
Show file tree
Hide file tree
Showing 7 changed files with 97 additions and 56 deletions.
4 changes: 4 additions & 0 deletions RedditOs.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
69F74E9624DB0B7300E58BD8 /* QuickSearchResultsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69F74E9524DB0B7300E58BD8 /* QuickSearchResultsView.swift */; };
9F19B57A26505DCF00FBEEDA /* SidebarMultiView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F19B57926505DCF00FBEEDA /* SidebarMultiView.swift */; };
9F4537862652DF960026C19B /* SearchBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F4537852652DF960026C19B /* SearchBarView.swift */; };
9F4537882652ED550026C19B /* QuickSearchPostsResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F4537872652ED550026C19B /* QuickSearchPostsResultView.swift */; };
9F4812CC264FC8DB007A719D /* QuickSearchFullResultsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F4812CB264FC8DB007A719D /* QuickSearchFullResultsView.swift */; };
9F8EE49126510BCF00BDE4AC /* MarkdownUI in Frameworks */ = {isa = PBXBuildFile; productRef = 9F8EE49026510BCF00BDE4AC /* MarkdownUI */; };
/* End PBXBuildFile section */
Expand Down Expand Up @@ -134,6 +135,7 @@
69F74E9524DB0B7300E58BD8 /* QuickSearchResultsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSearchResultsView.swift; sourceTree = "<group>"; };
9F19B57926505DCF00FBEEDA /* SidebarMultiView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarMultiView.swift; sourceTree = "<group>"; };
9F4537852652DF960026C19B /* SearchBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchBarView.swift; sourceTree = "<group>"; };
9F4537872652ED550026C19B /* QuickSearchPostsResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSearchPostsResultView.swift; sourceTree = "<group>"; };
9F4812CB264FC8DB007A719D /* QuickSearchFullResultsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSearchFullResultsView.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */

Expand Down Expand Up @@ -394,6 +396,7 @@
691747E124DBEA240017E068 /* QuickSearchResultRow.swift */,
69F74E9524DB0B7300E58BD8 /* QuickSearchResultsView.swift */,
6970A0BA24B79F5900B11031 /* QuickSearchState.swift */,
9F4537872652ED550026C19B /* QuickSearchPostsResultView.swift */,
);
path = Quick;
sourceTree = "<group>";
Expand Down Expand Up @@ -543,6 +546,7 @@
693F85D124D0690500224ADB /* NSTextField.swift in Sources */,
6970A0BD24B82E1C00B11031 /* LoadingRow.swift in Sources */,
69222AAA24CD7518009F31B4 /* CommentRow.swift in Sources */,
9F4537882652ED550026C19B /* QuickSearchPostsResultView.swift in Sources */,
6970A0B324B77D1200B11031 /* PostVoteView.swift in Sources */,
9F4537862652DF960026C19B /* SearchBarView.swift in Sources */,
69ACD1E52652A025008CC42C /* SidebarItem.swift in Sources */,
Expand Down
5 changes: 5 additions & 0 deletions RedditOs/Environements/Route.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ enum Route: Identifiable, Hashable {
case user(user: User)
case subreddit(subreddit: String)
case defaultChannel(chanel: UIState.DefaultChannels)
case searchPostsResult

var id: String {
switch self {
Expand All @@ -31,6 +32,8 @@ enum Route: Identifiable, Hashable {
return subreddit
case let .defaultChannel(chanel):
return chanel.rawValue
case .searchPostsResult:
return "searchPostsResult"
}
}

Expand All @@ -45,6 +48,8 @@ enum Route: Identifiable, Hashable {
case let .defaultChannel(chanel):
SubredditPostsListView(name: chanel.rawValue)
.equatable()
case .searchPostsResult:
QuickSearchPostsResultView()
}
}
}
60 changes: 28 additions & 32 deletions RedditOs/Features/Search/Quick/QuickSearchFullResultsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,17 @@ struct QuickSearchFullResultsView: View {
var body: some View {
VStack(alignment: .leading) {
if let route = uiState.searchRoute {
HStack {
Button {
uiState.searchRoute = nil
resultsDisplayMode = .autocomplete
} label: {
Text("Back")
}
.padding(8)
Spacer()
}
.background(Color.redditGray)
.frame(height: 50)
route.makeView()
.toolbar {
ToolbarItemGroup(placement: .navigation) {
Button {
uiState.searchRoute = nil
resultsDisplayMode = .autocomplete
} label: {
Text("Back")
}
}
}
} else {
QuickSearchBar(showSuggestionPopover: false,
onCommit: {
Expand All @@ -41,44 +39,42 @@ struct QuickSearchFullResultsView: View {
resultsDisplayMode = .autocomplete
})
.padding()
List {
resultsView
}
resultsView
.listStyle(PlainListStyle())
.padding(.horizontal)
Spacer()
}
}.navigationTitle("Search")
}
.navigationTitle("Search")
.onAppear {
searchState.fetchTrending()
}
.frame(minWidth: 300)
}

@ViewBuilder
private var resultsView: some View {
switch resultsDisplayMode {
case .autocomplete:
if searchState.searchText.isEmpty {
if let trending = searchState.trending {
Section(header: Label("Trending", systemImage: "chart.bar.fill")) {
ForEach(trending.subredditNames, id: \.self) { subreddit in
Text(subreddit)
.padding(.vertical, 4)
.onTapGesture {
uiState.searchRoute = .subreddit(subreddit: subreddit)
}
List {
if searchState.searchText.isEmpty {
if let trending = searchState.trending {
Section(header: Label("Trending", systemImage: "chart.bar.fill")) {
ForEach(trending.subredditNames, id: \.self) { subreddit in
Text(subreddit)
.padding(.vertical, 4)
.onTapGesture {
uiState.searchRoute = .subreddit(subreddit: subreddit)
}
}
}
}
} else {
QuickSearchResultsView()
}
} else {
QuickSearchResultsView()
}
case .posts:
if let results = searchState.postResults {
ForEach(results) { result in
SubredditPostRow(post: result, displayMode: .constant(.large))
}
}
QuickSearchPostsResultView()
}
}
}
Expand Down
34 changes: 34 additions & 0 deletions RedditOs/Features/Search/Quick/QuickSearchPostsResultView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
//
// QuickSearchPostsResultView.swift
// RedditOs
//
// Created by Thomas Ricouard on 17/05/2021.
//

import SwiftUI

struct QuickSearchPostsResultView: View {
@EnvironmentObject private var searchState: QuickSearchState

var body: some View {
List {
if searchState.isLoading {
LoadingRow(text: "Searching...")
} else if let results = searchState.postResults, !results.isEmpty {
ForEach(results) { result in
SubredditPostRow(post: result, displayMode: .constant(.large))
}
} else {
Label("No matching search for \(searchState.searchText)",
systemImage: "exclamationmark.triangle")
.foregroundColor(.textColor)
}
}
}
}

struct QuickSearchPostsResultView_Previews: PreviewProvider {
static var previews: some View {
QuickSearchPostsResultView()
}
}
20 changes: 15 additions & 5 deletions RedditOs/Features/Search/Quick/QuickSearchResultsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,12 @@ struct QuickSearchResultsView: View {

private func makeQuickAccess() -> some View {
ResultContainerView {
QuickSearchResultRow(icon: nil,
name: "Posts with '\(searchState.searchText)'")
.onTapGesture {
uiState.searchRoute = .searchPostsResult
}

QuickSearchResultRow(icon: nil,
name: "Go to r/\(searchState.searchText)")
.onTapGesture {
Expand All @@ -65,7 +71,9 @@ struct QuickSearchResultsView: View {
ResultContainerView {
if let subs = searchState.filteredSubscriptions {
if subs.isEmpty {
Label("No matching subscriptions for \(searchState.searchText)", systemImage: "magnifyingglass")
Label("No matching subscriptions for \(searchState.searchText)",
systemImage: "exclamationmark.triangle")
.foregroundColor(.textColor)
} else {
ForEach(subs) { sub in
makeSubRow(icon: sub.iconImg, name: sub.displayName)
Expand All @@ -77,16 +85,18 @@ struct QuickSearchResultsView: View {

private func makeSubredditSearch() -> some View {
ResultContainerView {
if let results = searchState.results {
if searchState.isLoading {
LoadingRow(text: nil)
} else if let results = searchState.results {
if results.isEmpty {
Label("No matching search for \(searchState.searchText)", systemImage: "magnifyingglass")
Label("No matching search for \(searchState.searchText)",
systemImage: "exclamationmark.triangle")
.foregroundColor(.textColor)
} else {
ForEach(results) { sub in
makeSubRow(icon: sub.iconImg, name: sub.name)
}
}
} else if searchState.isLoading {
LoadingRow(text: nil)
}
}
}
Expand Down
27 changes: 9 additions & 18 deletions RedditOs/Features/Search/Quick/QuickSearchState.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class QuickSearchState: ObservableObject {
private var subredditSearchPublisher: AnyPublisher<SubredditResponse, Never>?
private var postSearchPublisher: AnyPublisher<ListingResponse<SubredditPost>, Never>?
private var cancellableSet: Set<AnyCancellable> = Set()
private var searchCancellableSet: Set<AnyCancellable> = Set()
private var searchCancellable: AnyCancellable?

init(currentUser: CurrentUserStore = .shared) {
self.currentUser = currentUser
Expand Down Expand Up @@ -58,8 +58,8 @@ class QuickSearchState: ObservableObject {
}

private func search(with text: String) {
searchCancellableSet.forEach{ $0.cancel() }

searchCancellable?.cancel()
subredditSearchPublisher = API.shared.request(endpoint: .searchSubreddit, httpMethod: "POST", params: ["query": text])
.subscribe(on: DispatchQueue.global())
.replaceError(with: SubredditResponse())
Expand All @@ -70,23 +70,14 @@ class QuickSearchState: ObservableObject {
.replaceError(with: ListingResponse(error: "error"))
.eraseToAnyPublisher()

subredditSearchPublisher?
searchCancellable = Publishers.Zip(subredditSearchPublisher!,
postSearchPublisher!)
.receive(on: DispatchQueue.main)
.map{ $0.subreddits }
.sink{ [weak self] results in
.sink(receiveValue: { [weak self] subreddits, posts in
self?.results = subreddits.subreddits.map{ $0 }
self?.postResults = posts.data?.children.map{ $0.data }
self?.isLoading = false
self?.results = results
}
.store(in: &searchCancellableSet)


postSearchPublisher?
.receive(on: DispatchQueue.main)
.map{ $0.data?.children.map{ $0.data }}
.sink{ [weak self] results in
self?.postResults = results
}
.store(in: &searchCancellableSet)
})

}

Expand Down
3 changes: 2 additions & 1 deletion RedditOs/RedditOsApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import Backend
struct RedditOsApp: App {
@StateObject private var uiState = UIState()
@StateObject private var localData = LocalDataStore()
private let searchText = QuickSearchState()

@SceneBuilder
var body: some Scene {
Expand All @@ -30,7 +31,7 @@ struct RedditOsApp: App {
.environmentObject(OauthClient.shared)
.environmentObject(CurrentUserStore.shared)
.environmentObject(uiState)
.environmentObject(QuickSearchState())
.environmentObject(searchText)
.onOpenURL { url in
OauthClient.shared.handleNextURL(url: url)
}
Expand Down

0 comments on commit 8df14f1

Please sign in to comment.