/** * @ai-summary Mobile vehicle detail screen with Material Design 3 */ import React, { useMemo, useState } from 'react'; import { Box, Typography, Button, Card, CardContent, Divider, FormControl, InputLabel, Select, MenuItem, List, ListItem, ListItemText } from '@mui/material'; import { useQueryClient } from '@tanstack/react-query'; import { Vehicle } from '../types/vehicles.types'; import { useFuelLogs } from '../../fuel-logs/hooks/useFuelLogs'; import { FuelLogResponse, UpdateFuelLogRequest } from '../../fuel-logs/types/fuel-logs.types'; import { FuelLogEditDialog } from '../../fuel-logs/components/FuelLogEditDialog'; import { fuelLogsApi } from '../../fuel-logs/api/fuel-logs.api'; // Theme colors now defined in Tailwind config interface VehicleDetailMobileProps { vehicle: Vehicle; onBack: () => void; onLogFuel?: () => void; } const Section: React.FC<{ title: string; children: React.ReactNode }> = ({ title, children }) => ( {title} {children} ); const CarThumb: React.FC<{ color?: string }> = ({ color = "#F2EAEA" }) => ( ); export const VehicleDetailMobile: React.FC = ({ vehicle, onBack, onLogFuel }) => { const displayName = vehicle.nickname || [vehicle.year, vehicle.make, vehicle.model, vehicle.trimLevel].filter(Boolean).join(' ') || 'Vehicle'; const displayModel = vehicle.model || 'Unknown Model'; const [recordFilter, setRecordFilter] = useState<'All' | 'Fuel Logs' | 'Maintenance' | 'Documents'>('All'); const { fuelLogs, isLoading: isFuelLoading } = useFuelLogs(vehicle.id); const queryClient = useQueryClient(); const [editingLog, setEditingLog] = useState(null); type VehicleRecord = { id: string; type: 'Fuel Logs' | 'Maintenance' | 'Documents'; date: string; // ISO summary: string; amount?: string; }; const records: VehicleRecord[] = useMemo(() => { const list: VehicleRecord[] = []; if (fuelLogs && Array.isArray(fuelLogs)) { for (const log of fuelLogs as FuelLogResponse[]) { const parts: string[] = []; if (log.fuelUnits) parts.push(`${Number(log.fuelUnits).toFixed(3)} units`); if (log.fuelType) parts.push(`${log.fuelType}${log.fuelGrade ? ' ' + log.fuelGrade : ''}`); if (log.efficiencyLabel) parts.push(log.efficiencyLabel); const summary = parts.join(' • '); const amount = (typeof log.totalCost === 'number') ? `$${log.totalCost.toFixed(2)}` : undefined; list.push({ id: log.id, type: 'Fuel Logs', date: log.dateTime, summary, amount }); } } return list.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()); }, [fuelLogs]); const filteredRecords = useMemo(() => { if (recordFilter === 'All') return records; return records.filter(r => r.type === recordFilter); }, [records, recordFilter]); const openEditLog = (recId: string, type: VehicleRecord['type']) => { if (type === 'Fuel Logs') { const log = (fuelLogs as FuelLogResponse[] | undefined)?.find(l => l.id === recId) || null; setEditingLog(log); } }; const handleCloseEdit = () => setEditingLog(null); const handleSaveEdit = async (id: string, data: UpdateFuelLogRequest) => { await fuelLogsApi.update(id, data); await queryClient.invalidateQueries({ queryKey: ['fuelLogs', vehicle.id] }); await queryClient.invalidateQueries({ queryKey: ['fuelLogs'] }); setEditingLog(null); }; return ( {displayName} {displayName} {displayModel} {vehicle.licensePlate && ( {vehicle.licensePlate} )}
{vehicle.vin && ( VIN {vehicle.vin} )} {vehicle.year && ( Year {vehicle.year} )} {vehicle.make && ( Make {vehicle.make} )} {vehicle.model && ( Model {vehicle.model} )} Odometer {vehicle.odometerReading.toLocaleString()} mi
{isFuelLoading ? 'Loading…' : `${filteredRecords.length} record${filteredRecords.length === 1 ? '' : 's'}`} Filter {isFuelLoading ? ( Loading records… ) : filteredRecords.length === 0 ? ( No records found for this filter. ) : ( {filteredRecords.map(rec => ( openEditLog(rec.id, rec.type)}> {rec.amount || '—'} ))} )}
{/* Edit Dialog for Fuel Logs */}
); };