1
0
mirror of https://github.com/vercel/commerce.git synced 2025-08-11 19:31:23 +00:00
Files
.github
.vscode
app
components
breadcrumb
breadcrumb-home.tsx
breadcrumb-list.tsx
index.tsx
cart
filters
grid
icons
layout
page
product
profile
banner.tsx
carousel.tsx
checkbox.tsx
hero-icon.tsx
hero.tsx
home-page-content.tsx
label.tsx
loading-dots.tsx
logo-square.tsx
opengraph-image.tsx
price.tsx
prose.tsx
side-dialog.tsx
tooltip.tsx
fonts
hooks
lib
public
.env.example
.eslintrc.js
.gitignore
.nvmrc
.prettierignore
README.md
license.md
next.config.js
package.json
pnpm-lock.yaml
postcss.config.js
prettier.config.js
tailwind.config.js
tsconfig.json
commerce/components/breadcrumb/index.tsx
2024-05-27 16:48:22 +07:00

83 lines
2.2 KiB
TypeScript

import { getCollection, getMenu, getProduct } from 'lib/shopify';
import { findParentCollection } from 'lib/utils';
import { Fragment } from 'react';
import {
Breadcrumb,
BreadcrumbItem,
BreadcrumbLink,
BreadcrumbList,
BreadcrumbPage,
BreadcrumbSeparator
} from './breadcrumb-list';
type BreadcrumbProps = {
type: 'product' | 'collection';
handle: string;
};
const BreadcrumbComponent = async ({ type, handle }: BreadcrumbProps) => {
const items: Array<{ href: string; title: string }> = [{ href: '/', title: 'Home' }];
if (type === 'product') {
const product = await getProduct(handle);
if (!product) return null;
const collection = product?.collections.nodes.length ? product.collections.nodes[0] : null;
if (collection) {
items.push({
href: `/search/${collection.handle}`,
title: collection.title
});
}
items.push({
title: product.title,
href: `/product/${product.handle}`
});
}
if (type === 'collection') {
const collectionData = getCollection({ handle });
const menuData = getMenu('main-menu');
const [collection, menu] = await Promise.all([collectionData, menuData]);
if (!collection) return null;
const parentCollection = findParentCollection(menu, handle);
if (parentCollection && parentCollection.path !== `/search/${handle}`) {
items.push({
href: `${parentCollection.path}`,
title: parentCollection.title
});
}
items.push({
title: collection.title,
href: `/search/${collection.handle}`
});
}
return (
<Breadcrumb>
<BreadcrumbList>
{items.slice(0, items.length).map((item, index) => (
<Fragment key={item.href}>
{index === items.length - 1 ? (
<BreadcrumbItem>
<BreadcrumbPage>{item.title}</BreadcrumbPage>
</BreadcrumbItem>
) : (
<>
<BreadcrumbItem>
<BreadcrumbLink href={item.href}>{item.title}</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator />
</>
)}
</Fragment>
))}
</BreadcrumbList>
</Breadcrumb>
);
};
export default BreadcrumbComponent;