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
+1 -1
View File
@@ -1,6 +1,6 @@
// TODO: Dane firmy — do uzupełnienia przez właściciela
export const companyDetails = {
name: "ThermCool HVAC & Usługi Domowe",
name: "ThermCool HVAC",
legalName: "e-Cores Radosław Smoliński",
shortName: "ThermCool",
nip: "8943284529",
+72
View File
@@ -0,0 +1,72 @@
import { getProducts } from './products';
export interface VariantOption {
slug: string;
moc?: string;
moc_float?: number;
wykończenie?: string;
cena: number;
}
export interface ProductVariants {
series: string;
currentMoc: string;
currentWykończenie: string;
moce: VariantOption[];
wykończenia: VariantOption[];
}
export function getProductVariants(slug: string): ProductVariants | null {
const products = getProducts();
const currentProduct = products.find(p => p.slug === slug);
if (!currentProduct) return null;
// Extract series from SKU (e.g., GREE-PULAR-PU09S -> GREE-PULAR)
const skuParts = currentProduct.sku.split('-');
if (skuParts.length < 2) return null;
const series = skuParts.slice(0, -1).join('-');
const seriesProducts = products.filter(p => p.sku.startsWith(series + '-'));
const currentMoc = currentProduct.specs['Moc chłodnicza'] || '';
const currentWykończenie = currentProduct.specs['Wykończenie'] || '';
// Moce: same series, same wykończenie
const moceProducts = seriesProducts.filter(p => (p.specs['Wykończenie'] || '') === currentWykończenie);
const moce = moceProducts
.filter(p => p.specs['Moc chłodnicza'] && p.price)
.map(p => {
const m = p.specs['Moc chłodnicza'] as string;
return {
slug: p.slug,
moc: m,
moc_float: parseFloat(m.replace(',', '.')),
cena: p.price as number,
};
})
.sort((a, b) => (a.moc_float || 0) - (b.moc_float || 0));
// Wykończenia: same series, same moc
const wykończeniaProducts = seriesProducts.filter(p => (p.specs['Moc chłodnicza'] || '') === currentMoc);
let wykończenia = wykończeniaProducts
.filter(p => p.specs['Wykończenie'] && p.price)
.map(p => ({
slug: p.slug,
wykończenie: p.specs['Wykończenie'] as string,
cena: p.price as number,
}));
// If there's only 1 finish available in the entire series, don't show the variants selector
const allFinishesInSeries = new Set(seriesProducts.map(p => p.specs['Wykończenie'] || '').filter(Boolean));
if (allFinishesInSeries.size <= 1) {
wykończenia = [];
}
return {
series,
currentMoc,
currentWykończenie,
moce: moce.length > 1 ? moce : [],
wykończenia,
};
}