/** * @ai-summary Mobile vehicles screen with React 19 enhancements * @ai-context Enhanced with Suspense, optimistic updates, and transitions */ import React, { useTransition, useMemo } from 'react'; import { Box, Typography, Grid, Button } from '@mui/material'; import AddIcon from '@mui/icons-material/Add'; import LockIcon from '@mui/icons-material/Lock'; import { useVehicles } from '../hooks/useVehicles'; import { useOptimisticVehicles } from '../hooks/useOptimisticVehicles'; import { useVehicleSearch } from '../hooks/useVehicleTransitions'; import { useVehicleLimitCheck } from '../hooks/useVehicleLimitCheck'; import { MobileVehiclesSuspense } from '../../../components/SuspenseWrappers'; import { VehicleLimitDialog } from '../../../shared-minimal/components'; import { VehicleMobileCard } from './VehicleMobileCard'; import { Vehicle } from '../types/vehicles.types'; interface VehiclesMobileScreenProps { onVehicleSelect?: (vehicle: Vehicle) => void; onAddVehicle?: () => void; } const Section: React.FC<{ title: string; children: React.ReactNode; right?: React.ReactNode }> = ({ title, children, right }) => ( {title} {right} {children} ); export const VehiclesMobileScreen: React.FC = ({ onVehicleSelect, onAddVehicle }) => { const { data: vehicles, isLoading } = useVehicles(); const [_isPending, startTransition] = useTransition(); // Stable reference for empty array (prevents infinite loop when vehicles is undefined) const safeVehicles = useMemo( () => (Array.isArray(vehicles) ? vehicles : []), [vehicles] ); // React 19 optimistic updates const { optimisticVehicles, isPending: isOptimisticPending } = useOptimisticVehicles(safeVehicles); // Enhanced search with transitions (auto-syncs when vehicles change) const { filteredVehicles } = useVehicleSearch(optimisticVehicles); // Vehicle limit check const { isAtLimit, limit, tier, showLimitDialog, setShowLimitDialog, } = useVehicleLimitCheck(safeVehicles.length); const handleVehicleSelect = (vehicle: Vehicle) => { // Use transition to avoid blocking UI during navigation startTransition(() => { onVehicleSelect?.(vehicle); }); }; const handleAddVehicleClick = () => { if (isAtLimit) { setShowLimitDialog(true); } else { onAddVehicle?.(); } }; if (isLoading) { return ( Loading your vehicles... Please wait a moment ); } if (!optimisticVehicles.length) { return (
No vehicles added yet Add your first vehicle to get started
); } return (
{filteredVehicles.map((vehicle) => ( handleVehicleSelect(vehicle)} /> ))}
{/* Vehicle Limit Dialog */} setShowLimitDialog(false)} currentCount={safeVehicles.length} limit={limit ?? 0} currentTier={tier} />
); };