index.tsx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import UserAvatar from 'sentry/components/avatar/userAvatar';
  2. import ErrorBoundary from 'sentry/components/errorBoundary';
  3. import ContextBlock from 'sentry/components/events/contexts/contextBlock';
  4. import KeyValueList from 'sentry/components/events/interfaces/keyValueList';
  5. import {removeFilterMaskedEntries} from 'sentry/components/events/interfaces/utils';
  6. import {AvatarUser} from 'sentry/types';
  7. import {Event} from 'sentry/types/event';
  8. import {defined} from 'sentry/utils';
  9. import {geKnownData, getUnknownData} from '../utils';
  10. import {getUserKnownDataDetails} from './getUserKnownDataDetails';
  11. export type UserEventContextData = {
  12. data: Record<string, string>;
  13. } & AvatarUser;
  14. type Props = {
  15. data: UserEventContextData;
  16. event: Event;
  17. };
  18. export enum UserKnownDataType {
  19. ID = 'id',
  20. EMAIL = 'email',
  21. USERNAME = 'username',
  22. IP_ADDRESS = 'ip_address',
  23. NAME = 'name',
  24. }
  25. export enum UserIgnoredDataType {
  26. DATA = 'data',
  27. }
  28. export const userKnownDataValues = [
  29. UserKnownDataType.ID,
  30. UserKnownDataType.EMAIL,
  31. UserKnownDataType.USERNAME,
  32. UserKnownDataType.IP_ADDRESS,
  33. UserKnownDataType.NAME,
  34. ];
  35. const userIgnoredDataValues = [UserIgnoredDataType.DATA];
  36. export function UserEventContext({data, event}: Props) {
  37. const meta = event._meta?.user ?? event._meta?.contexts?.user ?? {};
  38. return (
  39. <div className="user-widget">
  40. <div className="pull-left">
  41. <UserAvatar user={removeFilterMaskedEntries(data)} size={48} gravatar={false} />
  42. </div>
  43. <ContextBlock
  44. data={geKnownData<UserEventContextData, UserKnownDataType>({
  45. data,
  46. meta,
  47. knownDataTypes: userKnownDataValues,
  48. onGetKnownDataDetails: v => getUserKnownDataDetails(v),
  49. }).map(v => ({
  50. ...v,
  51. subjectDataTestId: `user-context-${v.key.toLowerCase()}-value`,
  52. }))}
  53. />
  54. <ContextBlock
  55. data={getUnknownData({
  56. allData: data,
  57. knownKeys: [...userKnownDataValues, ...userIgnoredDataValues],
  58. meta,
  59. })}
  60. />
  61. {defined(data?.data) && (
  62. <ErrorBoundary mini>
  63. <KeyValueList
  64. data={Object.entries(data.data).map(([key, value]) => ({
  65. key,
  66. value,
  67. subject: key,
  68. meta: meta[key]?.[''],
  69. }))}
  70. isContextData
  71. />
  72. </ErrorBoundary>
  73. )}
  74. </div>
  75. );
  76. }