diff --git a/AutoCat.xcodeproj/project.pbxproj b/AutoCat.xcodeproj/project.pbxproj index 776b895..cb733b3 100644 --- a/AutoCat.xcodeproj/project.pbxproj +++ b/AutoCat.xcodeproj/project.pbxproj @@ -33,6 +33,7 @@ 7A2DE69B25869ABD00A113FC /* AdsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A2DE69A25869ABD00A113FC /* AdsController.swift */; }; 7A2DE69E2589606A00A113FC /* ImageGridRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A2DE69D2589606A00A113FC /* ImageGridRow.swift */; }; 7A33381124990DAE00D878F1 /* FiltersController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A33381024990DAE00D878F1 /* FiltersController.swift */; }; + 7A3399AB299063370087DF98 /* SearchControllerExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A3399AA299063370087DF98 /* SearchControllerExt.swift */; }; 7A35177B27E23F8800DC538C /* Eureka in Frameworks */ = {isa = PBXBuildFile; productRef = 7A35177A27E23F8800DC538C /* Eureka */; }; 7A3F07AB24360DC800E59687 /* Dated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A3F07AA24360DC800E59687 /* Dated.swift */; }; 7A3F07AD2436350B00E59687 /* SearchController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A3F07AC2436350B00E59687 /* SearchController.swift */; }; @@ -205,6 +206,7 @@ 7A2DE69D2589606A00A113FC /* ImageGridRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageGridRow.swift; sourceTree = ""; }; 7A33381024990DAE00D878F1 /* FiltersController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FiltersController.swift; sourceTree = ""; }; 7A333813249A532400D878F1 /* Filter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Filter.swift; sourceTree = ""; }; + 7A3399AA299063370087DF98 /* SearchControllerExt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchControllerExt.swift; sourceTree = ""; }; 7A3F07AA24360DC800E59687 /* Dated.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Dated.swift; sourceTree = ""; }; 7A3F07AC2436350B00E59687 /* SearchController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchController.swift; sourceTree = ""; }; 7A43F9F7246C8A6200BA5B49 /* JWT.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JWT.swift; sourceTree = ""; }; @@ -598,6 +600,7 @@ 7AC355572969744100889457 /* Extensions */ = { isa = PBXGroup; children = ( + 7A3399AA299063370087DF98 /* SearchControllerExt.swift */, 7AC3555129696E3F00889457 /* UIView+layout.swift */, 7AC355582969746600889457 /* UIControl.swift */, 7AC3555A296995B200889457 /* UIEdgeInsets.swift */, @@ -837,6 +840,7 @@ 7A11470123FDE7E500B424AF /* AppDelegate.swift in Sources */, 7ADF6C9D250FA96000F237B2 /* SwiftMaskTextfield.swift in Sources */, 7A813DC9250B5C9700CC93B9 /* LocationRow.swift in Sources */, + 7A3399AB299063370087DF98 /* SearchControllerExt.swift in Sources */, 7A2DE69B25869ABD00A113FC /* AdsController.swift in Sources */, 7A6DD90824329144009DE740 /* CenterTextLayer.swift in Sources */, 7A99406426E4BFAE002E9CB6 /* VehicleNoteCell.swift in Sources */, @@ -1136,7 +1140,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = AutoCat/AutoCat.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 107; + CURRENT_PROJECT_VERSION = 109; DEVELOPMENT_TEAM = 46DTTB8X4S; INFOPLIST_FILE = AutoCat/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.0; @@ -1161,7 +1165,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = AutoCat/AutoCat.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 107; + CURRENT_PROJECT_VERSION = 109; DEVELOPMENT_TEAM = 46DTTB8X4S; INFOPLIST_FILE = AutoCat/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.0; diff --git a/AutoCat/ACUIKit/Extensions/SearchControllerExt.swift b/AutoCat/ACUIKit/Extensions/SearchControllerExt.swift new file mode 100644 index 0000000..abfaf3e --- /dev/null +++ b/AutoCat/ACUIKit/Extensions/SearchControllerExt.swift @@ -0,0 +1,40 @@ +// +// SearchControllerExt.swift +// AutoCat +// +// Created by Selim Mustafaev on 06.02.2023. +// Copyright © 2023 Selim Mustafaev. All rights reserved. +// + +import UIKit + +extension UISearchController { + + static var `default`: UISearchController { + let searchController = UISearchController(searchResultsController: nil) + searchController.obscuresBackgroundDuringPresentation = false + searchController.hidesNavigationBarDuringPresentation = false + searchController.searchBar.keyboardType = .webSearch + return searchController + } + + func placeholder(_ placeholder: String) -> UISearchController { + searchBar.placeholder = placeholder + return self + } + + func resultsUpdater(_ updater: UISearchResultsUpdating) -> UISearchController { + searchResultsUpdater = updater + return self + } + + func makeDumb() -> UISearchController { + searchBar.autocorrectionType = .no + searchBar.spellCheckingType = .no + searchBar.autocapitalizationType = .none + searchBar.smartDashesType = .no + searchBar.smartQuotesType = .no + searchBar.smartInsertDeleteType = .no + return self + } +} diff --git a/AutoCat/Controllers/CheckController.swift b/AutoCat/Controllers/CheckController.swift index a594a57..a91767b 100644 --- a/AutoCat/Controllers/CheckController.swift +++ b/AutoCat/Controllers/CheckController.swift @@ -35,17 +35,16 @@ class CheckController: UIViewController, UITableViewDelegate, UISearchResultsUpd private var historyDataSource: RealmSectionedDataSource! private var historyFilter: HistoryFilter = .all - private let searchController = UISearchController(searchResultsController: nil) + private lazy var searchController: UISearchController = .default + .placeholder(NSLocalizedString("Search plate numbers", comment: "")) + .resultsUpdater(self) + .makeDumb() // MARK: - Lifecycle override func viewDidLoad() { super.viewDidLoad() - searchController.searchResultsUpdater = self - searchController.obscuresBackgroundDuringPresentation = false - searchController.searchBar.placeholder = NSLocalizedString("Search plate numbers", comment: "") - searchController.hidesNavigationBarDuringPresentation = false navigationItem.searchController = searchController guard let realm = try? Realm() else { return } diff --git a/AutoCat/Controllers/SearchController.swift b/AutoCat/Controllers/SearchController.swift index a972409..f1531c7 100644 --- a/AutoCat/Controllers/SearchController.swift +++ b/AutoCat/Controllers/SearchController.swift @@ -16,7 +16,12 @@ class SearchController: UIViewController, UISearchResultsUpdating, UITableViewDe private var moreActionsButton: UIBarButtonItem? private let bag = DisposeBag() - private let searchController = UISearchController(searchResultsController: nil) + + private lazy var searchController: UISearchController = .default + .placeholder(NSLocalizedString("Search plate numbers", comment: "")) + .resultsUpdater(self) + .makeDumb() + private var refreshControl = UIRefreshControl() private var datasource: RxSectionedDataSource! private var isLoadingPage = false @@ -30,10 +35,6 @@ class SearchController: UIViewController, UISearchResultsUpdating, UITableViewDe self.showMapButton?.isEnabled = false - searchController.searchResultsUpdater = self - searchController.obscuresBackgroundDuringPresentation = false - searchController.searchBar.placeholder = NSLocalizedString("Search plate numbers", comment: "") - searchController.hidesNavigationBarDuringPresentation = false navigationItem.searchController = searchController definesPresentationContext = true @@ -64,7 +65,14 @@ class SearchController: UIViewController, UISearchResultsUpdating, UITableViewDe .do(onNext: { _ in self.showProgress() }) - .flatMapLatest { Api.getVehicles(with: $0, pageToken: self.datasource.pageToken).do(onError: { print($0) }).catchErrorJustReturn(PagedResponse()) } + .flatMapLatest { filter in + if filter.needReset { + self.datasource.reset() + } + return Api.getVehicles(with: filter, pageToken: self.datasource.pageToken) + .do(onError: { print($0) }) + .catchErrorJustReturn(PagedResponse()) + } .observeOn(MainScheduler.instance) .do(onNext: { if let count = $0.count { @@ -126,7 +134,7 @@ class SearchController: UIViewController, UISearchResultsUpdating, UITableViewDe guard self.filter.searchString != newQuery else { return } self.filter.searchString = newQuery - self.datasource.reset() + self.filter.needReset = true self.filterRelay.accept(self.filter) } @@ -162,7 +170,7 @@ class SearchController: UIViewController, UISearchResultsUpdating, UITableViewDe @objc func refresh(_ sender: AnyObject) { self.showMapButton?.isEnabled = false - self.datasource.reset() + self.filter.needReset = true self.filterRelay.accept(self.filter) } @@ -173,7 +181,7 @@ class SearchController: UIViewController, UISearchResultsUpdating, UITableViewDe controller.onDone = { self.filter = controller.filter self.datasource.setSortParameter(self.filter.sortBy ?? .updatedDate) - self.datasource.reset() + self.filter.needReset = true self.filterRelay.accept(self.filter) } self.navigationController?.pushViewController(controller, animated: true) @@ -302,6 +310,7 @@ class SearchController: UIViewController, UISearchResultsUpdating, UITableViewDe let toBottom = tableView.contentSize.height - (tableView.contentOffset.y + tableView.frame.size.height) if toBottom < 100 && !self.isLoadingPage && self.datasource.needMoreData() { self.isLoadingPage = true + self.filter.needReset = false self.filterRelay.accept(self.filter) } } diff --git a/AutoCatCore/Models/Filter.swift b/AutoCatCore/Models/Filter.swift index bd0204d..9a7438f 100644 --- a/AutoCatCore/Models/Filter.swift +++ b/AutoCatCore/Models/Filter.swift @@ -54,6 +54,7 @@ public struct Filter { public var toDateUpdated: Date? public var fromLocationDate: Date? public var toLocationDate: Date? + public var needReset: Bool = false public init() { }