Удален файл интеграции с Parts Index API и обновлены компоненты для работы с корзиной и избранным. Добавлены функции для обработки добавления товаров в корзину с уведомлениями, улучшена логика работы с избранным, а также добавлены фильтры для истории поиска по производителю.

This commit is contained in:
Bivekich
2025-06-29 03:36:21 +03:00
parent d268bb3359
commit 7f91da525f
23 changed files with 685 additions and 780 deletions

View File

@ -1,6 +1,7 @@
import React, { useState } from "react";
import { useCart } from "@/contexts/CartContext";
import { useFavorites } from "@/contexts/FavoritesContext";
import toast from "react-hot-toast";
const INITIAL_OFFERS_LIMIT = 5;
@ -46,7 +47,7 @@ const CoreProductCard: React.FC<CoreProductCardProps> = ({
partsIndexPowered = false
}) => {
const { addItem } = useCart();
const { addToFavorites, removeFromFavorites, isFavorite } = useFavorites();
const { addToFavorites, removeFromFavorites, isFavorite, favorites } = useFavorites();
const [visibleOffersCount, setVisibleOffersCount] = useState(INITIAL_OFFERS_LIMIT);
const [quantities, setQuantities] = useState<{ [key: number]: number }>(
offers.reduce((acc, _, index) => ({ ...acc, [index]: 1 }), {})
@ -88,7 +89,7 @@ const CoreProductCard: React.FC<CoreProductCardProps> = ({
let num = parseInt(value, 10);
if (isNaN(num) || num < 1) num = 1;
if (num > availableStock) {
window.alert(`Максимум ${availableStock} шт.`);
toast.error(`Максимум ${availableStock} шт.`);
return;
}
setQuantities(prev => ({ ...prev, [index]: num }));
@ -100,7 +101,7 @@ const CoreProductCard: React.FC<CoreProductCardProps> = ({
// Проверяем наличие
if (quantity > availableStock) {
alert(`Недостаточно товара в наличии. Доступно: ${availableStock} шт.`);
toast.error(`Недостаточно товара в наличии. Доступно: ${availableStock} шт.`);
return;
}
@ -123,8 +124,17 @@ const CoreProductCard: React.FC<CoreProductCardProps> = ({
image: image,
});
// Показываем уведомление о добавлении
alert(`Товар "${brand} ${article}" добавлен в корзину (${quantity} шт.)`);
// Показываем тоастер вместо alert
toast.success(
<div>
<div className="font-semibold">Товар добавлен в корзину!</div>
<div className="text-sm text-gray-600">{`${brand} ${article} (${quantity} шт.)`}</div>
</div>,
{
duration: 3000,
icon: '🛒',
}
);
};
// Обработчик клика по сердечку
@ -133,9 +143,18 @@ const CoreProductCard: React.FC<CoreProductCardProps> = ({
e.stopPropagation();
if (isItemFavorite) {
// Создаем ID для удаления
const id = `${offers[0]?.productId || offers[0]?.offerKey || ''}:${article}:${brand}`;
removeFromFavorites(id);
// Находим товар в избранном и удаляем по правильному ID
const favoriteItem = favorites.find((item: any) => {
// Проверяем по разным комбинациям идентификаторов
if (offers[0]?.productId && item.productId === offers[0].productId) return true;
if (offers[0]?.offerKey && item.offerKey === offers[0].offerKey) return true;
if (item.article === article && item.brand === brand) return true;
return false;
});
if (favoriteItem) {
removeFromFavorites(favoriteItem.id);
}
} else {
// Добавляем в избранное
const bestOffer = offers[0]; // Берем первое предложение как лучшее