index.tsx 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import {memo, useState} from 'react';
  2. import ContextBlock from 'sentry/components/events/contexts/contextBlock';
  3. import {EventDataSection} from 'sentry/components/events/eventDataSection';
  4. import {SegmentedControl} from 'sentry/components/segmentedControl';
  5. import {t} from 'sentry/locale';
  6. import {Event} from 'sentry/types/event';
  7. import {defined, objectIsEmpty} from 'sentry/utils';
  8. import {getKnownData} from '../contexts/utils';
  9. import {getEventExtraDataKnownDataDetails} from './getEventExtraDataKnownDataDetails';
  10. import {EventExtraData as TEventExtraData, EventExtraDataType} from './types';
  11. type Props = {
  12. event: Event;
  13. };
  14. export const EventExtraData = memo(
  15. ({event}: Props) => {
  16. const [raw, setRaw] = useState(false);
  17. if (objectIsEmpty(event.context)) {
  18. return null;
  19. }
  20. return (
  21. <EventDataSection
  22. type="extra"
  23. title={t('Additional Data')}
  24. actions={
  25. <SegmentedControl
  26. aria-label={t('View')}
  27. size="xs"
  28. value={raw ? 'raw' : 'formatted'}
  29. onChange={key => setRaw(key === 'raw')}
  30. >
  31. <SegmentedControl.Item key="formatted">
  32. {t('Formatted')}
  33. </SegmentedControl.Item>
  34. <SegmentedControl.Item key="raw">{t('Raw')}</SegmentedControl.Item>
  35. </SegmentedControl>
  36. }
  37. >
  38. {!defined(event.context) ? null : (
  39. <ContextBlock
  40. data={getKnownData<TEventExtraData, EventExtraDataType>({
  41. data: event.context,
  42. knownDataTypes: Object.keys(event.context),
  43. meta: event._meta?.context,
  44. raw,
  45. onGetKnownDataDetails: v => getEventExtraDataKnownDataDetails(v),
  46. })}
  47. raw={raw}
  48. />
  49. )}
  50. </EventDataSection>
  51. );
  52. },
  53. (prevProps: Props, nextProps: Props) => prevProps.event.id === nextProps.event.id
  54. );