import styled from '@emotion/styled'; import {space} from 'sentry/styles/space'; import type {AvatarUser} from 'sentry/types/user'; import Link from '../links/link'; import BadgeDisplayName from './badgeDisplayName'; import {BaseBadge, type BaseBadgeProps} from './baseBadge'; export interface UserBadgeProps extends BaseBadgeProps { displayEmail?: React.ReactNode | string; displayName?: React.ReactNode; hideEmail?: boolean; to?: string; user?: AvatarUser; } function UserBadge({ hideEmail = false, displayName, displayEmail, user, to, ...props }: UserBadgeProps) { const title = displayName || (user && (user.name || user.email || user.username || user.ipAddress || // Because this can be used to render EventUser models, or User *interface* // objects from serialized Event models. we try both ipAddress and ip_address. user.ip_address || user.ip || user.id)); const name = {title}; return ( {to ? {name} : name} {!hideEmail && {displayEmail || user?.email}} } user={user} {...props} /> ); } const Name = styled('span')<{hideEmail: boolean}>` font-weight: ${p => (p.hideEmail ? 'inherit' : 'bold')}; line-height: 1.15em; ${p => p.theme.overflowEllipsis}; `; const Email = styled('div')` font-size: 0.875em; margin-top: ${space(0.25)}; color: ${p => p.theme.gray300}; ${p => p.theme.overflowEllipsis}; `; export default UserBadge;