import { isElement } from 'react-is'; import cn from 'classnames'; import { Children } from 'react'; import isNil from '../utils/isNil'; import noop from '../utils/noop'; import LazyMount from '../utils/component/LazyMount'; import TabPanel from './components/TabPanel'; import { IInnerTab, ITabsProps, ITabPanelProps, TabType, ITabsNavProps, ITab, } from './types'; import NormalTabsNav from './components/tabs-nav/NormalTabsNav'; import CardTabsNav from './components/tabs-nav/CardTabsNav'; import ButtonTabsNav from './components/tabs-nav/ButtonTabsNav'; import BaseTabs from './components/base/BaseTabs'; import { getTabDataFromChild } from './utils'; const TabsNavComponents: { [type in TabType]?: React.ComponentType>; } = { normal: NormalTabsNav, card: CardTabsNav, button: ButtonTabsNav, }; type ITabsInnerProps = Required< ITabsProps >; export class Tabs extends BaseTabs< Id, IInnerTab, ITabPanelProps, ITabsProps > { static TabPanel = TabPanel; static defaultProps: Partial> = { type: 'normal', activeId: '', candel: false, canFixed: false, stretch: false, onChange: noop, onDelete: noop, unmountPanelOnHide: false, }; get tabsCls() { const { className, type } = this.props; return cn('zent-tabs', `zent-tabs-type__${type}`, className); } getTabDataListFromTabs( tabs: NonNullable>> ): Array> { const { activeId } = this.props; return tabs.map>(tab => ({ ...tab, actived: tab.key === activeId, })); } getTabDataListFromChildren( children: NonNullable['children']> ): Array> { const { activeId } = this.props; return Children.map( children, ( child: React.ReactElement>> ) => { if (!isElement(child)) { return null; } return getTabDataFromChild(child, activeId); } ).filter(v => !isNil(v)); } renderNav(tabDataList: Array>) { const { type, candel, canFixed, fixedIds, onFixedChange, stretch, navExtraContent, onChange, onDelete, onAdd, overflowMode, activeId, renderTabBar, } = this.props as ITabsInnerProps; const TabsNavComp = (TabsNavComponents[type] || TabsNavComponents['normal']) as React.ComponentClass>; const tabNavProps: ITabsNavProps = { onChange, tabDataList, onDelete, onAdd, candel, canFixed, stretch, overflowMode, navExtraContent, type, activeId, onFixedChange, }; if ('fixedIds' in this.props) { tabNavProps.fixedIds = fixedIds; } if (renderTabBar) { return renderTabBar(tabNavProps, TabsNavComp); } return ; } renderTabPanel(tabItem: IInnerTab) { const { unmountPanelOnHide, disableLazyMount } = this.props; return ( {tabItem.panelChildren} ); } } export default Tabs;