import { useAtomValue } from "jotai"; import { treeDataAtom } from "@/features/page/tree/atoms/tree-data-atom.ts"; import React, { useEffect, useState } from "react"; import { findBreadcrumbPath } from "@/features/page/tree/utils"; import { Button, Anchor, Popover, Breadcrumbs, ActionIcon, Text, } from "@mantine/core"; import { 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"; 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), }); useEffect(() => { if (treeData?.length > 0 && currentPage) { const breadcrumb = findBreadcrumbPath(treeData, currentPage.id); setBreadcrumbNodes(breadcrumb || null); } }, [currentPage?.id, treeData]); const HiddenNodesTooltipContent = () => breadcrumbNodes?.slice(1, -2).map((node) => ( )); const renderAnchor = (node: SpaceTreeNode) => ( {getTitle(node.name, node.icon)} ); 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); }; return (
{breadcrumbNodes && ( {getBreadcrumbItems()} )}
); }