typescriptUpdated about 2 months ago
Shadcn Breadcrumb
by @Apiwit
typescript
"use client";
import {
Breadcrumb,
BreadcrumbList,
BreadcrumbItem,
BreadcrumbLink,
BreadcrumbSeparator,
BreadcrumbPage,
} from "@/ui/breadcrumb";
import { usePathname } from "next/navigation";
import { capitalizeFirstLetter, convertStringSpace } from "@/utils/string";
import { Fragment, useMemo } from "react";
import Link from "next/link";
interface PageHeaderProps {
currentPageTitle?: string;
}
export default function PageBreadcrumb({ currentPageTitle }: PageHeaderProps) {
const pathname = usePathname();
const breadcrumbItems = useMemo(() => {
return pathname.split("/").map((path, index, arr) => {
return {
title:
index > 0 ? capitalizeFirstLetter(convertStringSpace(path)) : "Home",
href: index > 0 ? arr.slice(0, index + 1).join("/") : "/",
};
});
}, [pathname]);
const breadcrumbTitle = useMemo(
() => currentPageTitle || breadcrumbItems.at(-1)?.title,
[breadcrumbItems, currentPageTitle]
);
return (
<>
<Breadcrumb>
<BreadcrumbList>
{breadcrumbItems.slice(0, -1).map((item) => {
return (
<Fragment key={item.href + item.title}>
<BreadcrumbItem>
<BreadcrumbLink asChild>
<Link href={item.href}>{item.title}</Link>
</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator />
</Fragment>
);
})}
<BreadcrumbPage>{breadcrumbTitle}</BreadcrumbPage>
</BreadcrumbList>
</Breadcrumb>
</>
);
}Description
My variant of shadcn breadcrumb. The code is using normal shadcn component file structure. Import path can be adjusted if needed.