userBadge.tsx 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import styled from '@emotion/styled';
  2. import UserAvatar from 'sentry/components/avatar/userAvatar';
  3. import space from 'sentry/styles/space';
  4. import {AvatarUser} from 'sentry/types';
  5. type Props = {
  6. avatarSize?: UserAvatar['props']['size'];
  7. className?: string;
  8. displayEmail?: string;
  9. displayName?: React.ReactNode;
  10. hideEmail?: boolean;
  11. user?: AvatarUser;
  12. };
  13. const UserBadge = ({
  14. avatarSize = 24,
  15. hideEmail = false,
  16. displayName,
  17. displayEmail,
  18. user,
  19. className,
  20. }: Props) => {
  21. const title =
  22. displayName ||
  23. (user &&
  24. (user.name ||
  25. user.email ||
  26. user.username ||
  27. user.ipAddress ||
  28. // Because this can be used to render EventUser models, or User *interface*
  29. // objects from serialized Event models. we try both ipAddress and ip_address.
  30. user.ip_address ||
  31. user.id));
  32. return (
  33. <StyledUserBadge className={className}>
  34. <StyledAvatar user={user} size={avatarSize} />
  35. <StyledNameAndEmail>
  36. <StyledName hideEmail={!!hideEmail}>{title}</StyledName>
  37. {!hideEmail && <StyledEmail>{displayEmail || (user && user.email)}</StyledEmail>}
  38. </StyledNameAndEmail>
  39. </StyledUserBadge>
  40. );
  41. };
  42. const StyledUserBadge = styled('div')`
  43. display: flex;
  44. align-items: center;
  45. `;
  46. const StyledNameAndEmail = styled('div')`
  47. flex-shrink: 1;
  48. min-width: 0;
  49. line-height: normal;
  50. `;
  51. const StyledEmail = styled('div')`
  52. font-size: 0.875em;
  53. margin-top: ${space(0.25)};
  54. color: ${p => p.theme.gray300};
  55. ${p => p.theme.overflowEllipsis};
  56. `;
  57. export const StyledName = styled('span')<{hideEmail: boolean}>`
  58. font-weight: ${p => (p.hideEmail ? 'inherit' : 'bold')};
  59. line-height: 1.15em;
  60. ${p => p.theme.overflowEllipsis};
  61. `;
  62. const StyledAvatar = styled(UserAvatar)`
  63. min-width: ${space(3)};
  64. min-height: ${space(3)};
  65. margin-right: ${space(1)};
  66. `;
  67. export default UserBadge;