Files
comaps/iphone/Maps/UI/Search/SearchOnMap/SearchOnMapManager.swift
Konstantin Pastbin e3e4a1985a Organic Maps sources as of 02.04.2025 (fad26bbf22ac3da75e01e62aa01e5c8e11861005)
To expand with full Organic Maps and Maps.ME commits history run:
  git remote add om-historic [om-historic.git repo url]
  git fetch --tags om-historic
  git replace squashed-history historic-commits
2025-05-08 21:10:51 +07:00

94 lines
2.6 KiB
Swift

@objc
enum SearchOnMapState: Int {
case searching
case hidden
case closed
}
@objc
enum SearchOnMapRoutingTooltipSearch: Int {
case none
case start
case finish
}
@objc
protocol SearchOnMapManagerObserver: AnyObject {
func searchManager(didChangeState state: SearchOnMapState)
}
@objcMembers
final class SearchOnMapManager: NSObject {
private var interactor: SearchOnMapInteractor? { viewController?.interactor }
private let observers = ListenerContainer<SearchOnMapManagerObserver>()
weak var viewController: SearchOnMapViewController?
var isSearching: Bool { viewController != nil }
override init() {
super.init()
}
// MARK: - Public methods
func startSearching(isRouting: Bool) {
if viewController != nil {
interactor?.handle(.openSearch)
return
}
FrameworkHelper.deactivateMapSelection()
let viewController = SearchOnMapViewControllerBuilder.build(isRouting: isRouting,
didChangeState: notifyObservers)
self.viewController = viewController
}
func hide() {
interactor?.handle(.hideSearch)
}
func close() {
interactor?.handle(.closeSearch)
}
func setRoutingTooltip(_ tooltip: SearchOnMapRoutingTooltipSearch) {
interactor?.routingTooltipSearch = tooltip
}
func setPlaceOnMapSelected(_ isSelected: Bool) {
interactor?.handle(isSelected ? .didSelectPlaceOnMap : .didDeselectPlaceOnMap)
}
func setMapIsDragging() {
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 addObserver(_ observer: SearchOnMapManagerObserver) {
observers.addListener(observer)
}
func removeObserver(_ observer: SearchOnMapManagerObserver) {
observers.removeListener(observer)
}
private func notifyObservers(_ state: SearchOnMapState) {
observers.forEach { observer in observer.searchManager(didChangeState: state) }
}
}
private struct SearchOnMapViewControllerBuilder {
static func build(isRouting: Bool, didChangeState: @escaping ((SearchOnMapState) -> Void)) -> SearchOnMapViewController {
let viewController = SearchOnMapViewController()
let presenter = SearchOnMapPresenter(isRouting: isRouting,
didChangeState: didChangeState)
let interactor = SearchOnMapInteractor(presenter: presenter)
presenter.view = viewController
viewController.interactor = interactor
viewController.show()
return viewController
}
}