43 lines
1.7 KiB
TypeScript
43 lines
1.7 KiB
TypeScript
import catalog from "@/data/products.json";
|
|
import type { CatalogProvider, Product, ProductFilters } from "@/lib/headless/types";
|
|
|
|
const products = catalog satisfies Product[];
|
|
|
|
function normalize(value: string): string {
|
|
return value.toLocaleLowerCase("es").normalize("NFD").replace(/[\u0300-\u036f]/g, "");
|
|
}
|
|
|
|
function matches(product: Product, filters: ProductFilters): boolean {
|
|
if (filters.category && filters.category !== "Todos" && product.category !== filters.category) return false;
|
|
if (filters.collection && product.collection !== filters.collection) return false;
|
|
if (filters.brand && product.brand !== filters.brand) return false;
|
|
if (filters.ageRange && product.ageRange !== filters.ageRange) return false;
|
|
if (filters.minPrice !== undefined && product.price !== null && product.price < filters.minPrice) return false;
|
|
if (filters.maxPrice !== undefined && product.price !== null && product.price > filters.maxPrice) return false;
|
|
if (filters.query) {
|
|
const query = normalize(filters.query);
|
|
const haystack = normalize([
|
|
product.name,
|
|
product.description,
|
|
product.category,
|
|
product.collection,
|
|
product.brand,
|
|
...product.tags,
|
|
].join(" "));
|
|
if (!haystack.includes(query)) return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
export const mockCatalogProvider: CatalogProvider = {
|
|
async getProducts(filters = {}) {
|
|
return products.filter((product) => matches(product, filters));
|
|
},
|
|
async getProductBySlug(slug) {
|
|
return products.find((product) => product.slug === slug) ?? null;
|
|
},
|
|
async searchProducts(query, limit = 6) {
|
|
return products.filter((product) => matches(product, { query })).slice(0, limit);
|
|
},
|
|
};
|