UNPKG

5.54 kBJavaScriptView Raw
1"use client";
2
3var __rest = this && this.__rest || function (s, e) {
4 var t = {};
5 for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
6 if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7 if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
8 }
9 return t;
10};
11import * as React from 'react';
12import classNames from 'classnames';
13import toArray from "rc-util/es/Children/toArray";
14import pickAttrs from "rc-util/es/pickAttrs";
15import { cloneElement } from '../_util/reactNode';
16import { devUseWarning } from '../_util/warning';
17import { ConfigContext } from '../config-provider';
18import BreadcrumbItem, { InternalBreadcrumbItem } from './BreadcrumbItem';
19import BreadcrumbSeparator from './BreadcrumbSeparator';
20import useStyle from './style';
21import useItemRender from './useItemRender';
22import useItems from './useItems';
23const getPath = (params, path) => {
24 if (path === undefined) {
25 return path;
26 }
27 let mergedPath = (path || '').replace(/^\//, '');
28 Object.keys(params).forEach(key => {
29 mergedPath = mergedPath.replace(`:${key}`, params[key]);
30 });
31 return mergedPath;
32};
33const Breadcrumb = props => {
34 const {
35 prefixCls: customizePrefixCls,
36 separator = '/',
37 style,
38 className,
39 rootClassName,
40 routes: legacyRoutes,
41 items,
42 children,
43 itemRender,
44 params = {}
45 } = props,
46 restProps = __rest(props, ["prefixCls", "separator", "style", "className", "rootClassName", "routes", "items", "children", "itemRender", "params"]);
47 const {
48 getPrefixCls,
49 direction,
50 breadcrumb
51 } = React.useContext(ConfigContext);
52 let crumbs;
53 const prefixCls = getPrefixCls('breadcrumb', customizePrefixCls);
54 const [wrapCSSVar, hashId, cssVarCls] = useStyle(prefixCls);
55 const mergedItems = useItems(items, legacyRoutes);
56 if (process.env.NODE_ENV !== 'production') {
57 const warning = devUseWarning('Breadcrumb');
58 warning.deprecated(!legacyRoutes, 'routes', 'items');
59 // Deprecated warning for breadcrumb children
60 if (!mergedItems || mergedItems.length === 0) {
61 const childList = toArray(children);
62 warning.deprecated(childList.length === 0, 'Breadcrumb.Item and Breadcrumb.Separator', 'items');
63 childList.forEach(element => {
64 if (element) {
65 process.env.NODE_ENV !== "production" ? warning(element.type && (element.type.__ANT_BREADCRUMB_ITEM === true || element.type.__ANT_BREADCRUMB_SEPARATOR === true), 'usage', "Only accepts Breadcrumb.Item and Breadcrumb.Separator as it's children") : void 0;
66 }
67 });
68 }
69 }
70 const mergedItemRender = useItemRender(prefixCls, itemRender);
71 if (mergedItems && mergedItems.length > 0) {
72 // generated by route
73 const paths = [];
74 const itemRenderRoutes = items || legacyRoutes;
75 crumbs = mergedItems.map((item, index) => {
76 const {
77 path,
78 key,
79 type,
80 menu,
81 overlay,
82 onClick,
83 className: itemClassName,
84 separator: itemSeparator,
85 dropdownProps
86 } = item;
87 const mergedPath = getPath(params, path);
88 if (mergedPath !== undefined) {
89 paths.push(mergedPath);
90 }
91 const mergedKey = key !== null && key !== void 0 ? key : index;
92 if (type === 'separator') {
93 return /*#__PURE__*/React.createElement(BreadcrumbSeparator, {
94 key: mergedKey
95 }, itemSeparator);
96 }
97 const itemProps = {};
98 const isLastItem = index === mergedItems.length - 1;
99 if (menu) {
100 itemProps.menu = menu;
101 } else if (overlay) {
102 itemProps.overlay = overlay;
103 }
104 let {
105 href
106 } = item;
107 if (paths.length && mergedPath !== undefined) {
108 href = `#/${paths.join('/')}`;
109 }
110 return /*#__PURE__*/React.createElement(InternalBreadcrumbItem, Object.assign({
111 key: mergedKey
112 }, itemProps, pickAttrs(item, {
113 data: true,
114 aria: true
115 }), {
116 className: itemClassName,
117 dropdownProps: dropdownProps,
118 href: href,
119 separator: isLastItem ? '' : separator,
120 onClick: onClick,
121 prefixCls: prefixCls
122 }), mergedItemRender(item, params, itemRenderRoutes, paths, href));
123 });
124 } else if (children) {
125 const childrenLength = toArray(children).length;
126 crumbs = toArray(children).map((element, index) => {
127 if (!element) {
128 return element;
129 }
130 const isLastItem = index === childrenLength - 1;
131 return cloneElement(element, {
132 separator: isLastItem ? '' : separator,
133 key: index
134 });
135 });
136 }
137 const breadcrumbClassName = classNames(prefixCls, breadcrumb === null || breadcrumb === void 0 ? void 0 : breadcrumb.className, {
138 [`${prefixCls}-rtl`]: direction === 'rtl'
139 }, className, rootClassName, hashId, cssVarCls);
140 const mergedStyle = Object.assign(Object.assign({}, breadcrumb === null || breadcrumb === void 0 ? void 0 : breadcrumb.style), style);
141 return wrapCSSVar(/*#__PURE__*/React.createElement("nav", Object.assign({
142 className: breadcrumbClassName,
143 style: mergedStyle
144 }, restProps), /*#__PURE__*/React.createElement("ol", null, crumbs)));
145};
146Breadcrumb.Item = BreadcrumbItem;
147Breadcrumb.Separator = BreadcrumbSeparator;
148if (process.env.NODE_ENV !== 'production') {
149 Breadcrumb.displayName = 'Breadcrumb';
150}
151export default Breadcrumb;
\No newline at end of file