Files
protekauto-frontend/src/components/profile/ProfileHistoryTabs.tsx
egortriston 268e6d3315 fix11072025
2025-07-11 02:49:25 +03:00

144 lines
5.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React, { useState, useRef } from "react";
import { PartsSearchHistoryItem } from '@/lib/graphql/search-history';
interface ProfileHistoryTabsProps {
tabs: string[];
activeTab: string;
onTabChange: (tab: string) => void;
historyItems: PartsSearchHistoryItem[];
selectedManufacturer: string;
onManufacturerChange: (manufacturer: string) => void;
}
const ProfileHistoryTabs: React.FC<ProfileHistoryTabsProps> = ({
tabs,
activeTab,
onTabChange,
historyItems,
selectedManufacturer,
onManufacturerChange,
}) => {
const [isDropdownOpen, setIsDropdownOpen] = useState(false);
const dropdownRef = useRef<HTMLDivElement>(null);
// Получаем уникальных производителей из истории поиска
const getUniqueManufacturers = () => {
const manufacturersSet = new Set<string>();
historyItems.forEach(item => {
// Добавляем бренд из поля brand
if (item.brand) {
manufacturersSet.add(item.brand);
}
// Добавляем бренд из информации об автомобиле
if (item.vehicleInfo?.brand) {
manufacturersSet.add(item.vehicleInfo.brand);
}
});
const uniqueManufacturers = Array.from(manufacturersSet).sort();
return ["Все", ...uniqueManufacturers];
};
const manufacturers = getUniqueManufacturers();
// Закрытие дропдауна при клике вне
React.useEffect(() => {
function handleClickOutside(event: MouseEvent) {
if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {
setIsDropdownOpen(false);
}
}
if (isDropdownOpen) {
document.addEventListener("mousedown", handleClickOutside);
} else {
document.removeEventListener("mousedown", handleClickOutside);
}
return () => {
document.removeEventListener("mousedown", handleClickOutside);
};
}, [isDropdownOpen]);
const handleManufacturerSelect = (manufacturer: string) => {
onManufacturerChange(manufacturer);
setIsDropdownOpen(false);
};
return (
<div className="flex flex-wrap gap-5 w-full max-md:max-w-full">
{tabs.map((tab) => (
<div
key={tab}
className={`flex flex-1 shrink gap-5 items-center h-full text-center rounded-xl basis-12 min-w-[160px] text-[14px] ${
activeTab === tab
? "text-white"
: "bg-slate-200 text-gray-950"
}`}
style={{ cursor: "pointer" }}
onClick={() => onTabChange(tab)}
>
<div
className={`flex-1 shrink gap-5 self-stretch px-6 py-3.5 my-auto w-full rounded-xl basis-0 min-w-[160px] text-[14px] max-md:px-5 ${
activeTab === tab
? "text-white bg-red-600"
: "bg-slate-200 text-gray-950"
}`}
>
{tab}
</div>
</div>
))}
<div
className="relative w-[300px] max-w-full max-sm:w-full"
ref={dropdownRef}
tabIndex={0}
>
<div
className="flex justify-between items-center px-6 py-3 text-sm leading-snug bg-white rounded border border-solid border-stone-300 text-neutral-500 cursor-pointer select-none w-full min-w-[200px]"
onClick={() => setIsDropdownOpen((prev) => !prev)}
>
<span className="truncate">{selectedManufacturer}</span>
<span className="ml-2 flex-shrink-0 flex items-center">
<svg
width="20"
height="20"
fill="none"
viewBox="0 0 20 20"
className={`transition-transform duration-200 ${isDropdownOpen ? 'rotate-180' : ''}`}
>
<path d="M6 8l4 4 4-4" stroke="#9CA3AF" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
</svg>
</span>
</div>
{isDropdownOpen && (
<ul className="absolute px-0 pb-2 pl-0 list-none left-0 top-full z-10 bg-white border-x border-b border-stone-300 rounded-b-lg shadow-lg w-full max-h-60 overflow-y-auto dropdown-scroll-invisible">
{manufacturers.length === 0 ? (
<li className="py-2 text-xs text-gray-400 text-center">
Нет данных
</li>
) : (
manufacturers.map((manufacturer) => (
<li
key={manufacturer}
className={`py-2 px-5 text-sm cursor-pointer hover:bg-blue-100 transition-colors ${manufacturer === selectedManufacturer ? 'bg-blue-50 text-red-600 font-normal' : 'text-neutral-500 font-medium'}`}
onMouseDown={() => handleManufacturerSelect(manufacturer)}
>
{manufacturer}
{manufacturer !== "Все" && (
<span className="ml-2 text-[10px] text-gray-400">
({historyItems.filter(item =>
item.brand === manufacturer || item.vehicleInfo?.brand === manufacturer
).length})
</span>
)}
</li>
))
)}
</ul>
)}
</div>
</div>
);
};
export default ProfileHistoryTabs;