import { useAtomValue } from "jotai"; import { treeDataAtom } from "@/features/page/tree/atoms/tree-data-atom.ts"; import React, { useCallback, useEffect, useState } from "react"; import { findBreadcrumbPath } from "@/features/page/tree/utils"; import { Button, Anchor, Popover, Breadcrumbs, ActionIcon, Text, Tooltip, } from "@mantine/core"; import { IconCornerDownRightDouble, IconDots } from "@tabler/icons-react"; import { Link, useParams } from "react-router-dom"; import classes from "./breadcrumb.module.css"; import { SpaceTreeNode } from "@/features/page/tree/types.ts"; import { buildPageUrl } from "@/features/page/page.utils.ts"; import { usePageQuery } from "@/features/page/queries/page-query.ts"; import { extractPageSlugId } from "@/lib"; import { useMediaQuery } from "@mantine/hooks"; function getTitle(name: string, icon: string) { if (icon) { return `${icon} ${name}`; } return name; } export default function Breadcrumb() { const treeData = useAtomValue(treeDataAtom); const [breadcrumbNodes, setBreadcrumbNodes] = useState< SpaceTreeNode[] | null >(null); const { pageSlug, spaceSlug } = useParams(); const { data: currentPage } = usePageQuery({ pageId: extractPageSlugId(pageSlug), }); const isMobile = useMediaQuery("(max-width: 48em)"); useEffect(() => { if (treeData?.length > 0 && currentPage) { const breadcrumb = findBreadcrumbPath(treeData, currentPage.id); setBreadcrumbNodes(breadcrumb || null); } }, [currentPage?.id, treeData]); const HiddenNodesTooltipContent = () => breadcrumbNodes?.slice(1, -1).map((node) => ( )); const MobileHiddenNodesTooltipContent = () => breadcrumbNodes?.map((node) => ( )); const renderAnchor = useCallback( (node: SpaceTreeNode) => ( {getTitle(node.name, node.icon)} ), [spaceSlug], ); const getBreadcrumbItems = () => { if (!breadcrumbNodes) return []; if (breadcrumbNodes.length > 3) { const firstNode = breadcrumbNodes[0]; //const secondLastNode = breadcrumbNodes[breadcrumbNodes.length - 2]; const lastNode = breadcrumbNodes[breadcrumbNodes.length - 1]; return [ renderAnchor(firstNode), , //renderAnchor(secondLastNode), renderAnchor(lastNode), ]; } return breadcrumbNodes.map(renderAnchor); }; const getMobileBreadcrumbItems = () => { if (!breadcrumbNodes) return []; if (breadcrumbNodes.length > 0) { return [ , ]; } return breadcrumbNodes.map(renderAnchor); }; return (
{breadcrumbNodes && ( {isMobile ? getMobileBreadcrumbItems() : getBreadcrumbItems()} )}
); }