import React, { useState } from "react"; import { useRouter } from "next/router"; import Filters, { FilterConfig } from "./Filters"; import { useFavorites } from "@/contexts/FavoritesContext"; interface FavoriteListProps { filters: FilterConfig[]; filterValues?: {[key: string]: any}; onFilterChange?: (type: string, value: any) => void; searchQuery?: string; onSearchChange?: (value: string) => void; sortBy?: 'name' | 'brand' | 'date'; sortOrder?: 'asc' | 'desc'; onSortChange?: (sortBy: 'name' | 'brand' | 'date') => void; onSortOrderChange?: (sortOrder: 'asc' | 'desc') => void; } const FavoriteList: React.FC = ({ filters, filterValues = {}, onFilterChange, searchQuery = '', onSearchChange, sortBy = 'date', sortOrder = 'desc', onSortChange, onSortOrderChange }) => { const router = useRouter(); const { favorites, removeFromFavorites, clearFavorites } = useFavorites(); const handleRemove = (id: string) => { removeFromFavorites(id); }; const handleRemoveAll = () => { clearFavorites(); }; // Функция для поиска товара const handleSearchItem = (item: any) => { // Формируем поисковый запрос из бренда и артикула const searchQuery = `${item.brand} ${item.article}`; // Переходим на страницу поиска с результатами router.push(`/search-result?article=${encodeURIComponent(item.article)}&brand=${encodeURIComponent(item.brand)}`); }; // Состояние для hover на иконке удаления всех const [removeAllHover, setRemoveAllHover] = useState(false); // Состояние для hover на корзине отдельного товара const [hoveredId, setHoveredId] = useState(null); // Применяем фильтры к избранным товарам const filteredFavorites = favorites.filter(item => { // Фильтр по поисковому запросу if (searchQuery) { const query = searchQuery.toLowerCase(); const matchesSearch = item.name.toLowerCase().includes(query) || item.brand.toLowerCase().includes(query) || item.article.toLowerCase().includes(query); if (!matchesSearch) return false; } // Фильтр по производителю const selectedBrands = filterValues['Производитель'] || []; if (selectedBrands.length > 0 && !selectedBrands.includes(item.brand)) { return false; } // Фильтр по цене const priceRange = filterValues['Цена (₽)']; if (priceRange && item.price) { const [minPrice, maxPrice] = priceRange; if (item.price < minPrice || item.price > maxPrice) { return false; } } return true; }); // Применяем сортировку const sortedFavorites = [...filteredFavorites].sort((a, b) => { let comparison = 0; switch (sortBy) { case 'name': comparison = a.name.localeCompare(b.name); break; case 'brand': comparison = a.brand.localeCompare(b.brand); break; case 'date': comparison = new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime(); break; default: comparison = 0; } return sortOrder === 'asc' ? comparison : -comparison; }); const handleSortClick = (newSortBy: 'name' | 'brand' | 'date') => { if (sortBy === newSortBy) { // Если тот же столбец, меняем порядок onSortOrderChange?.(sortOrder === 'asc' ? 'desc' : 'asc'); } else { // Если новый столбец, устанавливаем его и порядок по умолчанию onSortChange?.(newSortBy); onSortOrderChange?.(newSortBy === 'date' ? 'desc' : 'asc'); } }; // SVG-галочки для сортировки — всегда видны у всех колонок const getSortIcon = (columnSort: 'name' | 'brand' | 'date') => { const isActive = sortBy === columnSort; const isAsc = sortOrder === 'asc'; const color = isActive ? 'var(--_button---primary)' : '#94a3b8'; return ( ); }; return (
{})} filterValues={filterValues} searchQuery={searchQuery} onSearchChange={onSearchChange || (() => {})} />
{/* Информация о результатах фильтрации */} {(searchQuery || Object.values(filterValues).some(v => Array.isArray(v) ? v.length > 0 : v)) && (
Найдено {sortedFavorites.length} из {favorites.length} товаров {searchQuery && ( по запросу "{searchQuery}" )}
)}
handleSortClick('brand')} > Производитель {getSortIcon('brand')}
Артикул
handleSortClick('name')} > Наименование {getSortIcon('name')}
Комментарий
{/*
Действия
*/} {favorites.length > 0 && (
setRemoveAllHover(true)} onMouseLeave={() => setRemoveAllHover(false)} >
Удалить
)}
{sortedFavorites.map((item) => { return (

{item.brand}

{item.article}

{item.name}
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
{/* Корзина с hover-эффектом для удаления товара */} setHoveredId(item.id)} onMouseLeave={() => setHoveredId(null)} > handleRemove(item.id)} >
); })} {sortedFavorites.length === 0 && (
{favorites.length === 0 ? 'Нет избранных товаров' : 'Нет товаров, соответствующих фильтрам'}
)}
); }; export default FavoriteList;