/**
* @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}
/>
))}
)}
);
};