contextSummaryUser.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import styled from '@emotion/styled';
  2. import UserAvatar from 'sentry/components/avatar/userAvatar';
  3. import {removeFilterMaskedEntries} from 'sentry/components/events/interfaces/utils';
  4. import {AnnotatedText} from 'sentry/components/events/meta/annotatedText';
  5. import TextOverflow from 'sentry/components/textOverflow';
  6. import {t} from 'sentry/locale';
  7. import {space} from 'sentry/styles/space';
  8. import {AvatarUser, Meta} from 'sentry/types';
  9. import {EventUser} from 'sentry/types/event';
  10. import {defined} from 'sentry/utils';
  11. import ContextSummaryNoSummary from './contextSummaryNoSummary';
  12. import Item from './item';
  13. import {ContextItemProps} from './types';
  14. type UserTitle = {
  15. value: string;
  16. meta?: Meta;
  17. };
  18. type UserDetails = {
  19. subject: string;
  20. meta?: Meta;
  21. value?: string;
  22. };
  23. type Props = ContextItemProps<EventUser, 'user'>;
  24. export function ContextSummaryUser({data, meta}: Props) {
  25. const user = removeFilterMaskedEntries(data);
  26. if (Object.keys(user).length === 0) {
  27. return <ContextSummaryNoSummary title={t('Unknown User')} />;
  28. }
  29. const renderUserDetails = (key: 'id' | 'username') => {
  30. const userDetails: UserDetails = {
  31. subject: t('Username:'),
  32. value: user.username ?? '',
  33. meta: meta.username?.[''],
  34. };
  35. if (key === 'id') {
  36. userDetails.subject = t('ID:');
  37. userDetails.value = user.id;
  38. userDetails.meta = meta.id?.[''];
  39. }
  40. return (
  41. <TextOverflow isParagraph data-test-id="context-sub-title">
  42. <Subject>{userDetails.subject}</Subject>
  43. <AnnotatedText value={userDetails.value} meta={userDetails.meta} />
  44. </TextOverflow>
  45. );
  46. };
  47. const getUserTitle = (): UserTitle | undefined => {
  48. if (defined(user.email)) {
  49. return {
  50. value: user.email,
  51. meta: meta.email?.[''],
  52. };
  53. }
  54. if (defined(user.ip_address)) {
  55. return {
  56. value: user.ip_address,
  57. meta: meta.ip_address?.[''],
  58. };
  59. }
  60. if (defined(user.id)) {
  61. return {
  62. value: user.id,
  63. meta: meta.id?.[''],
  64. };
  65. }
  66. if (defined(user.username)) {
  67. return {
  68. value: user.username,
  69. meta: meta.username?.[''],
  70. };
  71. }
  72. return undefined;
  73. };
  74. const userTitle = getUserTitle();
  75. if (!userTitle) {
  76. return <ContextSummaryNoSummary title={t('Unknown User')} />;
  77. }
  78. const icon = userTitle ? (
  79. <UserAvatar user={user as AvatarUser} size={32} gravatar={false} />
  80. ) : (
  81. 'unknown'
  82. );
  83. return (
  84. <Item icon={icon}>
  85. {userTitle && (
  86. <h3 data-test-id="user-title">
  87. <AnnotatedText value={userTitle.value} meta={userTitle.meta} />
  88. </h3>
  89. )}
  90. {defined(user.id) && user.id !== userTitle?.value
  91. ? renderUserDetails('id')
  92. : user.username &&
  93. user.username !== userTitle?.value &&
  94. renderUserDetails('username')}
  95. </Item>
  96. );
  97. }
  98. const Subject = styled('strong')`
  99. margin-right: ${space(0.5)};
  100. `;