Update deployment health checks. Fix UI bugs.
This commit is contained in:
@@ -40,9 +40,11 @@ export function useOptimisticVehicles(vehicles: Vehicle[] = []) {
|
||||
};
|
||||
|
||||
// Sync optimistic state with actual vehicles when they change
|
||||
// Guard: Skip if both are empty arrays (prevents infinite loop on reference changes)
|
||||
useEffect(() => {
|
||||
if (vehicles.length === 0 && optimisticVehicles.length === 0) return;
|
||||
setOptimisticVehicles(vehicles);
|
||||
}, [vehicles]);
|
||||
}, [vehicles, optimisticVehicles.length]);
|
||||
|
||||
const optimisticCreateVehicle = async (data: CreateVehicleRequest) => {
|
||||
// Create optimistic vehicle with temporary ID
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* @ai-context Non-blocking updates for better UI responsiveness
|
||||
*/
|
||||
|
||||
import { useTransition, useState, useCallback } from 'react';
|
||||
import { useTransition, useState, useCallback, useEffect } from 'react';
|
||||
import { Vehicle } from '../types/vehicles.types';
|
||||
|
||||
export function useVehicleSearch(vehicles: Vehicle[]) {
|
||||
@@ -42,35 +42,32 @@ export function useVehicleSearch(vehicles: Vehicle[]) {
|
||||
});
|
||||
}, [vehicles]);
|
||||
|
||||
// Update filtered vehicles when vehicles data changes
|
||||
const updateVehicles = useCallback((newVehicles: Vehicle[]) => {
|
||||
startTransition(() => {
|
||||
if (!searchQuery.trim()) {
|
||||
setFilteredVehicles(newVehicles);
|
||||
} else {
|
||||
// Re-apply search filter to new data
|
||||
const filtered = newVehicles.filter(vehicle => {
|
||||
const searchTerm = searchQuery.toLowerCase();
|
||||
return (
|
||||
vehicle.nickname?.toLowerCase().includes(searchTerm) ||
|
||||
vehicle.make?.toLowerCase().includes(searchTerm) ||
|
||||
vehicle.model?.toLowerCase().includes(searchTerm) ||
|
||||
vehicle.vin.toLowerCase().includes(searchTerm) ||
|
||||
vehicle.year?.toString().includes(searchTerm)
|
||||
);
|
||||
});
|
||||
setFilteredVehicles(filtered);
|
||||
}
|
||||
});
|
||||
}, [searchQuery]);
|
||||
// Auto-sync filtered vehicles when source vehicles change
|
||||
// Note: Direct state update (no startTransition) to avoid deferred render cascades
|
||||
useEffect(() => {
|
||||
if (!searchQuery.trim()) {
|
||||
setFilteredVehicles(vehicles);
|
||||
} else {
|
||||
const filtered = vehicles.filter(vehicle => {
|
||||
const searchTerm = searchQuery.toLowerCase();
|
||||
return (
|
||||
vehicle.nickname?.toLowerCase().includes(searchTerm) ||
|
||||
vehicle.make?.toLowerCase().includes(searchTerm) ||
|
||||
vehicle.model?.toLowerCase().includes(searchTerm) ||
|
||||
vehicle.vin.toLowerCase().includes(searchTerm) ||
|
||||
vehicle.year?.toString().includes(searchTerm)
|
||||
);
|
||||
});
|
||||
setFilteredVehicles(filtered);
|
||||
}
|
||||
}, [vehicles, searchQuery]);
|
||||
|
||||
return {
|
||||
searchQuery,
|
||||
filteredVehicles,
|
||||
isPending,
|
||||
handleSearch,
|
||||
clearSearch,
|
||||
updateVehicles
|
||||
clearSearch
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user