exception.tsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import {useState} from 'react';
  2. import EventDataSection from 'sentry/components/events/eventDataSection';
  3. import CrashContent from 'sentry/components/events/interfaces/crashContent';
  4. import CrashActions from 'sentry/components/events/interfaces/crashHeader/crashActions';
  5. import CrashTitle from 'sentry/components/events/interfaces/crashHeader/crashTitle';
  6. import {t} from 'sentry/locale';
  7. import {ExceptionType, Group} from 'sentry/types';
  8. import {Event} from 'sentry/types/event';
  9. import {STACK_TYPE, STACK_VIEW} from 'sentry/types/stacktrace';
  10. import {defined} from 'sentry/utils';
  11. import {isStacktraceNewestFirst} from './utils';
  12. type Props = {
  13. data: ExceptionType;
  14. event: Event;
  15. hasHierarchicalGrouping: boolean;
  16. projectId: string;
  17. type: string;
  18. groupingCurrentLevel?: Group['metadata']['current_level'];
  19. hideGuide?: boolean;
  20. };
  21. function Exception({
  22. event,
  23. type,
  24. data,
  25. projectId,
  26. hasHierarchicalGrouping,
  27. groupingCurrentLevel,
  28. hideGuide = false,
  29. }: Props) {
  30. const [stackView, setStackView] = useState<STACK_VIEW>(
  31. data.hasSystemFrames ? STACK_VIEW.APP : STACK_VIEW.FULL
  32. );
  33. const [stackType, setStackType] = useState<STACK_TYPE>(STACK_TYPE.ORIGINAL);
  34. const [newestFirst, setNewestFirst] = useState(isStacktraceNewestFirst());
  35. const eventHasThreads = !!event.entries.find(entry => entry.type === 'threads');
  36. /* in case there are threads in the event data, we don't render the
  37. exception block. Instead the exception is contained within the
  38. thread interface. */
  39. if (eventHasThreads) {
  40. return null;
  41. }
  42. function handleChange({
  43. stackView: newStackView,
  44. stackType: newStackType,
  45. newestFirst: newNewestFirst,
  46. }: {
  47. newestFirst?: boolean;
  48. stackType?: STACK_TYPE;
  49. stackView?: STACK_VIEW;
  50. }) {
  51. if (newStackView) {
  52. setStackView(newStackView);
  53. }
  54. if (defined(newNewestFirst)) {
  55. setNewestFirst(newNewestFirst);
  56. }
  57. if (newStackType) {
  58. setStackType(newStackType);
  59. }
  60. }
  61. const commonCrashHeaderProps = {
  62. newestFirst,
  63. hideGuide,
  64. onChange: handleChange,
  65. };
  66. return (
  67. <EventDataSection
  68. type={type}
  69. title={<CrashTitle title={t('Exception')} {...commonCrashHeaderProps} />}
  70. actions={
  71. <CrashActions
  72. stackType={stackType}
  73. stackView={stackView}
  74. platform={event.platform}
  75. exception={data}
  76. hasHierarchicalGrouping={hasHierarchicalGrouping}
  77. {...commonCrashHeaderProps}
  78. />
  79. }
  80. wrapTitle={false}
  81. >
  82. <CrashContent
  83. projectId={projectId}
  84. event={event}
  85. stackType={stackType}
  86. stackView={stackView}
  87. newestFirst={newestFirst}
  88. exception={data}
  89. groupingCurrentLevel={groupingCurrentLevel}
  90. hasHierarchicalGrouping={hasHierarchicalGrouping}
  91. />
  92. </EventDataSection>
  93. );
  94. }
  95. export default Exception;