index.tsx 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import {useState} from 'react';
  2. import {EventDataSection} from 'sentry/components/events/eventDataSection';
  3. import KeyValueList from 'sentry/components/events/interfaces/keyValueList';
  4. import {SegmentedControl} from 'sentry/components/segmentedControl';
  5. import {t} from 'sentry/locale';
  6. import {EntryType, Event} from 'sentry/types/event';
  7. import Help, {HelpProps} from './help';
  8. type View = 'report' | 'raw' | 'help';
  9. function getView(view: View, data: Record<any, any>, meta: Record<any, any>) {
  10. switch (view) {
  11. case 'report':
  12. return (
  13. <KeyValueList
  14. data={Object.entries(data).map(([key, value]) => {
  15. return {
  16. key,
  17. subject: key,
  18. value,
  19. meta: meta?.[key]?.[''],
  20. };
  21. })}
  22. isContextData
  23. />
  24. );
  25. case 'raw':
  26. return <pre>{JSON.stringify({'csp-report': data}, null, 2)}</pre>;
  27. case 'help':
  28. return <Help data={data as HelpProps['data']} />;
  29. default:
  30. throw new TypeError(`Invalid view: ${view}`);
  31. }
  32. }
  33. type Props = {
  34. data: Record<string, any>;
  35. event: Event;
  36. };
  37. export function Csp({data, event}: Props) {
  38. const [view, setView] = useState<View>('report');
  39. const entryIndex = event.entries.findIndex(entry => entry.type === EntryType.CSP);
  40. const meta = event._meta?.entries?.[entryIndex]?.data;
  41. const cleanData =
  42. data.original_policy !== 'string'
  43. ? data
  44. : {
  45. ...data,
  46. // Hide the report-uri since this is redundant and silly
  47. original_policy: data.original_policy.replace(/(;\s+)?report-uri [^;]+/, ''),
  48. };
  49. const actions = (
  50. <SegmentedControl aria-label={t('View')} size="xs" value={view} onChange={setView}>
  51. <SegmentedControl.Item key="report">{t('Report')}</SegmentedControl.Item>
  52. <SegmentedControl.Item key="raw">{t('Raw')}</SegmentedControl.Item>
  53. <SegmentedControl.Item key="help">{t('Help')}</SegmentedControl.Item>
  54. </SegmentedControl>
  55. );
  56. return (
  57. <EventDataSection type="csp" title={t('CSP Report')} actions={actions}>
  58. {getView(view, cleanData, meta)}
  59. </EventDataSection>
  60. );
  61. }