import ImmutablePropTypes from 'react-immutable-proptypes' import ImmutablePureComponent from 'react-immutable-pure-component' import { debounce } from 'lodash' import classNames from 'classnames/bind' import { openPopover, closePopover } from '../actions/popover' import Badge from './badge' import Icon from './icon' const cx = classNames.bind(_s) const mapDispatchToProps = dispatch => ({ openUserInfoPopover(props) { dispatch(openPopover('USER_INFO', props)) }, closeUserInfoPopover() { dispatch(closePopover()) } }) export default @connect(null, mapDispatchToProps) class DisplayName extends ImmutablePureComponent { static propTypes = { account: ImmutablePropTypes.map.isRequired, openUserInfoPopover: PropTypes.func.isRequired, closeUserInfoPopover: PropTypes.func.isRequired, multiline: PropTypes.bool, small: PropTypes.bool, large: PropTypes.bool, noHover: PropTypes.bool, noUsername: PropTypes.bool, } handleMouseEnter = debounce(() => { console.log("SHOW - USER POPOVER") this.props.openUserInfoPopover({ targetRef: this.node, position: 'top', account: this.props.account, }) }, 1000, { leading: true }) handleMouseLeave = debounce(() => { console.log("HIDE - USER POPOVER") this.props.closeUserInfoPopover() }, 1000, { leading: true }) setRef = (n) => { this.node = n; } render() { const { account, multiline, large, noHover, noUsername, small } = this.props if (!account) return null const containerOptions = { className: cx({ default: 1, maxWidth100PC: 1, alignItemsCenter: !multiline, flexRow: !multiline, cursorPointer: !noHover, }), onMouseEnter: noHover ? undefined : this.handleMouseEnter, onMouseLeave: noHover ? undefined : this.handleMouseLeave, } const displayNameClasses = cx({ text: 1, overflowWrapBreakWord: 1, whiteSpaceNoWrap: 1, fontWeightBold: 1, colorPrimary: 1, mr2: 1, lineHeight125: !small, fontSize14PX: small, fontSize15PX: !large, fontSize24PX: large && !small, }) const usernameClasses = cx({ text: 1, displayFlex: 1, flexNormal: 1, flexShrink1: 1, overflowWrapBreakWord: 1, textOverflowEllipsis: 1, colorSecondary: 1, fontWeightNormal: 1, lineHeight15: multiline, lineHeight125: !multiline, ml5: !multiline, fontSize14PX: small, fontSize15PX: !large, fontSize16PX: large && !small, }) const iconSize = !!large ? '19px' : !!small ? '14px' : '16px' // : todo : return ( <span {...containerOptions} ref={this.setRef}> <div className={[_s.default, _s.flexRow, _s.alignItemsCenter].join(' ')}> <bdi className={[_s.text, _s.whiteSpaceNoWrap, _s.textOverflowEllipsis].join(' ')}> <strong className={displayNameClasses} dangerouslySetInnerHTML={{ __html: account.get('display_name_html') }} /> </bdi> { account.get('is_verified') && <Icon id='verified' width={iconSize} height={iconSize} className={_s.default} title='Verified Account' /> } { /* account.get('is_pro') && <Icon id='verified' width='16px' height='16px' className={_s.default} title='Gab PRO' /> */ } { /* account.get('is_donor') && <Icon id='verified' width='16px' height='16px' className={_s.default} title='Gab Donor' /> */ } { /* account.get('is_investor') && <Icon id='verified' width='16px' height='16px' className={_s.default} title='Gab Investor' /> */ } </div> { !noUsername && <span className={usernameClasses}> @{account.get('acct')} </span> } </span> ) } }