UNPKG

@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
"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