AutoCat/AutoCat/Controllers/SearchController.swift
2020-06-20 14:34:01 +03:00

98 lines
3.8 KiB
Swift

import UIKit
import RxDataSources
import RxSwift
import RxCocoa
class SearchController: UIViewController, UISearchResultsUpdating {
@IBOutlet weak var tableView: UITableView!
let bag = DisposeBag()
let searchController = UISearchController(searchResultsController: nil)
var filterRelay = BehaviorRelay<Filter>(value: Filter())
var filter = Filter()
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchResultsUpdater = self
searchController.obscuresBackgroundDuringPresentation = false
searchController.searchBar.placeholder = "Search plate numbers"
navigationItem.searchController = searchController
definesPresentationContext = true
let ds = RxTableViewSectionedAnimatedDataSource<DateSection<Vehicle>>(configureCell: { dataSource, tableView, indexPath, item in
if let cell = tableView.dequeueReusableCell(withIdentifier: "VehicleCell", for: indexPath) as? VehicleCell {
cell.configure(with: item)
return cell
} else {
return UITableViewCell()
}
})
ds.titleForHeaderInSection = { dataSourse, index in
return dataSourse.sectionModels[index].header
}
self.tableView.rx.modelSelected(Vehicle.self)
.subscribe(onNext: self.updateDetailController(with:))
.disposed(by: self.bag)
self.filterRelay
//.throttle(.seconds(2), scheduler: MainScheduler.instance)
.debounce(.milliseconds(500), scheduler: MainScheduler.instance)
.flatMap(Api.getVehicles)
.observeOn(MainScheduler.instance)
.do(onNext: { self.navigationItem.title = "\($0.count) vehicles found" })
.map { $0.groupedByDate() }
.bind(to: self.tableView.rx.items(dataSource: ds))
.disposed(by: self.bag)
}
// FIXME: Code duplication
func updateDetailController(with vehicle: Vehicle) {
if let splitViewController = self.view.window?.rootViewController as? UISplitViewController
{
var detail: UINavigationController?
if splitViewController.viewControllers.count == 2 {
detail = splitViewController.viewControllers.last as? UINavigationController
} else {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
detail = storyboard.instantiateViewController(identifier: "ReportNavController")
}
if let detail = detail {
detail.popToRootViewController(animated: true)
let report = detail.viewControllers.first as? ReportController
report?.vehicle = vehicle
splitViewController.showDetailViewController(detail, sender: self)
//self.performSegue(withIdentifier: "OpenDetailSegue", sender: self)
}
}
}
// MARK: - UISearchResultsUpdating
func updateSearchResults(for searchController: UISearchController) {
let newQuery = searchController.searchBar.text?.uppercased() ?? ""
guard self.filter.searchString != newQuery else { return }
self.filter.searchString = newQuery
self.filterRelay.accept(self.filter)
}
// MARK: -
@IBAction func onFilter(_ sender: UIBarButtonItem) {
let sb = UIStoryboard(name: "Main", bundle: nil)
let controller = sb.instantiateViewController(identifier: "FiltersController") as FiltersController
controller.filter = self.filter
controller.onDone = {
self.filter = controller.filter
self.filterRelay.accept(self.filter)
}
self.navigationController?.pushViewController(controller, animated: true)
}
}