userBadge.tsx 1.9 KB

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