mirror of
https://codeberg.org/comaps/comaps
synced 2026-01-07 13:03:54 +00:00
[ios] refactor search - use SearchQuery class instead of text+locale+isCategory
Signed-off-by: Kiryl Kaveryn <kirylkaveryn@gmail.com>
This commit is contained in:
committed by
Konstantin Pastbin
parent
09171651ff
commit
96c24cf973
@@ -139,7 +139,7 @@ final class SearchOnMapHeaderView: UIView {
|
||||
}
|
||||
}
|
||||
|
||||
var searchText: SearchOnMap.SearchText {
|
||||
SearchOnMap.SearchText(searchBar.text ?? "", locale: searchBar.textInputMode?.primaryLanguage)
|
||||
var searchQuery: SearchQuery {
|
||||
SearchQuery(searchBar.text ?? "", locale: searchBar.textInputMode?.primaryLanguage, source: .typedText)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,12 +41,12 @@ final class SearchOnMapInteractor: NSObject {
|
||||
return processTypedText(searchText)
|
||||
case .clearButtonDidTap:
|
||||
return processClearButtonDidTap()
|
||||
case .didSelectText(let searchText, let isCategory):
|
||||
return processSelectedText(searchText, isCategory: isCategory)
|
||||
case .didSelect(let searchText):
|
||||
return processSelectedText(searchText)
|
||||
case .searchButtonDidTap(let searchText):
|
||||
return processSearchButtonDidTap(searchText)
|
||||
case .didSelectResult(let result, let searchText):
|
||||
return processSelectedResult(result, searchText: searchText)
|
||||
case .didSelectResult(let result, let query):
|
||||
return processSelectedResult(result, query: query)
|
||||
case .didSelectPlaceOnMap:
|
||||
return isIPad ? .none : .setSearchScreenHidden(true)
|
||||
case .didDeselectPlaceOnMap:
|
||||
@@ -66,38 +66,31 @@ final class SearchOnMapInteractor: NSObject {
|
||||
return .clearSearch
|
||||
}
|
||||
|
||||
private func processSearchButtonDidTap(_ searchText: SearchOnMap.SearchText) -> SearchOnMap.Response {
|
||||
searchManager.saveQuery(searchText.text,
|
||||
forInputLocale: searchText.locale)
|
||||
private func processSearchButtonDidTap(_ query: SearchQuery) -> SearchOnMap.Response {
|
||||
searchManager.save(query)
|
||||
showResultsOnMap = true
|
||||
searchManager.showEverywhereSearchResultsOnMap()
|
||||
return .showOnTheMap
|
||||
}
|
||||
|
||||
private func processTypedText(_ searchText: SearchOnMap.SearchText) -> SearchOnMap.Response {
|
||||
private func processTypedText(_ query: SearchQuery) -> SearchOnMap.Response {
|
||||
isUpdatesDisabled = false
|
||||
searchManager.searchQuery(searchText.text,
|
||||
forInputLocale: searchText.locale,
|
||||
withCategory: false)
|
||||
searchManager.searchQuery(query)
|
||||
return .startSearching
|
||||
}
|
||||
|
||||
private func processSelectedText(_ searchText: SearchOnMap.SearchText, isCategory: Bool) -> SearchOnMap.Response {
|
||||
private func processSelectedText(_ query: SearchQuery) -> SearchOnMap.Response {
|
||||
isUpdatesDisabled = false
|
||||
searchManager.saveQuery(searchText.text,
|
||||
forInputLocale: searchText.locale)
|
||||
searchManager.searchQuery(searchText.text,
|
||||
forInputLocale: searchText.locale,
|
||||
withCategory: isCategory)
|
||||
searchManager.save(query)
|
||||
searchManager.searchQuery(query)
|
||||
showResultsOnMap = true
|
||||
return .selectText(searchText.text)
|
||||
return .selectQuery(query)
|
||||
}
|
||||
|
||||
private func processSelectedResult(_ result: SearchResult, searchText: SearchOnMap.SearchText) -> SearchOnMap.Response {
|
||||
private func processSelectedResult(_ result: SearchResult, query: SearchQuery) -> SearchOnMap.Response {
|
||||
switch result.itemType {
|
||||
case .regular:
|
||||
searchManager.saveQuery(searchText.text,
|
||||
forInputLocale:searchText.locale)
|
||||
searchManager.save(query)
|
||||
switch routingTooltipSearch {
|
||||
case .none:
|
||||
searchManager.showResult(at: result.index)
|
||||
@@ -120,10 +113,11 @@ final class SearchOnMapInteractor: NSObject {
|
||||
}
|
||||
return isIPad ? .none : .setSearchScreenHidden(true)
|
||||
case .suggestion:
|
||||
searchManager.searchQuery(result.suggestion,
|
||||
forInputLocale: searchText.locale,
|
||||
withCategory: result.isPureSuggest)
|
||||
return .selectText(result.suggestion)
|
||||
var suggestionQuery = SearchQuery(result.suggestion,
|
||||
locale: query.locale,
|
||||
source: result.isPureSuggest ? .suggestion : .typedText)
|
||||
searchManager.searchQuery(suggestionQuery)
|
||||
return .selectQuery(suggestionQuery)
|
||||
@unknown default:
|
||||
fatalError("Unsupported result type")
|
||||
}
|
||||
|
||||
@@ -61,9 +61,8 @@ final class SearchOnMapManager: NSObject {
|
||||
interactor?.handle(.didStartDraggingMap)
|
||||
}
|
||||
|
||||
func searchText(_ text: String, locale: String, isCategory: Bool) {
|
||||
let searchText = SearchOnMap.SearchText(text, locale: locale)
|
||||
interactor?.handle(.didSelectText(searchText, isCategory: isCategory))
|
||||
func searchText(_ searchText: SearchQuery) {
|
||||
interactor?.handle(.didSelect(searchText))
|
||||
}
|
||||
|
||||
func addObserver(_ observer: SearchOnMapManagerObserver) {
|
||||
|
||||
@@ -1,3 +1,16 @@
|
||||
@objcMembers
|
||||
final class SearchQuery: NSObject {
|
||||
let text: String
|
||||
let locale: String
|
||||
let source: SearchTextSource
|
||||
|
||||
init(_ text: String, locale: String? = nil, source: SearchTextSource) {
|
||||
self.text = text
|
||||
self.locale = locale ?? AppInfo.shared().languageId
|
||||
self.source = source
|
||||
}
|
||||
}
|
||||
|
||||
enum SearchOnMap {
|
||||
struct ViewModel: Equatable {
|
||||
enum Content: Equatable {
|
||||
@@ -30,16 +43,6 @@ enum SearchOnMap {
|
||||
}
|
||||
}
|
||||
|
||||
struct SearchText {
|
||||
let text: String
|
||||
let locale: String
|
||||
|
||||
init(_ text: String, locale: String? = nil) {
|
||||
self.text = text
|
||||
self.locale = locale ?? AppInfo.shared().languageId
|
||||
}
|
||||
}
|
||||
|
||||
enum Request {
|
||||
case openSearch
|
||||
case hideSearch
|
||||
@@ -47,10 +50,10 @@ enum SearchOnMap {
|
||||
case didStartDraggingSearch
|
||||
case didStartDraggingMap
|
||||
case didStartTyping
|
||||
case didType(SearchText)
|
||||
case didSelectText(SearchText, isCategory: Bool)
|
||||
case didSelectResult(SearchResult, withSearchText: SearchText)
|
||||
case searchButtonDidTap(SearchText)
|
||||
case didType(SearchQuery)
|
||||
case didSelect(SearchQuery)
|
||||
case didSelectResult(SearchResult, withQuery: SearchQuery)
|
||||
case searchButtonDidTap(SearchQuery)
|
||||
case clearButtonDidTap
|
||||
case didSelectPlaceOnMap
|
||||
case didDeselectPlaceOnMap
|
||||
@@ -63,7 +66,7 @@ enum SearchOnMap {
|
||||
case setIsTyping(Bool)
|
||||
case showHistoryAndCategory
|
||||
case showResults(SearchResults, isSearchCompleted: Bool = false)
|
||||
case selectText(String?)
|
||||
case selectQuery(SearchQuery)
|
||||
case clearSearch
|
||||
case setSearchScreenHidden(Bool)
|
||||
case setSearchScreenCompact
|
||||
|
||||
@@ -74,11 +74,11 @@ final class SearchOnMapPresenter {
|
||||
searchResults.skipSuggestions()
|
||||
}
|
||||
viewModel.contentState = searchResults.isEmpty && isSearchCompleted ? .noResults : .results(searchResults)
|
||||
case .selectText(let text):
|
||||
viewModel.isTyping = false
|
||||
case .selectQuery(let query):
|
||||
viewModel.skipSuggestions = false
|
||||
viewModel.searchingText = text
|
||||
viewModel.searchingText = query.text
|
||||
viewModel.contentState = .searching
|
||||
viewModel.isTyping = false
|
||||
viewModel.presentationStep = isRouting ? .hidden : .halfScreen
|
||||
case .clearSearch:
|
||||
viewModel.searchingText = ""
|
||||
|
||||
@@ -18,7 +18,6 @@ protocol ModallyPresentedViewController: AnyObject {
|
||||
final class SearchOnMapViewController: UIViewController {
|
||||
typealias ViewModel = SearchOnMap.ViewModel
|
||||
typealias Content = SearchOnMap.ViewModel.Content
|
||||
typealias SearchText = SearchOnMap.SearchText
|
||||
|
||||
fileprivate enum Constants {
|
||||
static let estimatedRowHeight: CGFloat = 80
|
||||
@@ -417,7 +416,7 @@ extension SearchOnMapViewController: UITableViewDataSource {
|
||||
extension SearchOnMapViewController: UITableViewDelegate {
|
||||
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
||||
let result = searchResults[indexPath.row]
|
||||
interactor?.handle(.didSelectResult(result, withSearchText: headerView.searchText))
|
||||
interactor?.handle(.didSelectResult(result, withQuery: headerView.searchQuery))
|
||||
tableView.deselectRow(at: indexPath, animated: true)
|
||||
}
|
||||
|
||||
@@ -437,12 +436,12 @@ extension SearchOnMapViewController: SearchOnMapHeaderViewDelegate {
|
||||
interactor?.handle(.clearButtonDidTap)
|
||||
return
|
||||
}
|
||||
interactor?.handle(.didType(SearchText(searchText, locale: searchBar.textInputMode?.primaryLanguage)))
|
||||
interactor?.handle(.didType(SearchQuery(searchText, locale: searchBar.textInputMode?.primaryLanguage, source: .typedText)))
|
||||
}
|
||||
|
||||
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
|
||||
guard let searchText = searchBar.text, !searchText.isEmpty else { return }
|
||||
interactor?.handle(.searchButtonDidTap(SearchText(searchText, locale: searchBar.textInputMode?.primaryLanguage)))
|
||||
interactor?.handle(.searchButtonDidTap(SearchQuery(searchText, locale: searchBar.textInputMode?.primaryLanguage, source: .typedText)))
|
||||
}
|
||||
|
||||
func cancelButtonDidTap() {
|
||||
@@ -456,8 +455,8 @@ extension SearchOnMapViewController: SearchOnMapHeaderViewDelegate {
|
||||
|
||||
// MARK: - SearchTabViewControllerDelegate
|
||||
extension SearchOnMapViewController: SearchTabViewControllerDelegate {
|
||||
func searchTabController(_ viewController: SearchTabViewController, didSearch text: String, withCategory: Bool) {
|
||||
interactor?.handle(.didSelectText(SearchText(text, locale: nil), isCategory: withCategory))
|
||||
func searchTabController(_ viewController: SearchTabViewController, didSearch query: SearchQuery) {
|
||||
interactor?.handle(.didSelect(query))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user