Update deployment health checks. Fix UI bugs.

This commit is contained in:
Eric Gullickson
2025-12-20 10:50:44 -06:00
parent 2bd0981490
commit a17944d79f
8 changed files with 193 additions and 117 deletions

View File

@@ -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

View File

@@ -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
};
}