add average mpg to fuel log list

This commit is contained in:
Kameron Kenny 2025-03-19 12:53:41 -04:00
parent 75af0a4ebf
commit 16d65536d0
1 changed files with 42 additions and 1 deletions

View File

@ -20,7 +20,7 @@ struct FuelLogListView: View {
@State private var selectedVehicleID: UUID? = nil
@State private var showAddVehicleSheet = false
// For tracking the previous odometer reading
// For tracking the previous odometer reading (used for validation)
@State private var previousOdometer: Double? = nil
@State private var showOdometerAlert = false
@State private var isUpdatingCalculation = false
@ -44,9 +44,32 @@ struct FuelLogListView: View {
}
}
// Computed property to calculate average MPG for full-tank logs.
// MPG for an individual log is computed as:
// (current.odometer - next.odometer) / current.fuelVolume
private var averageMPG: Double? {
let logs = filteredFuelLogs
guard logs.count > 1 else { return nil }
var mpgValues: [Double] = []
// Iterate over logs except the oldest.
for i in 0..<logs.count - 1 {
let current = logs[i]
let next = logs[i + 1]
// Only include if fullTank is true, fuelVolume is positive, and odometer difference is positive.
if current.fullTank, current.fuelVolume > 0, current.odometer > next.odometer {
let mpg = (current.odometer - next.odometer) / current.fuelVolume
mpgValues.append(mpg)
}
}
guard !mpgValues.isEmpty else { return nil }
let total = mpgValues.reduce(0, +)
return total / Double(mpgValues.count)
}
var body: some View {
NavigationView {
if vehicles.isEmpty {
// Empty state: no vehicles exist.
VStack(spacing: 20) {
Text("No vehicles found.")
.font(.headline)
@ -67,6 +90,7 @@ struct FuelLogListView: View {
}
} else {
List {
// Vehicle Picker Section
Section {
Picker("Vehicle", selection: $selectedVehicleID) {
ForEach(vehicles, id: \.id) { vehicle in
@ -77,6 +101,22 @@ struct FuelLogListView: View {
.pickerStyle(MenuPickerStyle())
}
// Average MPG Section
Section {
HStack {
Text("Average MPG:")
Spacer()
if let avg = averageMPG {
Text("\(avg, specifier: "%.1f")")
.bold()
} else {
Text("N/A")
.foregroundColor(.secondary)
}
}
}
// Fuel Logs Section (filtered by selected vehicle)
ForEach(filteredFuelLogs.indices, id: \.self) { index in
let log = filteredFuelLogs[index]
let distance: Double? = {
@ -131,6 +171,7 @@ struct FuelLogListView: View {
}
}
// Set default vehicle selection on appear.
private func setDefaultVehicle() {
if selectedVehicleID == nil {
if let lastFuelLog = fuelLogs.first, let vehicle = lastFuelLog.vehicle {