UNPKG

@alauda/doom

Version:

Doctor Doom making docs.

92 lines (91 loc) 4.38 kB
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { addTrailingSlash, isActive, useLocation, useSidebar, useSite, } from '@rspress/core/runtime'; import { IconArrowRight, SvgWrapper } from '@rspress/core/theme'; import virtual from 'doom-@global-virtual'; import { use, useEffect, useMemo } from 'react'; import { xfetch } from 'x-fetch'; import { parse } from 'yaml'; import { BuildInfoContext } from "../../shared/context.js"; import { X } from "../_X.js"; import { useLang, useSiteOverrides, useTranslation } from '@alauda/doom/runtime'; const isBuildInfoItem = (obj) => 'base' in obj && 'version' in obj; export const BreadCrumb = () => { const lang = useLang(); const t = useTranslation(); const { pathname } = useLocation(); const sidebar = useSidebar(); const site = useSiteOverrides(); const { site: siteData } = useSite(); const breadcrumbItems = useMemo(() => { function walk(sidebarItems, parents = []) { for (const sidebarItem of sidebarItems) { if ('link' in sidebarItem && sidebarItem.link && isActive(sidebarItem.link, pathname)) { return [ ...parents.map((p) => ({ text: p.text, link: p.link, })), { text: sidebarItem.text, }, ]; } if ('items' in sidebarItem && sidebarItem.items.length) { const found = walk(sidebarItem.items, [...parents, sidebarItem]); if (found) { return found; } } } } return walk(sidebar); }, [pathname, sidebar]); const prefix = addTrailingSlash(`/${lang === siteData.lang ? '' : lang}`); const { groups, setGroups: setBuildInfoGroups } = use(BuildInfoContext); const hasGroups = !!groups.length; useEffect(() => { const fetchBuildInfo = async () => { let rawBuildInfo; try { rawBuildInfo = parse(await xfetch((virtual.prefix || '') + '/build-info.yaml', { type: 'text', })); } catch { return; } const buildInfoGroups = []; for (const [base, items] of Object.entries(rawBuildInfo)) { let buildInfo; if (isBuildInfoItem(items)) { buildInfo = items; } else { const latest = Object.values(items).at(-1); if (latest) { buildInfo = latest; } } if (!buildInfo) { continue; } const id = (buildInfo.displayName?.en || base) .toLowerCase() .replace(/^alauda[\s-]+/, '') .replace(/^build[\s-]+of[\s-]+/, '')[0]; let group = buildInfoGroups.find((g) => g.id === id); if (!group) { group = { id, items: [] }; buildInfoGroups.push(group); } group.items.push(buildInfo); } setBuildInfoGroups(buildInfoGroups.sort((a, b) => a.id.localeCompare(b.id))); }; void fetchBuildInfo(); }, [setBuildInfoGroups]); return (_jsx("div", { className: "breadcrumb-container", children: _jsxs("ul", { className: "breadcrumb-content", children: [hasGroups && (_jsx("li", { className: "breadcrumb-item rp-doc", children: _jsx(X.a, { href: prefix + 'products', children: t('products') }) })), _jsxs("li", { className: "breadcrumb-item rp-doc", children: [hasGroups && _jsx(SvgWrapper, { icon: IconArrowRight }), _jsx(X.a, { href: prefix, children: site.title || siteData.title })] }), breadcrumbItems?.map((item, index) => (_jsxs("li", { className: "breadcrumb-item rp-doc", children: [_jsx(SvgWrapper, { icon: IconArrowRight }), item.link ? (_jsx(X.a, { href: item.link, children: item.text })) : (_jsx("span", { className: "breadcrumb-item-text", children: item.text }))] }, index)))] }) })); }; export default BreadCrumb;