import Component from '../../common/Component'; import humanTime from '../../common/utils/humanTime'; import ItemList from '../../common/utils/ItemList'; import UserControls from '../utils/UserControls'; import avatar from '../../common/helpers/avatar'; import username from '../../common/helpers/username'; import icon from '../../common/helpers/icon'; import Dropdown from '../../common/components/Dropdown'; import AvatarEditor from './AvatarEditor'; import listItems from '../../common/helpers/listItems'; /** * The `UserCard` component displays a user's profile card. This is used both on * the `UserPage` (in the hero) and in discussions, shown when hovering over a * post author. * * ### Props * * - `user` * - `className` * - `editable` * - `controlsButtonClassName` */ export default class UserCard extends Component { view() { const user = this.props.user; const controls = UserControls.controls(user, this).toArray(); const color = user.color(); const badges = user.badges().toArray(); return (
{controls.length ? Dropdown.component({ children: controls, className: 'UserCard-controls App-primaryControl', menuClassName: 'Dropdown-menu--right', buttonClassName: this.props.controlsButtonClassName, label: app.translator.trans('core.forum.user_controls.button'), icon: 'fas fa-ellipsis-v', }) : ''}

{this.props.editable ? ( [AvatarEditor.component({ user, className: 'UserCard-avatar' }), username(user)] ) : (
{avatar(user)}
{username(user)}
)}

{badges.length ?
    {listItems(badges)}
: ''}
    {listItems(this.infoItems().toArray())}
); } /** * Build an item list of tidbits of info to show on this user's profile. * * @return {ItemList} */ infoItems() { const items = new ItemList(); const user = this.props.user; const lastSeenAt = user.lastSeenAt(); if (lastSeenAt) { const online = user.isOnline(); items.add( 'lastSeen', {online ? [icon('fas fa-circle'), ' ', app.translator.trans('core.forum.user.online_text')] : [icon('far fa-clock'), ' ', humanTime(lastSeenAt)]} ); } items.add('joined', app.translator.trans('core.forum.user.joined_date_text', { ago: humanTime(user.joinTime()) })); return items; } }