Skip to content

Commit

Permalink
Search: Add trending subreddits
Browse files Browse the repository at this point in the history
  • Loading branch information
Dimillian committed May 15, 2021
1 parent 7f1be93 commit 372e4f2
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import Foundation

public struct TrendingSubreddits: Decodable {
public let subredditNames: [String]
}
27 changes: 20 additions & 7 deletions Packages/Backend/Sources/Backend/Network/API.swift
Original file line number Diff line number Diff line change
Expand Up @@ -47,16 +47,21 @@ public class API {

static private func makeURL(endpoint: Endpoint,
basicAuthUser: String?,
forceSignedOutURL: Bool,
isJSONAPI: Bool) -> URL {
var url: URL
if let user = basicAuthUser {
url = URL(string: "\(Self.URL_PREFIX)\(user):@www.\(Self.HOST)")!
} else {
switch OauthClient.shared.authState {
case .authenthicated:
url = URL(string: "\(Self.URL_PREFIX)\(Self.HOST_AUTH_DOMAIN).\(Self.HOST)")!
default:
if forceSignedOutURL {
url = URL(string: "\(Self.URL_PREFIX)www.\(Self.HOST)")!
} else {
switch OauthClient.shared.authState {
case .authenthicated:
url = URL(string: "\(Self.URL_PREFIX)\(Self.HOST_AUTH_DOMAIN).\(Self.HOST)")!
default:
url = URL(string: "\(Self.URL_PREFIX)www.\(Self.HOST)")!
}
}
}
url = url.appendingPathComponent(endpoint.path())
Expand Down Expand Up @@ -98,17 +103,24 @@ public class API {

public func request<T: Decodable>(endpoint: Endpoint,
basicAuthUser: String? = nil,
forceSignedOutURL: Bool = false,
httpMethod: String = "GET",
isJSONEndpoint: Bool = true,
queryParamsAsBody: Bool = false,
params: [String: String]? = nil) -> AnyPublisher<T ,NetworkError> {

if basicAuthUser != nil || authenticatedSession != nil ||
OauthClient.shared.authState == .signedOut || OauthClient.shared.authState == .signinInProgress {
let url = Self.makeURL(endpoint: endpoint, basicAuthUser: basicAuthUser, isJSONAPI: isJSONEndpoint)
let request = Self.makeRequest(url: url, httpMethod: httpMethod, queryParamsAsBody: queryParamsAsBody, params: params)
let url = Self.makeURL(endpoint: endpoint,
basicAuthUser: basicAuthUser,
forceSignedOutURL: forceSignedOutURL,
isJSONAPI: isJSONEndpoint)
let request = Self.makeRequest(url: url,
httpMethod: httpMethod,
queryParamsAsBody: queryParamsAsBody,
params: params)

if let session = authenticatedSession {
if let session = authenticatedSession, !forceSignedOutURL {
return executeRequest(publisher: session.dataTaskPublisher(for: request))
} else {
return executeRequest(publisher: signedOutSession.dataTaskPublisher(for: request))
Expand All @@ -119,6 +131,7 @@ public class API {
.map {
$0.dataTaskPublisher(for: Self.makeRequest(url: Self.makeURL(endpoint: endpoint,
basicAuthUser: basicAuthUser,
forceSignedOutURL: forceSignedOutURL,
isJSONAPI: isJSONEndpoint),
httpMethod: httpMethod,
queryParamsAsBody: queryParamsAsBody,
Expand Down
3 changes: 3 additions & 0 deletions Packages/Backend/Sources/Backend/Network/Endpoint.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public enum Endpoint {
case userSaved(username: String)
case userSubmitted(username: String)
case userComments(username: String)
case trendingSubreddits

func path() -> String {
switch self {
Expand Down Expand Up @@ -59,6 +60,8 @@ public enum Endpoint {
return "user/\(username)/submitted"
case let .userComments(username):
return "user/\(username)/comments"
case .trendingSubreddits:
return "api/trending_subreddits"
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import Foundation
import Combine

extension TrendingSubreddits {
public static func fetch() -> AnyPublisher<TrendingSubreddits, Never> {
API.shared.request(endpoint: .trendingSubreddits, forceSignedOutURL: true)
.subscribe(on: DispatchQueue.global())
.catch { _ in Empty(completeImmediately: false) }
.eraseToAnyPublisher()
}
}
23 changes: 20 additions & 3 deletions RedditOs/Features/Search/SearchMainContentView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,31 @@ struct SearchMainContentView: View {
} else {
ToolbarSearchBar(isPopoverEnabled: false)
.padding()
if !searchState.searchText.isEmpty {
List {
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 {
GlobalSearchPopoverView()
}.listStyle(PlainListStyle())
}
}
.listStyle(PlainListStyle())
.padding(.horizontal)
Spacer()
}
}.navigationTitle("Search")
.onAppear {
searchState.fetchTrending()
}
}
}

Expand Down
12 changes: 12 additions & 0 deletions RedditOs/Features/Search/SearchState.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ class SearchState: ObservableObject {
@Published var searchText = ""
@Published var results: [SubredditSmall]?
@Published var filteredSubscriptions: [Subreddit]?
@Published var trending: TrendingSubreddits?
@Published var isLoading = false

private var currentUser: CurrentUserStore
Expand All @@ -22,6 +23,7 @@ class SearchState: ObservableObject {
private var instantSearchCancellable: AnyCancellable?
private var apiPublisher: AnyPublisher<SubredditResponse, Never>?
private var apiCancellable: AnyCancellable?
private var cancellableSet: Set<AnyCancellable> = Set()

init(currentUser: CurrentUserStore = .shared) {
self.currentUser = currentUser
Expand Down Expand Up @@ -69,4 +71,14 @@ class SearchState: ObservableObject {
}

}

public func fetchTrending() {
TrendingSubreddits.fetch()
.subscribe(on: DispatchQueue.global())
.receive(on: DispatchQueue.main)
.sink { [weak self] trending in
self?.trending = trending
}
.store(in: &cancellableSet)
}
}

0 comments on commit 372e4f2

Please sign in to comment.