feat: optymalizacja GlobalSearch, nawigacji oraz filtrów w sklepie

This commit is contained in:
MichalC
2026-06-27 21:12:23 +02:00
parent 0c59086a6b
commit c4294a81cf
43 changed files with 1623 additions and 192 deletions
+15 -3
View File
@@ -10,6 +10,8 @@ import { companyDetails } from '@/content/company';
interface ProductsGridProps {
products: Product[];
brands: string[];
initialSearch?: string;
initialBrand?: string;
}
const PER_PAGE = 24;
@@ -74,9 +76,10 @@ function Accordion({ title, children, defaultOpen = true }: AccordionProps) {
);
}
export function ProductsGrid({ products, brands }: ProductsGridProps) {
export function ProductsGrid({ products, brands, initialSearch, initialBrand }: ProductsGridProps) {
const [category, setCategory] = useState<'all' | 'scienne' | 'multisplit'>('all');
const [selectedBrands, setSelectedBrands] = useState<string[]>([]);
const [selectedBrands, setSelectedBrands] = useState<string[]>(initialBrand ? [initialBrand] : []);
const [searchQuery, setSearchQuery] = useState(initialSearch || '');
const [priceMin, setPriceMin] = useState('');
const [priceMax, setPriceMax] = useState('');
const [selectedRooms, setSelectedRooms] = useState<string[]>([]);
@@ -103,6 +106,14 @@ export function ProductsGrid({ products, brands }: ProductsGridProps) {
const filtered = useMemo(() => {
return products.filter(p => {
// Wyszukiwanie tekstowe
if (searchQuery) {
const sq = searchQuery.toLowerCase();
if (!p.name.toLowerCase().includes(sq) && !p.brand.toLowerCase().includes(sq)) {
return false;
}
}
// Kategoria
if (category !== 'all' && p.category !== category) return false;
@@ -177,6 +188,7 @@ export function ProductsGrid({ products, brands }: ProductsGridProps) {
const resetAll = () => {
setCategory('all');
setSelectedBrands([]);
setSearchQuery('');
setPriceMin('');
setPriceMax('');
setSelectedRooms([]);
@@ -186,7 +198,7 @@ export function ProductsGrid({ products, brands }: ProductsGridProps) {
setPage(1);
};
const hasFilters = category !== 'all' || selectedBrands.length > 0 || priceMin || priceMax || selectedRooms.length > 0 || selectedColors.length > 0 || halasMin > 15 || halasMax < 50;
const hasFilters = category !== 'all' || selectedBrands.length > 0 || searchQuery !== '' || priceMin || priceMax || selectedRooms.length > 0 || selectedColors.length > 0 || halasMin > 15 || halasMax < 50;
const Sidebar = () => (
<aside className="w-full">