diff --git a/AutoCat.xcodeproj/project.pbxproj b/AutoCat.xcodeproj/project.pbxproj index 0461920..cdb5761 100644 --- a/AutoCat.xcodeproj/project.pbxproj +++ b/AutoCat.xcodeproj/project.pbxproj @@ -20,6 +20,7 @@ 7A131FD52D37B76A00DC7755 /* HistoryViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A131FD42D37B76A00DC7755 /* HistoryViewModel.swift */; }; 7A1441662C297EDE00E79018 /* NotesScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1441652C297EDE00E79018 /* NotesScreen.swift */; }; 7A1441682C297EFD00E79018 /* NotesViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1441672C297EFD00E79018 /* NotesViewModel.swift */; }; + 7A17ADA02DC9F4A5002BA02A /* ScreenInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A17AD9F2DC9F4A5002BA02A /* ScreenInput.swift */; }; 7A1CF81629A42117007962DA /* Realm.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1CF81529A42117007962DA /* Realm.swift */; }; 7A1E78F62CE900330004B740 /* ReportScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1E78F52CE900330004B740 /* ReportScreen.swift */; }; 7A1E78F82CE900440004B740 /* ReportViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1E78F72CE900440004B740 /* ReportViewModel.swift */; }; @@ -264,6 +265,7 @@ 7A1441652C297EDE00E79018 /* NotesScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotesScreen.swift; sourceTree = ""; }; 7A1441672C297EFD00E79018 /* NotesViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotesViewModel.swift; sourceTree = ""; }; 7A15051124DB3E3000F39631 /* AnyEncodable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnyEncodable.swift; sourceTree = ""; }; + 7A17AD9F2DC9F4A5002BA02A /* ScreenInput.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenInput.swift; sourceTree = ""; }; 7A1CF81529A42117007962DA /* Realm.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Realm.swift; sourceTree = ""; }; 7A1E78F52CE900330004B740 /* ReportScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportScreen.swift; sourceTree = ""; }; 7A1E78F72CE900440004B740 /* ReportViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportViewModel.swift; sourceTree = ""; }; @@ -573,6 +575,7 @@ children = ( 7AB4E4652D58A16C0006D052 /* GenericError.swift */, 7AE8CBB42DBA3B55005EF1AB /* Router.swift */, + 7A17AD9F2DC9F4A5002BA02A /* ScreenInput.swift */, ); path = Utils; sourceTree = ""; @@ -1357,6 +1360,7 @@ 7AE8CBB72DBA3E4E005EF1AB /* MainSplitScreen.swift in Sources */, 7AFBE8CE2C308B53003C491D /* ACMessageView.swift in Sources */, 7AAAFADE2C4D23620050410D /* ACImageSliderModel.swift in Sources */, + 7A17ADA02DC9F4A5002BA02A /* ScreenInput.swift in Sources */, 7A8AB76525A0DB8F00ECF2C1 /* BundleVersion.swift in Sources */, 7A9519822D80B6E500E69883 /* RecordsViewModel.swift in Sources */, 7AAAFADC2C4D1E130050410D /* ACImageSliderView+Modifier.swift in Sources */, diff --git a/AutoCat/Screens/LocationEditScreen/LocationEditScreen.swift b/AutoCat/Screens/LocationEditScreen/LocationEditScreen.swift index 9e524ca..4d46a28 100644 --- a/AutoCat/Screens/LocationEditScreen/LocationEditScreen.swift +++ b/AutoCat/Screens/LocationEditScreen/LocationEditScreen.swift @@ -11,9 +11,9 @@ import AutoCatCore struct LocationEditScreen: View { - enum Screen: String { - - case locationPicker + enum Screen: Hashable { + + case locationPicker(ScreenInput) } @Environment(\.dismiss) var dismiss @@ -32,7 +32,14 @@ struct LocationEditScreen: View { List { DatePicker("Date", selection: $viewModel.date) .datePickerStyle(.compact) - NavigationLink(value: Screen.locationPicker) { + NavigationLink( + value: Screen.locationPicker( + .init( + initialValue: viewModel.event, + onChange: viewModel.onEventUpdated + ) + ) + ) { TextRowView(title: "Location", value: viewModel.event.location) } } @@ -45,8 +52,12 @@ struct LocationEditScreen: View { } } } - .navigationDestination(for: Screen.self) { _ in - LocationPickerScreen(event: viewModel.event, onUpdate: viewModel.onEventUpdated) + .navigationDestination(for: Screen.self) { screen in + + switch screen { + case .locationPicker(let input): + LocationPickerScreen(event: input.initialValue, onUpdate: input.onChange) + } } } } diff --git a/AutoCat/Screens/LocationEditScreen/LocationEditViewModel.swift b/AutoCat/Screens/LocationEditScreen/LocationEditViewModel.swift index b63afc8..8a238cd 100644 --- a/AutoCat/Screens/LocationEditScreen/LocationEditViewModel.swift +++ b/AutoCat/Screens/LocationEditScreen/LocationEditViewModel.swift @@ -16,9 +16,9 @@ final class LocationEditViewModel { var event: VehicleEventDto var date: Date - var onUpdate: (VehicleEventDto) -> Void + var onUpdate: ((VehicleEventDto) -> Void)? - init(event: VehicleEventDto, onUpdate: @escaping (VehicleEventDto) -> Void) { + init(event: VehicleEventDto, onUpdate: ((VehicleEventDto) -> Void)? = nil) { self.event = event self.date = Date(timeIntervalSince1970: event.date) self.onUpdate = onUpdate @@ -26,7 +26,7 @@ final class LocationEditViewModel { func done() { event.date = date.timeIntervalSince1970 - onUpdate(event) + onUpdate?(event) } func onEventUpdated(_ event: VehicleEventDto) { diff --git a/AutoCat/Screens/LocationPickerScreen/LocationPickerScreen.swift b/AutoCat/Screens/LocationPickerScreen/LocationPickerScreen.swift index bb2f587..e08a0fb 100644 --- a/AutoCat/Screens/LocationPickerScreen/LocationPickerScreen.swift +++ b/AutoCat/Screens/LocationPickerScreen/LocationPickerScreen.swift @@ -16,7 +16,7 @@ struct LocationPickerScreen: View { @State var viewModel: LocationPickerViewModel - init(event: VehicleEventDto, onUpdate: @escaping (VehicleEventDto) -> Void) { + init(event: VehicleEventDto, onUpdate: ((VehicleEventDto) -> Void)? = nil) { self.viewModel = LocationPickerViewModel( locationService: ServiceContainer.shared.resolve(LocationServiceProtocol.self), diff --git a/AutoCat/SwiftUI/NumberEditView/NumberEditView.swift b/AutoCat/SwiftUI/NumberEditView/NumberEditView.swift index 9a171a8..7744ee4 100644 --- a/AutoCat/SwiftUI/NumberEditView/NumberEditView.swift +++ b/AutoCat/SwiftUI/NumberEditView/NumberEditView.swift @@ -50,6 +50,7 @@ struct NumberEditView: View { .frame(height: 220) } .padding(16) + .gesture(DragGesture(), including: .gesture) } func buttonPressed(type: PNButtonType) { diff --git a/AutoCat/Utils/ScreenInput.swift b/AutoCat/Utils/ScreenInput.swift new file mode 100644 index 0000000..5eaad4b --- /dev/null +++ b/AutoCat/Utils/ScreenInput.swift @@ -0,0 +1,28 @@ +// +// ScreenInput.swift +// AutoCat +// +// Created by Selim Mustafaev on 06.05.2025. +// Copyright © 2025 Selim Mustafaev. All rights reserved. +// + +import Foundation + +struct ScreenInput { + + var initialValue: T + var onChange: ((T) -> Void)? +} + +extension ScreenInput: Hashable { + + static func == (lhs: ScreenInput, rhs: ScreenInput) -> Bool { + + lhs.initialValue == rhs.initialValue + } + + func hash(into hasher: inout Hasher) { + + hasher.combine(initialValue) + } +}