import {useState} from 'react'; import {EventDataSection} from 'sentry/components/events/eventDataSection'; import KeyValueList from 'sentry/components/events/interfaces/keyValueList'; import {SegmentedControl} from 'sentry/components/segmentedControl'; import {t} from 'sentry/locale'; import {EntryType, Event} from 'sentry/types/event'; import Help, {HelpProps} from './help'; type View = 'report' | 'raw' | 'help'; function getView(view: View, data: Record, meta: Record) { switch (view) { case 'report': return ( { return { key, subject: key, value, meta: meta?.[key]?.[''], }; })} isContextData /> ); case 'raw': return
{JSON.stringify({'csp-report': data}, null, 2)}
; case 'help': return ; default: throw new TypeError(`Invalid view: ${view}`); } } type Props = { data: Record; event: Event; }; export function Csp({data, event}: Props) { const [view, setView] = useState('report'); const entryIndex = event.entries.findIndex(entry => entry.type === EntryType.CSP); const meta = event._meta?.entries?.[entryIndex]?.data; const cleanData = data.original_policy !== 'string' ? data : { ...data, // Hide the report-uri since this is redundant and silly original_policy: data.original_policy.replace(/(;\s+)?report-uri [^;]+/, ''), }; const actions = ( {t('Report')} {t('Raw')} {t('Help')} ); return ( {getView(view, cleanData, meta)} ); }