commerce/components/page/category-preview.tsx
Chloe 2c6bfcad65
fix: add srcset for images on homepage
Signed-off-by: Chloe <pinkcloudvnn@gmail.com>
2024-05-28 16:03:37 +07:00

70 lines
2.5 KiB
TypeScript

import Grid from 'components/grid';
import { getCollection, getMetaobjects, getMetaobjectsByIds } from 'lib/shopify';
import { Metaobject } from 'lib/shopify/types';
import { Suspense } from 'react';
import ImageDisplay from './image-display';
import { computeLayoutClassnames } from './layout';
export const Category = async ({ collectionId }: { collectionId: string }) => {
const collection = await getCollection({ id: collectionId });
return (
<h3 className="mt-4 text-base font-semibold text-gray-900">
<a href={collection?.path}>
<span className="absolute inset-0" />
{collection?.title}
</a>
</h3>
);
};
const CategoryPreview = async ({ block }: { block: Metaobject }) => {
const [contentBlocks, layouts, screenSizes] = await Promise.all([
getMetaobjectsByIds(block.categories ? JSON.parse(block.categories) : []),
getMetaobjectsByIds(block.layout ? JSON.parse(block.layout) : []),
getMetaobjects('screen_sizes')
]);
const validClassnames = computeLayoutClassnames({ layouts, screenSizes });
return (
<>
<div className="px-4 md:px-0">
<h2 className="text-2xl font-bold text-gray-900">{block.title}</h2>
<Grid className={`${validClassnames} mt-6`}>
{contentBlocks.map((contentBlock) => (
<div key={contentBlock.id} className="group relative">
<div className="relative h-80 w-full overflow-hidden rounded-lg bg-white sm:aspect-h-1 sm:aspect-w-2 lg:aspect-h-1 lg:aspect-w-1 group-hover:opacity-75 sm:h-64">
<Suspense>
<ImageDisplay
title={block.title || 'Image Preview'}
fileId={contentBlock.preview_image as string}
className="h-full w-full object-cover object-center"
sizes="(min-width: 1024px) 33vw, 100vw"
/>
</Suspense>
</div>
<Suspense>
<Category collectionId={contentBlock.collection as string} />
</Suspense>
</div>
))}
</Grid>
</div>
</>
);
};
export const CategoryPreviewPlaceholder = () => {
return (
<div className="mx-auto max-w-2xl lg:max-w-none">
<Grid className="grid animate-pulse grid-cols-3 gap-y-16">
<div className="h-64 w-full rounded-lg bg-gray-200" />
<div className="h-64 w-full rounded-lg bg-gray-200" />
<div className="h-64 w-full rounded-lg bg-gray-200" />
</Grid>
</div>
);
};
export default CategoryPreview;