exception.tsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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 {EntryType, 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. groupingCurrentLevel?: Group['metadata']['current_level'];
  18. hideGuide?: boolean;
  19. };
  20. function Exception({
  21. event,
  22. data,
  23. projectId,
  24. hasHierarchicalGrouping,
  25. groupingCurrentLevel,
  26. hideGuide = false,
  27. }: Props) {
  28. const [stackView, setStackView] = useState<STACK_VIEW>(
  29. data.hasSystemFrames ? STACK_VIEW.APP : STACK_VIEW.FULL
  30. );
  31. const [stackType, setStackType] = useState<STACK_TYPE>(STACK_TYPE.ORIGINAL);
  32. const [newestFirst, setNewestFirst] = useState(isStacktraceNewestFirst());
  33. const eventHasThreads = !!event.entries.find(entry => entry.type === 'threads');
  34. /* in case there are threads in the event data, we don't render the
  35. exception block. Instead the exception is contained within the
  36. thread interface. */
  37. if (eventHasThreads) {
  38. return null;
  39. }
  40. function handleChange({
  41. stackView: newStackView,
  42. stackType: newStackType,
  43. newestFirst: newNewestFirst,
  44. }: {
  45. newestFirst?: boolean;
  46. stackType?: STACK_TYPE;
  47. stackView?: STACK_VIEW;
  48. }) {
  49. if (newStackView) {
  50. setStackView(newStackView);
  51. }
  52. if (defined(newNewestFirst)) {
  53. setNewestFirst(newNewestFirst);
  54. }
  55. if (newStackType) {
  56. setStackType(newStackType);
  57. }
  58. }
  59. const commonCrashHeaderProps = {
  60. newestFirst,
  61. hideGuide,
  62. onChange: handleChange,
  63. };
  64. return (
  65. <EventDataSection
  66. type={EntryType.EXCEPTION}
  67. title={<CrashTitle title={t('Stack Trace')} {...commonCrashHeaderProps} />}
  68. actions={
  69. <CrashActions
  70. stackType={stackType}
  71. stackView={stackView}
  72. platform={event.platform}
  73. exception={data}
  74. hasHierarchicalGrouping={hasHierarchicalGrouping}
  75. {...commonCrashHeaderProps}
  76. />
  77. }
  78. wrapTitle={false}
  79. >
  80. <CrashContent
  81. projectId={projectId}
  82. event={event}
  83. stackType={stackType}
  84. stackView={stackView}
  85. newestFirst={newestFirst}
  86. exception={data}
  87. groupingCurrentLevel={groupingCurrentLevel}
  88. hasHierarchicalGrouping={hasHierarchicalGrouping}
  89. />
  90. </EventDataSection>
  91. );
  92. }
  93. export default Exception;