diff --git a/AutoCat.xcodeproj/project.pbxproj b/AutoCat.xcodeproj/project.pbxproj index 746a8c9..5c9283d 100644 --- a/AutoCat.xcodeproj/project.pbxproj +++ b/AutoCat.xcodeproj/project.pbxproj @@ -1661,7 +1661,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = AutoCat/AutoCat.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 166; + CURRENT_PROJECT_VERSION = 167; DEVELOPMENT_TEAM = 46DTTB8X4S; INFOPLIST_FILE = AutoCat/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = AutoCat; @@ -1690,7 +1690,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = AutoCat/AutoCat.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 166; + CURRENT_PROJECT_VERSION = 167; DEVELOPMENT_TEAM = 46DTTB8X4S; INFOPLIST_FILE = AutoCat/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = AutoCat; diff --git a/AutoCat/Screens/MapScreen/MapScreen.swift b/AutoCat/Screens/MapScreen/MapScreen.swift index b6adc02..6f0df6a 100644 --- a/AutoCat/Screens/MapScreen/MapScreen.swift +++ b/AutoCat/Screens/MapScreen/MapScreen.swift @@ -27,7 +27,7 @@ struct MapScreen: View { } var body: some View { - Map { + Map(position: $viewModel.currentPosition) { ForEach(viewModel.markers) { Marker($0.title, coordinate: $0.coordinate) } diff --git a/AutoCat/Screens/MapScreen/MapViewModel.swift b/AutoCat/Screens/MapScreen/MapViewModel.swift index 139963e..5a13278 100644 --- a/AutoCat/Screens/MapScreen/MapViewModel.swift +++ b/AutoCat/Screens/MapScreen/MapViewModel.swift @@ -28,6 +28,7 @@ final class MapViewModel: ACHudContainer { let clusterManager = ClusterManager() var mapSize: CGSize = .zero var currentRegion: MKCoordinateRegion = .init() + var currentPosition: MapCameraPosition = .automatic var isFilter: Bool { switch mapInput { @@ -75,7 +76,7 @@ final class MapViewModel: ACHudContainer { title = String.localizedStringWithFormat(NSLocalizedString("events found", comment: ""), events.count) await clusterManager.add(markers) await reloadMarkers() - currentRegion = getRegion(for: markers) + currentPosition = getRegion(for: markers) } } @@ -114,9 +115,9 @@ final class MapViewModel: ACHudContainer { } } - func getRegion(for markers: [MapMarkerModel]) -> MKCoordinateRegion { + func getRegion(for markers: [MapMarkerModel]) -> MapCameraPosition { guard !markers.isEmpty else { - return .init() + return .automatic } let latitudes = markers.map(\.coordinate.latitude) @@ -127,15 +128,17 @@ final class MapViewModel: ACHudContainer { let minLong = longitudes.min() ?? 0 let maxLong = longitudes.max() ?? 0 - return .init( + let region = MKCoordinateRegion( center: .init( - latitude: (maxLat - minLat)/2, - longitude: (maxLong - minLong)/2 + latitude: (maxLat + minLat)/2, + longitude: (maxLong + minLong)/2 ), span: .init( - latitudeDelta: (maxLat - minLat)*1.2, - longitudeDelta: (maxLong - minLong)*1.2 + latitudeDelta: (maxLat - minLat)*1.3, + longitudeDelta: (maxLong - minLong)*1.3 ) ) + + return .region(region) } } diff --git a/AutoCat/Screens/SearchScreen/SearchScreen.swift b/AutoCat/Screens/SearchScreen/SearchScreen.swift index 31c80db..df8bcef 100644 --- a/AutoCat/Screens/SearchScreen/SearchScreen.swift +++ b/AutoCat/Screens/SearchScreen/SearchScreen.swift @@ -33,7 +33,14 @@ struct SearchScreen: View { } .listStyle(.plain) .hud($viewModel.hud) - .searchable(text: $viewModel.searchText, prompt: "Search plate numbers") + .searchable( + text: $viewModel.searchText, + tokens: $viewModel.currentScopes, + suggestedTokens: .constant(SearchScope.allCases), + prompt: "Search plate numbers" + ) { scope in + Text(scope.title) + } .searchPresentationToolbarBehavior(.avoidHidingContent) .makeTextFieldDumb() .titleModeInline() diff --git a/AutoCat/Screens/SearchScreen/SearchViewModel.swift b/AutoCat/Screens/SearchScreen/SearchViewModel.swift index 0754052..6168a5a 100644 --- a/AutoCat/Screens/SearchScreen/SearchViewModel.swift +++ b/AutoCat/Screens/SearchScreen/SearchViewModel.swift @@ -46,6 +46,7 @@ final class SearchViewModel: ACHudContainer { didSet { if searchText != oldValue { filter.searchString = searchText + filter.scope = currentScopes.first ?? .plateNumber searchTask = Task { [filter] in do { try await Task.sleep(for: .milliseconds(500)) @@ -56,6 +57,8 @@ final class SearchViewModel: ACHudContainer { } } + var currentScopes: [SearchScope] = [] + @ObservationIgnored @AutoCancellable var searchTask: Task? diff --git a/AutoCatCore/Models/Filter.swift b/AutoCatCore/Models/Filter.swift index bc12a06..6618416 100644 --- a/AutoCatCore/Models/Filter.swift +++ b/AutoCatCore/Models/Filter.swift @@ -38,11 +38,11 @@ public enum SortOrder: String, CustomStringConvertible, CaseIterable, Sendable { } } -public enum SearchScope: Int, CaseIterable, Sendable, Hashable { +public enum SearchScope: String, CaseIterable, Sendable, Hashable, Identifiable { - case plateNumber = 0 - case vin = 1 - case notes = 2 + case plateNumber + case vin + case notes public var title: String { switch self { @@ -52,12 +52,8 @@ public enum SearchScope: Int, CaseIterable, Sendable, Hashable { } } - public var stringValue: String { - switch self { - case .plateNumber: return "plateNumber" - case .vin: return "vin" - case .notes: return "notes" - } + public var id: String { + rawValue } } @@ -170,7 +166,7 @@ public struct Filter: Sendable, Hashable { dict["toLocationDate"] = String(toLocationDate.timeIntervalSince1970) } - dict["scope"] = scope.stringValue + dict["scope"] = scope.rawValue return dict }