/** * @ai-summary Main vehicles page with React 19 advanced features * @ai-context Enhanced with Suspense, useOptimistic, and useTransition */ import React, { useState, useEffect, useTransition } from 'react'; import { Box, Typography, Grid, Button as MuiButton, TextField, IconButton } from '@mui/material'; import AddIcon from '@mui/icons-material/Add'; import SearchIcon from '@mui/icons-material/Search'; import ClearIcon from '@mui/icons-material/Clear'; import { useVehicles } from '../hooks/useVehicles'; import { useOptimisticVehicles } from '../hooks/useOptimisticVehicles'; import { useVehicleSearch } from '../hooks/useVehicleTransitions'; import { VehicleCard } from '../components/VehicleCard'; import { VehicleForm } from '../components/VehicleForm'; import { Card } from '../../../shared-minimal/components/Card'; import { VehicleListSuspense, FormSuspense } from '../../../components/SuspenseWrappers'; import { useAppStore } from '../../../core/store'; import { useNavigate } from 'react-router-dom'; export const VehiclesPage: React.FC = () => { const navigate = useNavigate(); const { data: vehicles, isLoading } = useVehicles(); const setSelectedVehicle = useAppStore(state => state.setSelectedVehicle); // React 19 optimistic updates and transitions const { optimisticVehicles, isPending: isOptimisticPending, optimisticCreateVehicle, optimisticDeleteVehicle } = useOptimisticVehicles(vehicles || []); const { searchQuery, filteredVehicles, isPending: isSearchPending, handleSearch, clearSearch, updateVehicles } = useVehicleSearch(optimisticVehicles); const [isPending, startTransition] = useTransition(); const [showForm, setShowForm] = useState(false); // Update search vehicles when optimistic vehicles change useEffect(() => { updateVehicles(optimisticVehicles); }, [optimisticVehicles, updateVehicles]); const handleSelectVehicle = (id: string) => { // Use transition for navigation to avoid blocking UI startTransition(() => { setSelectedVehicle(id); navigate(`/vehicles/${id}`); }); }; const handleDelete = async (id: string) => { if (confirm('Are you sure you want to delete this vehicle?')) { await optimisticDeleteVehicle(id); } }; const handleCreateVehicle = async (data: any) => { await optimisticCreateVehicle(data); // Use transition for UI state change startTransition(() => { setShowForm(false); }); }; if (isLoading) { return ( Loading vehicles... ); } return ( My Vehicles {!showForm && ( } onClick={() => startTransition(() => setShowForm(true))} sx={{ borderRadius: '999px' }} disabled={isPending || isOptimisticPending} > Add Vehicle )} {/* Search functionality */} {vehicles && vehicles.length > 0 && ( handleSearch(e.target.value)} InputProps={{ startAdornment: , endAdornment: searchQuery && ( ), }} sx={{ '& .MuiOutlinedInput-root': { borderRadius: '999px', backgroundColor: isSearchPending ? 'action.hover' : 'background.paper' } }} /> {searchQuery && ( {isSearchPending ? 'Searching...' : `Found ${filteredVehicles.length} vehicle(s)`} )} )} {showForm && ( Add New Vehicle startTransition(() => setShowForm(false))} loading={isOptimisticPending} /> )} {optimisticVehicles.length === 0 ? ( No vehicles added yet {!showForm && ( } onClick={() => startTransition(() => setShowForm(true))} sx={{ borderRadius: '999px' }} disabled={isPending || isOptimisticPending} > Add Your First Vehicle )} ) : ( {filteredVehicles.map((vehicle) => ( console.log('Edit', v)} onDelete={handleDelete} onSelect={handleSelectVehicle} /> ))} )} ); };