Skip to content

Commit

Permalink
Merge pull request #271 from mikaelacaron/211-update-odometer-reading
Browse files Browse the repository at this point in the history
Update Odometer Reading
  • Loading branch information
mikaelacaron authored Nov 25, 2023
2 parents 1ebd13e + 4dca743 commit 3096326
Show file tree
Hide file tree
Showing 5 changed files with 161 additions and 0 deletions.
4 changes: 4 additions & 0 deletions Basic-Car-Maintenance.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
FF4E82BE2AD39863004949AF /* FirebaseRemoteConfig in Frameworks */ = {isa = PBXBuildFile; productRef = FF4E82BD2AD39863004949AF /* FirebaseRemoteConfig */; };
FF4E82C02AD39863004949AF /* FirebaseRemoteConfigSwift in Frameworks */ = {isa = PBXBuildFile; productRef = FF4E82BF2AD39863004949AF /* FirebaseRemoteConfigSwift */; };
FF4E82C22AD39863004949AF /* FirebaseStorage in Frameworks */ = {isa = PBXBuildFile; productRef = FF4E82C12AD39863004949AF /* FirebaseStorage */; };
FF50DDFB2B12944900E87362 /* EditOdometerReadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF50DDFA2B12944900E87362 /* EditOdometerReadingView.swift */; };
FF5D13A72A86C2D600BC9BD6 /* BasicCarMaintenanceApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF5D13A62A86C2D600BC9BD6 /* BasicCarMaintenanceApp.swift */; };
FF5D13AB2A86C2D800BC9BD6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FF5D13AA2A86C2D800BC9BD6 /* Assets.xcassets */; };
FF5D13AF2A86C2D800BC9BD6 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FF5D13AE2A86C2D800BC9BD6 /* Preview Assets.xcassets */; };
Expand Down Expand Up @@ -132,6 +133,7 @@
FF09FC902AB6FF44006BE61A /* AuthenticationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationView.swift; sourceTree = "<group>"; };
FF218EF52B00865F0025A533 /* AnalyticsService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsService.swift; sourceTree = "<group>"; };
FF3DDF512AA4D28F009D91C4 /* DashboardViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashboardViewModel.swift; sourceTree = "<group>"; };
FF50DDFA2B12944900E87362 /* EditOdometerReadingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditOdometerReadingView.swift; sourceTree = "<group>"; };
FF5D13A32A86C2D600BC9BD6 /* Basic-Car-Maintenance.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Basic-Car-Maintenance.app"; sourceTree = BUILT_PRODUCTS_DIR; };
FF5D13A62A86C2D600BC9BD6 /* BasicCarMaintenanceApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasicCarMaintenanceApp.swift; sourceTree = "<group>"; };
FF5D13AA2A86C2D800BC9BD6 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
Expand Down Expand Up @@ -223,6 +225,7 @@
children = (
FFE0AF552AD66C3500AB46F8 /* OdometerView.swift */,
57CDD99F2ADC31A8002EFED0 /* AddOdometerReadingView.swift */,
FF50DDFA2B12944900E87362 /* EditOdometerReadingView.swift */,
);
path = Views;
sourceTree = "<group>";
Expand Down Expand Up @@ -723,6 +726,7 @@
E58499682ACDDA9A00634660 /* ContributorsProfileView.swift in Sources */,
FF755B492A909A0000F49A13 /* AddMaintenanceView.swift in Sources */,
FF09FC912AB6FF44006BE61A /* AuthenticationView.swift in Sources */,
FF50DDFB2B12944900E87362 /* EditOdometerReadingView.swift in Sources */,
023057F22ACFAD79006C5A73 /* EditEventDetailView.swift in Sources */,
637505482AEFFBAC00AA5D0B /* FirebaseAnalytics+Extension.swift in Sources */,
8A3D74862AD6D9A10000FEEB /* AlertView.swift in Sources */,
Expand Down
4 changes: 4 additions & 0 deletions Basic-Car-Maintenance/Shared/Localizable.xcstrings
Original file line number Diff line number Diff line change
Expand Up @@ -1588,6 +1588,9 @@
}
}
},
"Edit Reading" : {
"comment" : "Title for form when editing an odometer reading"
},
"Failed To Add Vehicle" : {
"localizations" : {
"be" : {
Expand Down Expand Up @@ -4280,6 +4283,7 @@
}
},
"Update" : {
"comment" : "Label for submit button on form to update an existing entry",
"localizations" : {
"be" : {
"stringUnit" : {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@ class OdometerViewModel {
var showAddErrorAlert = false
var isShowingAddOdometerReading = false
var errorMessage: String = ""

var showEditErrorAlert = false
var selectedReading: OdometerReading?
var isShowingEditReadingView = false

var vehicles = [Vehicle]()

init(userUID: String?) {
Expand Down Expand Up @@ -77,6 +82,28 @@ class OdometerViewModel {
}
}

func updateOdometerReading(_ reading: OdometerReading) {

if let userUID = userUID {
guard let id = reading.id else { return }

var readingToUpdate = reading
readingToUpdate.userID = userUID

do {
try Firestore.firestore()
.collection(FirestorePath.odometerReadings(vehicleID: readingToUpdate.vehicleID).path)
.document(id)
.setData(from: readingToUpdate)

isShowingEditReadingView = false
} catch {
errorMessage = error.localizedDescription
showEditErrorAlert = true
}
}
}

func getVehicles() async {
if let uid = userUID {
let db = Firestore.firestore()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
//
// EditOdometerReadingView.swift
// Basic-Car-Maintenance
//
// Created by Mikaela Caron on 11/25/23.
//

import SwiftUI

struct EditOdometerReadingView: View {
let selectedReading: OdometerReading

let vehicles: [Vehicle]
let updateTapped: (OdometerReading) -> Void

@State private var date = Date()
@State private var isMetric = false
@State private var distance = 0

@Environment(\.dismiss) private var dismiss

var body: some View {
NavigationStack {
Form {
Section {
HStack {
TextField("Distance", value: $distance, format: .number)

Picker(selection: $isMetric) {
Text("Miles").tag(false)
Text("Kilometers").tag(true)
} label: {
Text("Preferred units",
comment: "Label for units selected when adding an odometer reading")
}
.pickerStyle(.segmented)
}
}

Section {
if let vehicleName = vehicles
.filter({ $0.id == selectedReading.vehicleID }).first?.name {
Text(vehicleName)
.opacity(0.3)
}
} header: {
Text("Vehicle")
}

DatePicker(selection: $date, displayedComponents: .date) {
Text("Date", comment: "Date picker label")
}
.dynamicTypeSize(...DynamicTypeSize.accessibility2)
}
.onAppear {
setEditReadingValues(selectedReading)
}
.navigationTitle(Text("Edit Reading",
comment: "Title for form when editing an odometer reading"))
.toolbar {
ToolbarItem(placement: .topBarLeading) {
Button {
dismiss()
} label: {
Text("Cancel")
}
}

ToolbarItem {
Button {
let reading = OdometerReading(id: selectedReading.id,
date: date,
distance: distance,
isMetric: isMetric,
vehicleID: selectedReading.vehicleID)
updateTapped(reading)
} label: {
Text("Update",
comment: "Label for submit button on form to update an existing entry")
}
.disabled(distance < 0)
}
}
}
.analyticsView("\(Self.self)")
}

func setEditReadingValues(_ reading: OdometerReading) {
self.date = reading.date
self.isMetric = reading.isMetric
self.distance = reading.distance
}
}

#Preview {
EditOdometerReadingView(
selectedReading: OdometerReading(date: Date(),
distance: 0,
isMetric: false,
vehicleID: ""),
vehicles: []) { _ in }
}
24 changes: 24 additions & 0 deletions Basic-Car-Maintenance/Shared/Odometer/Views/OdometerView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,17 @@ struct OdometerView: View {
} label: {
Image(systemName: SFSymbol.trash)
}

Button {
viewModel.selectedReading = reading
viewModel.isShowingEditReadingView = true
} label: {
Label {
Text("Edit")
} icon: {
Image(systemName: SFSymbol.pencil)
}
}
}
}
.listStyle(.inset)
Expand Down Expand Up @@ -68,6 +79,19 @@ struct OdometerView: View {
await viewModel.getOdometerReadings()
await viewModel.getVehicles()
}
.sheet(isPresented: $viewModel.isShowingEditReadingView) {
if let selectedReading = viewModel.selectedReading {
EditOdometerReadingView(selectedReading: selectedReading, vehicles: viewModel.vehicles) { updatedReading in

Check warning on line 84 in Basic-Car-Maintenance/Shared/Odometer/Views/OdometerView.swift

View workflow job for this annotation

GitHub Actions / SwiftLint

Line should be 110 characters or less; currently it has 127 characters (line_length)
viewModel.updateOdometerReading(updatedReading)
}
.alert("An Error Occurred", isPresented: $viewModel.showEditErrorAlert) {
Button("OK", role: .cancel) { }
} message: {
Text(viewModel.errorMessage)
}
}
}

}
.analyticsView("\(Self.self)")
}
Expand Down

0 comments on commit 3096326

Please sign in to comment.