@yamada-ui/react
Version:
React UI components of the Yamada, by the Yamada, for the Yamada built with React and Emotion
79 lines (75 loc) • 2.45 kB
JavaScript
"use client";
import { useValidChildren } from "../../utils/children.js";
import { utils_exports } from "../../utils/index.js";
import { useI18n } from "../../providers/i18n-provider/i18n-provider.js";
import { cloneElement, useCallback, useMemo } from "react";
//#region src/components/breadcrumb/use-breadcrumb.tsx
const useBreadcrumb = ({ children, ellipsis, endBoundaries = 0, items = [], link, startBoundaries = 0,...rest } = {}) => {
const validChildren = useValidChildren(children);
const length = validChildren.length || items.length;
const { t } = useI18n("breadcrumb");
const hasBoundaries = startBoundaries + endBoundaries > 0 && length > startBoundaries + endBoundaries;
const renderLink = useCallback((items$1) => {
if (!link) return [];
return items$1.map(({ label,...rest$1 }) => cloneElement(link, {
...link.props,
children: label,
...rest$1
}));
}, [link]);
const renderEllipsis = useCallback((items$1) => {
if (!ellipsis) return null;
return (0, utils_exports.runIfFn)(ellipsis, { items: items$1 });
}, [ellipsis]);
const splitItems = useCallback((items$1) => {
const length$1 = items$1.length;
return [
items$1.slice(0, startBoundaries),
items$1.slice(startBoundaries, length$1 - endBoundaries),
items$1.slice(length$1 - endBoundaries)
];
}, [startBoundaries, endBoundaries]);
const cloneChildren = useMemo(() => {
if (!!validChildren.length) return validChildren;
else if (hasBoundaries) {
const [firstItems, ellipsisItems, lastItems] = splitItems(items);
return [
...renderLink(firstItems),
renderEllipsis(ellipsisItems),
...renderLink(lastItems)
];
} else return renderLink(items);
}, [
validChildren,
items,
hasBoundaries,
renderEllipsis,
renderLink,
splitItems
]);
const getRootProps = useCallback((props) => ({
"aria-label": t("Breadcrumb"),
...rest,
...props
}), [rest, t]);
const getListProps = useCallback((props) => ({ ...props }), []);
const getLinkProps = useCallback(({ href, currentPage,...props } = {}) => ({
href: !currentPage ? href : void 0,
"aria-current": currentPage ? "page" : void 0,
...props
}), []);
return {
children: cloneChildren,
getEllipsisProps: useCallback((props) => ({
"aria-label": t("Ellipsis"),
role: "presentation",
...props
}), [t]),
getLinkProps,
getListProps,
getRootProps
};
};
//#endregion
export { useBreadcrumb };
//# sourceMappingURL=use-breadcrumb.js.map