2021-07-30 04:04:13 +05:30
|
|
|
import Defaults
|
|
|
|
import Siesta
|
|
|
|
import SwiftUI
|
|
|
|
|
2021-09-25 13:48:22 +05:30
|
|
|
final class SearchModel: ObservableObject {
|
2021-10-22 04:59:10 +05:30
|
|
|
@Published var store = Store<[ContentItem]>()
|
2021-09-14 02:11:16 +05:30
|
|
|
|
2021-10-17 04:18:58 +05:30
|
|
|
var accounts = AccountsModel()
|
2021-09-25 13:48:22 +05:30
|
|
|
@Published var query = SearchQuery()
|
2021-09-19 18:12:47 +05:30
|
|
|
@Published var queryText = ""
|
2021-09-14 02:11:16 +05:30
|
|
|
@Published var querySuggestions = Store<[String]>()
|
2021-12-06 23:42:33 +05:30
|
|
|
@Published var suggestionsText = ""
|
2021-09-14 02:11:16 +05:30
|
|
|
|
2021-11-28 20:07:55 +05:30
|
|
|
@Published var fieldIsFocused = false
|
|
|
|
|
2021-07-30 04:04:13 +05:30
|
|
|
private var previousResource: Resource?
|
|
|
|
private var resource: Resource!
|
|
|
|
|
|
|
|
var isLoading: Bool {
|
2021-09-25 17:47:58 +05:30
|
|
|
resource?.isLoading ?? false
|
2021-09-14 02:11:16 +05:30
|
|
|
}
|
|
|
|
|
2021-07-30 04:04:13 +05:30
|
|
|
func changeQuery(_ changeHandler: @escaping (SearchQuery) -> Void = { _ in }) {
|
|
|
|
changeHandler(query)
|
|
|
|
|
2021-10-21 03:51:50 +05:30
|
|
|
let newResource = accounts.api.search(query)
|
2021-07-30 04:04:13 +05:30
|
|
|
guard newResource != previousResource else {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
previousResource?.removeObservers(ownedBy: store)
|
|
|
|
previousResource = newResource
|
|
|
|
|
2021-09-19 16:36:54 +05:30
|
|
|
resource = newResource
|
|
|
|
resource.addObserver(store)
|
2021-09-26 23:10:25 +05:30
|
|
|
|
|
|
|
if !query.isEmpty {
|
|
|
|
loadResourceIfNeededAndReplaceStore()
|
|
|
|
}
|
2021-09-19 16:36:54 +05:30
|
|
|
}
|
|
|
|
|
2021-09-26 23:10:25 +05:30
|
|
|
func resetQuery(_ query: SearchQuery = SearchQuery()) {
|
2021-09-19 16:36:54 +05:30
|
|
|
self.query = query
|
|
|
|
|
2021-10-21 03:51:50 +05:30
|
|
|
let newResource = accounts.api.search(query)
|
2021-09-19 16:36:54 +05:30
|
|
|
guard newResource != previousResource else {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
store.replace([])
|
|
|
|
|
|
|
|
previousResource?.removeObservers(ownedBy: store)
|
|
|
|
previousResource = newResource
|
2021-07-30 04:04:13 +05:30
|
|
|
|
|
|
|
resource = newResource
|
|
|
|
resource.addObserver(store)
|
2021-09-26 23:10:25 +05:30
|
|
|
|
|
|
|
if !query.isEmpty {
|
|
|
|
loadResourceIfNeededAndReplaceStore()
|
|
|
|
}
|
2021-07-30 04:04:13 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
func loadResourceIfNeededAndReplaceStore() {
|
|
|
|
let currentResource = resource!
|
|
|
|
|
|
|
|
if let request = resource.loadIfNeeded() {
|
|
|
|
request.onSuccess { response in
|
2021-10-22 04:59:10 +05:30
|
|
|
if let results: [ContentItem] = response.typedContent() {
|
|
|
|
self.replace(results, for: currentResource)
|
2021-07-30 04:04:13 +05:30
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
replace(store.collection, for: currentResource)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-22 04:59:10 +05:30
|
|
|
func replace(_ videos: [ContentItem], for resource: Resource) {
|
2021-07-30 04:04:13 +05:30
|
|
|
if self.resource == resource {
|
2021-10-22 04:59:10 +05:30
|
|
|
store = Store<[ContentItem]>(videos)
|
2021-07-30 04:04:13 +05:30
|
|
|
}
|
|
|
|
}
|
2021-09-25 17:47:58 +05:30
|
|
|
|
|
|
|
private var suggestionsDebounceTimer: Timer?
|
|
|
|
|
|
|
|
func loadSuggestions(_ query: String) {
|
2021-11-28 20:07:55 +05:30
|
|
|
guard !query.isEmpty else {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2021-09-25 17:47:58 +05:30
|
|
|
suggestionsDebounceTimer?.invalidate()
|
|
|
|
|
2021-12-06 23:42:33 +05:30
|
|
|
suggestionsDebounceTimer = Timer.scheduledTimer(withTimeInterval: 0.2, repeats: false) { _ in
|
2021-10-21 03:51:50 +05:30
|
|
|
let resource = self.accounts.api.searchSuggestions(query: query)
|
2021-09-25 17:47:58 +05:30
|
|
|
|
|
|
|
resource.addObserver(self.querySuggestions)
|
|
|
|
resource.loadIfNeeded()
|
|
|
|
|
|
|
|
if let request = resource.loadIfNeeded() {
|
|
|
|
request.onSuccess { response in
|
|
|
|
if let suggestions: [String] = response.typedContent() {
|
|
|
|
self.querySuggestions = Store<[String]>(suggestions)
|
|
|
|
}
|
2021-12-06 23:42:33 +05:30
|
|
|
self.suggestionsText = query
|
2021-09-25 17:47:58 +05:30
|
|
|
}
|
|
|
|
} else {
|
|
|
|
self.querySuggestions = Store<[String]>(self.querySuggestions.collection)
|
2021-12-06 23:42:33 +05:30
|
|
|
self.suggestionsText = query
|
2021-09-25 17:47:58 +05:30
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-07-30 04:04:13 +05:30
|
|
|
}
|