diff --git a/Basic-Car-Maintenance/Shared/Localizable.xcstrings b/Basic-Car-Maintenance/Shared/Localizable.xcstrings index af06cb38..e3e0fac3 100644 --- a/Basic-Car-Maintenance/Shared/Localizable.xcstrings +++ b/Basic-Car-Maintenance/Shared/Localizable.xcstrings @@ -5528,6 +5528,9 @@ } } }, + "Vehicle Details" : { + "comment" : "Label about vehicle details." + }, "Vehicle License Plate Number" : { "localizations" : { "be" : { diff --git a/Basic-Car-Maintenance/Shared/Settings/Views/EditVehicleView.swift b/Basic-Car-Maintenance/Shared/Settings/Views/EditVehicleView.swift index a148bcd8..77b9d77b 100644 --- a/Basic-Car-Maintenance/Shared/Settings/Views/EditVehicleView.swift +++ b/Basic-Car-Maintenance/Shared/Settings/Views/EditVehicleView.swift @@ -12,6 +12,9 @@ struct EditVehicleView: View, Observable { @Binding var selectedVehicle: Vehicle? var viewModel: SettingsViewModel + /// closure to update the values passed in, and set them to all the state properties + var onVehicleUpdated: ((Vehicle) -> Void)? + @Environment(\.dismiss) var dismiss @State private var name = "" @@ -98,6 +101,9 @@ struct EditVehicleView: View, Observable { vehicle.id = selectedVehicle.id Task { await viewModel.updateVehicle(vehicle) + if let onVehicleUpdated { + onVehicleUpdated(vehicle) + } dismiss() } } diff --git a/Basic-Car-Maintenance/Shared/Settings/Views/SettingsView.swift b/Basic-Car-Maintenance/Shared/Settings/Views/SettingsView.swift index 62ac158d..2dc1db0c 100644 --- a/Basic-Car-Maintenance/Shared/Settings/Views/SettingsView.swift +++ b/Basic-Car-Maintenance/Shared/Settings/Views/SettingsView.swift @@ -28,6 +28,8 @@ struct SettingsView: View { @State private var selectedVehicle: Vehicle? @State private var isShowingEditVehicleView = false + @State private var isShowingVehicleDetailView = false + private let appVersion = "Version \(Bundle.main.versionNumber) (\(Bundle.main.buildNumber))" init(authenticationViewModel: AuthenticationViewModel) { @@ -90,39 +92,45 @@ struct SettingsView: View { Section { ForEach(viewModel.vehicles) { vehicle in - VStack(alignment: .leading, spacing: 2) { - Text("\(vehicle.name)") - .fontWeight(.bold) - .font(.headline) - - Group { - HStack { - if let year = vehicle.year, !year.isEmpty { - Text(year) + Button { + selectedVehicle = vehicle + isShowingVehicleDetailView = true + } label: { + VStack(alignment: .leading, spacing: 2) { + Text("\(vehicle.name)") + .fontWeight(.bold) + .font(.headline) + + Group { + HStack { + if let year = vehicle.year, !year.isEmpty { + Text(year) + } + + Text(vehicle.make) + + Text(vehicle.model) } - Text(vehicle.make) + if let licensePlateNumber = + vehicle.licensePlateNumber, + !licensePlateNumber.isEmpty { + Text("Plate: \(licensePlateNumber)") + } - Text(vehicle.model) - } - - if let licensePlateNumber = - vehicle.licensePlateNumber, - !licensePlateNumber.isEmpty { - Text("Plate: \(licensePlateNumber)") - } - - if let vin = vehicle.vin, !vin.isEmpty { - Text("VIN: \(vin)") + if let vin = vehicle.vin, !vin.isEmpty { + Text("VIN: \(vin)") + } + + if let color = vehicle.color, !color.isEmpty { + Text("Color: \(color)") + } } - - if let color = vehicle.color, !color.isEmpty { - Text("Color: \(color)") - } + .font(.callout) + .foregroundStyle(.secondary) } - .font(.callout) - .foregroundStyle(.secondary) } + .buttonStyle(.plain) .swipeActions { Button(role: .destructive) { Task { @@ -232,6 +240,9 @@ struct SettingsView: View { } } } + .navigationDestination(isPresented: $isShowingVehicleDetailView) { + VehicleDetailView(selectedVehicle: $selectedVehicle, viewModel: viewModel) + } .sheet(isPresented: $isShowingEditVehicleView) { EditVehicleView(selectedVehicle: $selectedVehicle, viewModel: viewModel) } diff --git a/Basic-Car-Maintenance/Shared/Settings/Views/VehicleDetailView.swift b/Basic-Car-Maintenance/Shared/Settings/Views/VehicleDetailView.swift new file mode 100644 index 00000000..a0cc1f7c --- /dev/null +++ b/Basic-Car-Maintenance/Shared/Settings/Views/VehicleDetailView.swift @@ -0,0 +1,121 @@ +// +// VehicleDetailView.swift +// Basic-Car-Maintenance +// +// https://github.com/mikaelacaron/Basic-Car-Maintenance +// See LICENSE for license information. +// + +import SwiftUI + +struct VehicleDetailView: View { + + @Binding var selectedVehicle: Vehicle? + var viewModel: SettingsViewModel + + @State private var name = "" + @State private var make = "" + @State private var model = "" + @State private var year = "" + @State private var color = "" + @State private var VIN = "" + @State private var licensePlateNumber = "" + + @State private var isShowingEditVehicleView = false + + var body: some View { + NavigationStack { + Form { + Section { + Text(name) + } header: { + Text("Name") + } + + Section { + Text(make) + } header: { + Text("Make") + } + + Section { + Text(model) + } header: { + Text("Model") + } + + Section { + Text(year) + } header: { + Text("Year") + } + + Section { + Text(color) + } header: { + Text("Color") + } + + Section { + Text(VIN) + } header: { + Text("VIN") + } + + Section { + Text(licensePlateNumber) + } header: { + Text("License Plate Number") + } + } + .analyticsView("\(Self.self)") + .onAppear { + guard let selectedVehicle else { return } + setVehicleValues(selectedVehicle) + } + .toolbar { + ToolbarItem { + Button { + isShowingEditVehicleView.toggle() + } label: { + Text("Edit") + } + } + } + .navigationTitle(Text("Vehicle Details", comment: "Label about vehicle details.")) + .sheet(isPresented: $isShowingEditVehicleView) { + EditVehicleView( + selectedVehicle: $selectedVehicle, + viewModel: viewModel, + onVehicleUpdated: setVehicleValues + ) + } + } + } + + private func setVehicleValues(_ vehicle: Vehicle) { + self.name = vehicle.name + self.make = vehicle.make + self.model = vehicle.model + self.year = vehicle.year ?? "" + self.color = vehicle.color ?? "" + self.VIN = vehicle.vin ?? "" + self.licensePlateNumber = vehicle.licensePlateNumber ?? "" + } +} + +#Preview { + @Previewable @State var selectedVehicle: Vehicle? = Vehicle( + id: UUID().uuidString, + name: "My Car", + make: "Ford", + model: "F-150", + year: "2020", + color: "Red", + vin: "5YJSA1E26JF123456", + licensePlateNumber: "ABC123" + ) + var viewModel = SettingsViewModel(authenticationViewModel: AuthenticationViewModel()) + + VehicleDetailView(selectedVehicle: $selectedVehicle, viewModel: viewModel) +}