UNPKG

box-ui-elements-mlh

Version:
129 lines (108 loc) 3.48 kB
/** * @flow * @file Sidebar Additional Tab component * @author Box */ import * as React from 'react'; import classNames from 'classnames'; import { FormattedMessage } from 'react-intl'; import { bdlGray50 } from '../../../styles/variables'; import PlainButton from '../../../components/plain-button/PlainButton'; import IconEllipsis from '../../../icons/general/IconEllipsis'; import AdditionalTabTooltip from './AdditionalTabTooltip'; import AdditionalTabPlaceholder from './AdditionalTabPlaceholder'; import messages from './messages'; import type { AdditionalSidebarTab, AdditionalSidebarTabFtuxData } from '../flowTypes'; import './AdditionalTab.scss'; type Props = { ftuxTooltipData?: AdditionalSidebarTabFtuxData, isLoading: boolean, onImageLoad: () => void, status?: string, } & AdditionalSidebarTab; type State = { isErrored: boolean, }; const BLOCKED_BY_SHEILD = 'BLOCKED_BY_SHIELD_ACCESS_POLICY'; class AdditionalTab extends React.PureComponent<Props, State> { state = { isErrored: false, }; onImageError = () => { this.props.onImageLoad(); this.setState({ isErrored: true }); }; isDisabled() { const { status } = this.props; return status === BLOCKED_BY_SHEILD; } getDisabledReason() { let reason = ''; const { status } = this.props; switch (status) { case BLOCKED_BY_SHEILD: reason = <FormattedMessage {...messages.blockedByShieldAccessPolicy} />; break; default: // noop } return reason; } getTabIcon() { const { id, iconUrl, onImageLoad, title } = this.props; const { isErrored } = this.state; let TabIcon; if (isErrored) { TabIcon = <AdditionalTabPlaceholder isLoading={false} />; } else if (id && id > 0) { TabIcon = ( <img className="bdl-AdditionalTab-icon" src={iconUrl} onError={this.onImageError} onLoad={onImageLoad} alt={title} /> ); } else { TabIcon = <IconEllipsis color={bdlGray50} />; } return TabIcon; } render() { const { callback: callbackFn, id, isLoading, iconUrl, ftuxTooltipData, onImageLoad, title, ...rest } = this.props; const isDisabled = this.isDisabled(); const className = classNames('bdl-AdditionalTab', { 'bdl-is-hidden': isLoading, 'bdl-is-disabled': isDisabled, }); const tooltipText = isDisabled ? this.getDisabledReason() : title; return ( <AdditionalTabTooltip defaultTooltipText={tooltipText} ftuxTooltipData={ftuxTooltipData} isFtuxVisible={!isLoading} > <PlainButton className={className} data-testid="additionaltab" type="button" isDisabled={isDisabled} onClick={() => callbackFn({ id, callbackData: rest })} > {this.getTabIcon()} </PlainButton> </AdditionalTabTooltip> ); } } export default AdditionalTab;