first commit
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
import { discountPercent } from "./format";
|
||||
import { productHref } from "./slug";
|
||||
import { DEMO_PRICING, demoPrice } from "./demoPricing";
|
||||
import type { ApiProduct, ProductCardData, StoreSpecial } from "./types";
|
||||
|
||||
export function productToCard(product: ApiProduct): ProductCardData {
|
||||
const base = {
|
||||
id: product.id,
|
||||
href: productHref(product.id, product.nameFa, product.title),
|
||||
title: product.nameFa || product.title,
|
||||
image: product.thumbnailUrl || product.image || product.thumbnail,
|
||||
};
|
||||
|
||||
if (product.store.minPrice !== null) {
|
||||
return { ...base, price: product.store.minPrice, oldPrice: null, percent: 0, inStock: product.store.inStock };
|
||||
}
|
||||
|
||||
if (DEMO_PRICING) {
|
||||
const { price, oldPrice } = demoPrice(product);
|
||||
return {
|
||||
...base,
|
||||
price,
|
||||
oldPrice,
|
||||
percent: oldPrice ? discountPercent(price, oldPrice) : 0,
|
||||
inStock: true,
|
||||
};
|
||||
}
|
||||
|
||||
return { ...base, price: null, oldPrice: null, percent: 0, inStock: false };
|
||||
}
|
||||
|
||||
// A curated store-special group carries its own variant pricing, so the
|
||||
// discount shown there is the real one rather than a product-level guess.
|
||||
export function specialToCards(special: StoreSpecial): ProductCardData[] {
|
||||
return special.items
|
||||
.filter((item) => item.isActive)
|
||||
.map((item) => {
|
||||
const variant = item.variants.find((v) => v.discountedPrice !== null) ?? item.variants[0];
|
||||
const price = variant?.discountedPrice ?? variant?.price ?? null;
|
||||
const oldPrice = variant?.discountedPrice !== null ? variant?.price ?? null : null;
|
||||
return {
|
||||
id: item.id,
|
||||
href: productHref(item.productId, item.productNameFa, item.productTitle),
|
||||
title: item.productNameFa || item.productTitle,
|
||||
image: item.productImage,
|
||||
price,
|
||||
oldPrice,
|
||||
percent: price !== null && oldPrice !== null ? discountPercent(price, oldPrice) : 0,
|
||||
inStock: (variant?.stockQuantity ?? 0) > 0,
|
||||
};
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user