import React, { ReactNode, useMemo } from 'react' import useTheme from '../use-theme' import BreadcrumbsItem from './breadcrumbs-item' import BreadcrumbsSeparator from './breadcrumbs-separator' import { addColorAlpha } from '../utils/color' import { NormalSizes } from '../utils/prop-types' interface Props { size: NormalSizes separator?: string | ReactNode className?: string } const defaultProps = { size: 'medium' as NormalSizes, separator: '/', className: '' } type NativeAttrs = Omit, keyof Props> export type BreadcrumbsProps = Props & typeof defaultProps & NativeAttrs const getSize = (size: NormalSizes) => { const sizes: { [key in NormalSizes]: string } = { mini: '.75rem', small: '.875rem', medium: '1rem', large: '1.125rem' } return sizes[size] } const Breadcrumbs: React.FC> = ({ size, separator, children, className }) => { const theme = useTheme() const fontSize = useMemo(() => getSize(size), [size]) const hoverColor = useMemo(() => { return addColorAlpha(theme.palette.link, 0.85) }, [theme.palette.link]) const childrenArray = React.Children.toArray(children) const withSeparatorChildren = childrenArray.map((item, index) => { if (!React.isValidElement(item)) return item const last = childrenArray[index - 1] const lastIsSeparator = React.isValidElement(last) && last.type === BreadcrumbsSeparator const currentIsSeparator = item.type === BreadcrumbsSeparator if (!lastIsSeparator && !currentIsSeparator && index > 0) { return ( {separator} {item} ) } return item }) return ( ) } type MemoBreadcrumbsComponent

= React.NamedExoticComponent

& { Item: typeof BreadcrumbsItem Separator: typeof BreadcrumbsSeparator } type ComponentProps = Partial & Omit & NativeAttrs Breadcrumbs.defaultProps = defaultProps export default React.memo(Breadcrumbs) as MemoBreadcrumbsComponent