@alauda/doom
Version:
Doctor Doom making docs.
92 lines (91 loc) • 4.38 kB
JavaScript
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;