UNPKG

mdc-react

Version:

Material Components for the web implemented in React

108 lines (93 loc) 2.92 kB
import { forwardRef, useRef, useCallback, useImperativeHandle } from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; import { Clone } from '../component'; import Icon from '../icon'; import { tabClassNames as cssClasses } from './constants'; import TabIndicator from './TabIndicator'; const Tab = forwardRef(({ value, icon, label, indicatorIcon, active = false, stacked = false, minWidth = false, minWidthIndicator = false, fade = false, underline = !indicatorIcon, onClick = Function.prototype, element = 'button', component: Element = element, className, children = label, ...props }, ref) => { const rootRef = useRef(); useImperativeHandle(ref, () => rootRef.current); const handleClick = useCallback(() => { onClick(rootRef.current, value); }, [value, onClick]); const classNames = classnames(cssClasses.ROOT, { [cssClasses.ACTIVE]: active, [cssClasses.STACKED]: stacked, [cssClasses.MIN_WIDTH]: minWidth }, className); return ( <Element ref={rootRef} className={classNames} data-value={value} role="tab" aria-selected={active ? 'true' : 'false'} tabIndex={active ? 0 : -1} onClick={handleClick} {...props} > <div className={cssClasses.CONTENT}> {icon && <Clone component={icon} fallback={Icon} className={cssClasses.ICON} /> } {children && <span className={cssClasses.LABEL}>{children}</span> } {minWidthIndicator && <TabIndicator icon={indicatorIcon} active={active} fade={fade} underline={underline} /> } </div> {!minWidthIndicator && <TabIndicator icon={indicatorIcon} active={active} fade={fade} underline={underline} /> } <div className={cssClasses.RIPPLE} /> </Element> ); }); Tab.displayName = 'MDCTab'; Tab.propTypes = { value: PropTypes.any, icon: PropTypes.node, label: PropTypes.node, indicatorIcon: PropTypes.node, active: PropTypes.bool, stacked: PropTypes.bool, minWidth: PropTypes.bool, minWidthIndicator: PropTypes.bool, fade: PropTypes.bool, underline: PropTypes.bool, onActivate: PropTypes.func }; export default Tab;