Files
ironmount/apps/client/app/lib/breadcrumbs.ts
2025-11-02 16:36:02 +01:00

87 lines
1.9 KiB
TypeScript

import { useLocation, useParams } from "react-router";
export interface BreadcrumbItem {
label: string;
href?: string;
isCurrentPage?: boolean;
}
/**
* Generates breadcrumb items based on the current route
* @param pathname - Current pathname from useLocation
* @param params - Route parameters from useParams
* @returns Array of breadcrumb items
*/
export function generateBreadcrumbs(pathname: string, params: Record<string, string | undefined>): BreadcrumbItem[] {
const breadcrumbs: BreadcrumbItem[] = [];
if (pathname.startsWith("/repositories")) {
breadcrumbs.push({
label: "Repositories",
href: "/repositories",
isCurrentPage: pathname === "/repositories",
});
if (pathname.startsWith("/repositories/") && params.name) {
const isSnapshotPage = !!params.snapshotId;
breadcrumbs.push({
label: params.name,
href: isSnapshotPage ? `/repositories/${params.name}` : undefined,
isCurrentPage: !isSnapshotPage,
});
if (isSnapshotPage && params.snapshotId) {
breadcrumbs.push({
label: params.snapshotId,
isCurrentPage: true,
});
}
}
return breadcrumbs;
}
if (pathname.startsWith("/backups")) {
breadcrumbs.push({
label: "Backups",
href: "/backups",
isCurrentPage: pathname === "/backups",
});
if (pathname.startsWith("/backups/") && params.id) {
breadcrumbs.push({
label: `Schedule #${params.id}`,
isCurrentPage: true,
});
}
return breadcrumbs;
}
breadcrumbs.push({
label: "Volumes",
href: "/volumes",
isCurrentPage: pathname === "/volumes",
});
if (pathname.startsWith("/volumes/") && params.name) {
breadcrumbs.push({
label: params.name,
isCurrentPage: true,
});
}
return breadcrumbs;
}
/**
* Hook to get breadcrumb data for the current route
*/
export function useBreadcrumbs(): BreadcrumbItem[] {
const location = useLocation();
const params = useParams();
return generateBreadcrumbs(location.pathname, params);
}