index.tsx 2.2 KB

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