import * as React from 'react'; import ScrollableInkTabBar from 'rc-tabs/lib/ScrollableInkTabBar'; import classNames from 'classnames'; import UpOutlined from '@ant-design/icons/UpOutlined'; import LeftOutlined from '@ant-design/icons/LeftOutlined'; import DownOutlined from '@ant-design/icons/DownOutlined'; import RightOutlined from '@ant-design/icons/RightOutlined'; import { TabsProps } from './index'; import { ConfigConsumerProps, ConfigConsumer } from '../config-provider'; export default class TabBar extends React.Component { static defaultProps = { animated: true, type: 'line' as TabsProps['type'], }; renderTabBar = ({ direction }: ConfigConsumerProps) => { const { tabBarStyle, animated, renderTabBar, tabBarExtraContent, tabPosition, prefixCls, className, size, type, } = this.props; const inkBarAnimated = typeof animated === 'object' ? animated.inkBar : animated; const isVertical = tabPosition === 'left' || tabPosition === 'right'; let prevIconComponent = isVertical ? UpOutlined : LeftOutlined; let nextIconComponent = isVertical ? DownOutlined : RightOutlined; if (direction === 'rtl' && !isVertical) { prevIconComponent = RightOutlined; nextIconComponent = LeftOutlined; } const prevIcon = ( {React.createElement(prevIconComponent, { className: `${prefixCls}-tab-prev-icon-target`, })} ); const nextIcon = ( {React.createElement(nextIconComponent, { className: `${prefixCls}-tab-next-icon-target`, })} ); // Additional className for style usage const cls: string = classNames( `${prefixCls}-${tabPosition}-bar`, { [`${prefixCls}-${size}-bar`]: !!size, [`${prefixCls}-card-bar`]: type && type.indexOf('card') >= 0, }, className, ); const renderProps = { ...this.props, children: null, inkBarAnimated, extraContent: tabBarExtraContent, style: tabBarStyle, prevIcon, nextIcon, className: cls, }; let RenderTabBar: React.ReactElement; if (renderTabBar) { RenderTabBar = renderTabBar(renderProps, ScrollableInkTabBar); } else { RenderTabBar = ; } return React.cloneElement(RenderTabBar); }; render() { return {this.renderTabBar}; } }