richHttpContentClippedBoxKeyValueList.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import ClippedBox from 'sentry/components/clippedBox';
  2. import ErrorBoundary from 'sentry/components/errorBoundary';
  3. import KeyValueList from 'sentry/components/events/interfaces/keyValueList';
  4. import {Meta} from 'sentry/types';
  5. import {EntryRequest} from 'sentry/types/event';
  6. import getTransformedData from './getTransformedData';
  7. type Data = EntryRequest['data']['data'];
  8. type Props = {
  9. data: Data;
  10. title: string;
  11. defaultCollapsed?: boolean;
  12. isContextData?: boolean;
  13. meta?: Meta;
  14. };
  15. const RichHttpContentClippedBoxKeyValueList = ({
  16. data,
  17. title,
  18. defaultCollapsed = false,
  19. isContextData = false,
  20. meta,
  21. }: Props) => {
  22. const getContent = (transformedData: Array<[string, string]>) => {
  23. // Sentry API abbreviates long query string values, sometimes resulting in
  24. // an un-parsable querystring ... stay safe kids
  25. try {
  26. return (
  27. <KeyValueList
  28. data={transformedData.map(([key, value]) => ({
  29. key,
  30. subject: key,
  31. value,
  32. meta,
  33. }))}
  34. isContextData={isContextData}
  35. />
  36. );
  37. } catch {
  38. return <pre>{data}</pre>;
  39. }
  40. };
  41. const transformedData = getTransformedData(data);
  42. if (!transformedData.length) {
  43. return null;
  44. }
  45. return (
  46. <ClippedBox title={title} defaultClipped={defaultCollapsed}>
  47. <ErrorBoundary mini>{getContent(transformedData)}</ErrorBoundary>
  48. </ClippedBox>
  49. );
  50. };
  51. export default RichHttpContentClippedBoxKeyValueList;