mirror of
https://github.com/vercel/commerce.git
synced 2025-04-27 21:37:50 +00:00
67 lines
1.8 KiB
TypeScript
67 lines
1.8 KiB
TypeScript
import { GridTileImage } from "components/grid/tile";
|
|
import { getCollectionProducts } from "lib/store/products";
|
|
import type { Product } from "lib/store/types";
|
|
import { getImageUrl } from "lib/utils/image";
|
|
import Link from "next/link";
|
|
|
|
function MainProductCardItem({
|
|
item,
|
|
size,
|
|
priority,
|
|
}: {
|
|
item: Product;
|
|
size: "full" | "half";
|
|
priority?: boolean;
|
|
}) {
|
|
return (
|
|
<div
|
|
className={
|
|
size === "full"
|
|
? "md:col-span-4 md:row-span-2"
|
|
: "md:col-span-2 md:row-span-1"
|
|
}
|
|
>
|
|
<Link
|
|
className="relative block aspect-square h-full w-full"
|
|
href={`/product/${item.handle}`}
|
|
prefetch={true}
|
|
>
|
|
<GridTileImage
|
|
src={getImageUrl(item.featuredImage.source)}
|
|
fill
|
|
sizes={
|
|
size === "full"
|
|
? "(min-width: 768px) 66vw, 100vw"
|
|
: "(min-width: 768px) 33vw, 100vw"
|
|
}
|
|
priority={priority}
|
|
alt={item.title}
|
|
label={{
|
|
position: size === "full" ? "center" : "bottom",
|
|
title: item.title as string,
|
|
amount: item.priceRange.maxVariantPrice.amount,
|
|
currencyCode: item.priceRange.maxVariantPrice.currencyCode,
|
|
}}
|
|
/>
|
|
</Link>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
export async function MainProductCard() {
|
|
// Collections that start with `hidden-*` are hidden from the search page.
|
|
const homepageItems = await getCollectionProducts({
|
|
collection: "hidden-homepage-featured-items",
|
|
});
|
|
|
|
if (!homepageItems[0]) return null;
|
|
|
|
const [firstProduct] = homepageItems;
|
|
|
|
return (
|
|
<section className="mx-auto grid max-w-(--breakpoint-2xl) gap-4 px-4 pb-4 md:grid-cols-6 md:grid-rows-2 lg:max-h-[calc(100vh-200px)]">
|
|
<MainProductCardItem size="full" item={firstProduct} priority={true} />
|
|
</section>
|
|
);
|
|
}
|