commerce/components/page/icon-with-text-block.tsx
Chloe 8f0801689c
feat: homepage and integrate with shopify page
Signed-off-by: Chloe <pinkcloudvnn@gmail.com>
2024-05-27 16:48:22 +07:00

56 lines
2.0 KiB
TypeScript

import Grid from 'components/grid';
import DynamicHeroIcon from 'components/hero-icon';
import { getMetaobjects, getMetaobjectsByIds } from 'lib/shopify';
import { Metaobject } from 'lib/shopify/types';
import { computeLayoutClassnames } from './layout';
export const IconBlockPlaceholder = () => {
return (
<div className="flex animate-pulse flex-col gap-5 px-4 md:px-0">
<div className="h-10 w-1/2 rounded bg-gray-200" />
<div className="h-40 w-full rounded bg-gray-200" />
<div className="h-40 w-full rounded bg-gray-200" />
</div>
);
};
const IconWithTextBlock = async ({ block }: { block: Metaobject }) => {
const [contentBlocks, layouts, screenSizes] = await Promise.all([
getMetaobjectsByIds(block.content ? JSON.parse(block.content) : []),
getMetaobjectsByIds(block.layouts ? JSON.parse(block.layouts) : []),
getMetaobjects('screen_sizes')
]);
const validClassnames = computeLayoutClassnames({ layouts, screenSizes });
return (
<div className="flex flex-col gap-5 px-4 md:px-0">
{block.title ? (
<h3 className="text-xl font-semibold leading-6 text-gray-900">{block.title}</h3>
) : null}
<Grid className={`${validClassnames} gap-x-8`}>
{contentBlocks.map((block) => (
<div key={block.id} className="items-center sm:flex">
{block.icon_name && (
<div className="sm:flex-shrink-0">
<div className="flow-root">
<DynamicHeroIcon icon={block.icon_name} className="w-16 text-secondary" />
</div>
</div>
)}
<div className="mt-3 sm:ml-4 sm:mt-0">
{block.title && (
<div className="text-sm font-medium text-gray-900">{block.title}</div>
)}
{block.content && <p className="mt-2 text-sm text-gray-500">{block.content}</p>}
</div>
</div>
))}
</Grid>
</div>
);
};
export default IconWithTextBlock;