/** * Copyright (c) 2023-present Plane Software, Inc. and contributors * SPDX-License-Identifier: AGPL-3.0-only * See the LICENSE file for details. */ import * as React from "react"; import { ChevronRightIcon } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; import { cn } from "../utils"; type BreadcrumbsProps = { className?: string; children: React.ReactNode; onBack?: () => void; isLoading?: boolean; }; export function BreadcrumbItemLoader() { return (
); } function Breadcrumbs({ className, children, onBack, isLoading = false }: BreadcrumbsProps) { const [isSmallScreen, setIsSmallScreen] = React.useState(false); React.useEffect(() => { const handleResize = () => { setIsSmallScreen(window.innerWidth <= 640); // Adjust this value as per your requirement }; window.addEventListener("resize", handleResize); handleResize(); // Call it initially to set the correct state return () => window.removeEventListener("resize", handleResize); }, []); const childrenArray = React.Children.toArray(children); return (
{!isSmallScreen && ( <> {childrenArray.map((child, index) => { if (isLoading) { return ( <> ); } if (React.isValidElement(child)) { return React.cloneElement(child, { isLast: index === childrenArray.length - 1, }); } return child; })} )} {isSmallScreen && childrenArray.length > 1 && ( <>
{onBack && ( ... )}
{isLoading ? ( ) : React.isValidElement(childrenArray[childrenArray.length - 1]) ? ( React.cloneElement(childrenArray[childrenArray.length - 1] as React.ReactElement, { isLast: true, }) ) : ( childrenArray[childrenArray.length - 1] )}
)} {isSmallScreen && childrenArray.length === 1 && childrenArray}
); } // breadcrumb item type BreadcrumbItemProps = { component?: React.ReactNode; showSeparator?: boolean; isLast?: boolean; }; function BreadcrumbItem(props: BreadcrumbItemProps) { const { component, showSeparator = true, isLast = false } = props; return (
{component} {showSeparator && !isLast && }
); } // breadcrumb icon type BreadcrumbIconProps = { children: React.ReactNode; className?: string; }; function BreadcrumbIcon(props: BreadcrumbIconProps) { const { children, className } = props; return
{children}
; } // breadcrumb label type BreadcrumbLabelProps = { children: React.ReactNode; className?: string; }; function BreadcrumbLabel(props: BreadcrumbLabelProps) { const { children, className } = props; return (
{children}
); } // breadcrumb separator type BreadcrumbSeparatorProps = { className?: string; containerClassName?: string; iconClassName?: string; showDivider?: boolean; }; function BreadcrumbSeparator(props: BreadcrumbSeparatorProps) { const { className, containerClassName, iconClassName, showDivider = false } = props; return (
{showDivider && }
); } // breadcrumb wrapper type BreadcrumbItemWrapperProps = { label?: string; disableTooltip?: boolean; children: React.ReactNode; className?: string; type?: "link" | "text"; isLast?: boolean; }; function BreadcrumbItemWrapper(props: BreadcrumbItemWrapperProps) { const { label, disableTooltip = false, children, className, type = "link", isLast = false } = props; return (
{children}
); } Breadcrumbs.Item = BreadcrumbItem; Breadcrumbs.Icon = BreadcrumbIcon; Breadcrumbs.Label = BreadcrumbLabel; Breadcrumbs.Separator = BreadcrumbSeparator; Breadcrumbs.ItemWrapper = BreadcrumbItemWrapper; export { Breadcrumbs, BreadcrumbItem, BreadcrumbIcon, BreadcrumbLabel, BreadcrumbSeparator, BreadcrumbItemWrapper };