import * as React from "react"; import { useQuery, useMutation, useLazyQuery } from '@apollo/client'; import { GET_USER_VEHICLES, GET_VEHICLE_SEARCH_HISTORY, CREATE_VEHICLE_FROM_VIN, DELETE_USER_VEHICLE, ADD_VEHICLE_FROM_SEARCH, DELETE_SEARCH_HISTORY_ITEM, UserVehicle, VehicleSearchHistory } from '@/lib/graphql/garage'; import { FIND_LAXIMO_VEHICLE_GLOBAL } from '@/lib/graphql'; import { LaximoVehicleSearchResult } from '@/types/laximo'; const ProfileGarageMain = () => { const [searchQuery, setSearchQuery] = React.useState(""); const [vin, setVin] = React.useState(""); const [carComment, setCarComment] = React.useState(""); const [showAddCar, setShowAddCar] = React.useState(false); const [expandedVehicle, setExpandedVehicle] = React.useState(null); const [isAddingVehicle, setIsAddingVehicle] = React.useState(false); // GraphQL queries and mutations const { data: vehiclesData, loading: vehiclesLoading, refetch: refetchVehicles } = useQuery(GET_USER_VEHICLES); const { data: historyData, loading: historyLoading, refetch: refetchHistory } = useQuery(GET_VEHICLE_SEARCH_HISTORY); const [searchVehicleByVin] = useLazyQuery(FIND_LAXIMO_VEHICLE_GLOBAL); const [createVehicleFromVin] = useMutation(CREATE_VEHICLE_FROM_VIN, { onCompleted: () => { refetchVehicles(); setVin(''); setCarComment(''); setShowAddCar(false); setIsAddingVehicle(false); }, onError: (error) => { console.error('Ошибка создания автомобиля:', error); alert('Ошибка при добавлении автомобиля'); setIsAddingVehicle(false); } }); const [deleteVehicle] = useMutation(DELETE_USER_VEHICLE, { onCompleted: () => refetchVehicles(), onError: (error) => { console.error('Ошибка удаления автомобиля:', error); alert('Ошибка при удалении автомобиля'); } }); const [addFromSearch] = useMutation(ADD_VEHICLE_FROM_SEARCH, { onCompleted: () => { refetchVehicles(); refetchHistory(); }, onError: (error) => { console.error('Ошибка добавления из истории:', error); alert('Ошибка при добавлении автомобиля из истории'); } }); const [deleteHistoryItem] = useMutation(DELETE_SEARCH_HISTORY_ITEM, { onCompleted: () => refetchHistory(), onError: (error) => { console.error('Ошибка удаления истории:', error); alert('Ошибка при удалении из истории'); } }); const vehicles: UserVehicle[] = vehiclesData?.userVehicles || []; const searchHistory: VehicleSearchHistory[] = historyData?.vehicleSearchHistory || []; // Фильтрация автомобилей по поисковому запросу const filteredVehicles = vehicles.filter(vehicle => vehicle.name?.toLowerCase().includes(searchQuery.toLowerCase()) || vehicle.vin?.toLowerCase().includes(searchQuery.toLowerCase()) || vehicle.brand?.toLowerCase().includes(searchQuery.toLowerCase()) || vehicle.model?.toLowerCase().includes(searchQuery.toLowerCase()) ); const handleSaveVehicle = async () => { if (!vin.trim()) { alert('Введите VIN номер'); return; } setIsAddingVehicle(true); try { await createVehicleFromVin({ variables: { vin: vin.trim().toUpperCase(), comment: carComment.trim() || null } }); } catch (error) { console.error('Ошибка сохранения автомобиля:', error); } }; const handleDeleteVehicle = async (vehicleId: string) => { if (confirm('Вы уверены, что хотите удалить этот автомобиль?')) { try { await deleteVehicle({ variables: { id: vehicleId } }); } catch (error) { console.error('Ошибка удаления автомобиля:', error); } } }; const handleAddFromHistory = async (historyItem: VehicleSearchHistory) => { try { await addFromSearch({ variables: { vin: historyItem.vin, comment: '' } }); } catch (error) { console.error('Ошибка добавления из истории:', error); } }; const handleDeleteFromHistory = async (historyId: string) => { try { await deleteHistoryItem({ variables: { id: historyId } }); } catch (error) { console.error('Ошибка удаления истории:', error); } }; const handleFindParts = (vehicle: UserVehicle) => { // Переход к поиску запчастей для автомобиля if (vehicle.vin) { window.location.href = `/vehicle-search-results?q=${encodeURIComponent(vehicle.vin)}`; } }; const toggleVehicleExpanded = (vehicleId: string) => { setExpandedVehicle(expandedVehicle === vehicleId ? null : vehicleId); }; return (
setSearchQuery(e.target.value)} />
Мои автомобили
{vehiclesLoading && (
)} {!vehiclesLoading && filteredVehicles.length === 0 && !showAddCar && (
{vehicles.length === 0 ? 'У вас пока нет автомобилей в гараже' : 'Автомобили не найдены'}
)} {!vehiclesLoading && filteredVehicles.map((vehicle) => (
{vehicle.name || `${vehicle.brand || ''} ${vehicle.model || ''}`.trim() || 'Неизвестный автомобиль'}
{vehicle.vin || 'VIN не указан'}
{vehicle.comment || 'Комментарий не добавлен'}
handleFindParts(vehicle)} > Найти запчасть
{/* Расширенная информация об автомобиле — вложена внутрь карточки */}
{vehicle.brand && (
Бренд
{vehicle.brand}
)} {vehicle.model && (
Модель
{vehicle.model}
)} {vehicle.modification && (
Модификация
{vehicle.modification}
)} {vehicle.year && (
Год
{vehicle.year}
)} {vehicle.frame && (
Номер кузова
{vehicle.frame}
)} {vehicle.licensePlate && (
Госномер
{vehicle.licensePlate}
)} {vehicle.mileage && (
Пробег
{vehicle.mileage.toLocaleString()} км
)}
Добавлен
{new Date(vehicle.createdAt).toLocaleDateString('ru-RU')}
))} {!showAddCar && (
setShowAddCar(true)} > Добавить авто
)} {showAddCar && ( <>
Добавить авто в гараж
VIN
setVin(e.target.value)} />
Комментарий
setCarComment(e.target.value)} />
{isAddingVehicle ? 'Сохранение...' : 'Сохранить'}
{ setShowAddCar(false); setVin(''); setCarComment(''); }} > Отменить
)}
Ранее вы искали
{historyLoading && (
)} {!historyLoading && searchHistory.length === 0 && (
История поиска пуста
)} {!historyLoading && searchHistory.length > 0 && (
{searchHistory.map((historyItem) => (
{historyItem.brand && historyItem.model ? `${historyItem.brand} ${historyItem.model}` : 'Автомобиль найден'}
{historyItem.vin}
{new Date(historyItem.searchDate).toLocaleDateString('ru-RU')}
))}
)}
); } export default ProfileGarageMain;