stackTrace.tsx 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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 {Group, Project} from 'sentry/types';
  8. import {Event} from 'sentry/types/event';
  9. import {STACK_TYPE, STACK_VIEW} from 'sentry/types/stacktrace';
  10. import NoStackTraceMessage from './noStackTraceMessage';
  11. import {isStacktraceNewestFirst} from './utils';
  12. type CrashContentProps = React.ComponentProps<typeof CrashContent>;
  13. type Props = Pick<
  14. CrashContentProps,
  15. 'groupingCurrentLevel' | 'hasHierarchicalGrouping'
  16. > & {
  17. data: NonNullable<CrashContentProps['stacktrace']>;
  18. event: Event;
  19. projectId: Project['id'];
  20. type: string;
  21. groupingCurrentLevel?: Group['metadata']['current_level'];
  22. hideGuide?: boolean;
  23. };
  24. function StacktraceInterface({
  25. hideGuide = false,
  26. projectId,
  27. event,
  28. data,
  29. type,
  30. hasHierarchicalGrouping,
  31. groupingCurrentLevel,
  32. }: Props) {
  33. const [stackView, setStackView] = useState<STACK_VIEW>(
  34. data.hasSystemFrames ? STACK_VIEW.APP : STACK_VIEW.FULL
  35. );
  36. const [newestFirst, setNewestFirst] = useState(isStacktraceNewestFirst());
  37. const stackTraceNotFound = !(data.frames ?? []).length;
  38. return (
  39. <EventDataSection
  40. type={type}
  41. title={
  42. <CrashTitle
  43. title={t('Stack Trace')}
  44. hideGuide={hideGuide}
  45. newestFirst={newestFirst}
  46. onChange={
  47. !stackTraceNotFound ? value => setNewestFirst(value.newestFirst) : undefined
  48. }
  49. />
  50. }
  51. actions={
  52. !stackTraceNotFound && (
  53. <CrashActions
  54. stackView={stackView}
  55. platform={event.platform}
  56. stacktrace={data}
  57. hasHierarchicalGrouping={hasHierarchicalGrouping}
  58. onChange={value => setStackView(value.stackView ?? stackView)}
  59. />
  60. )
  61. }
  62. wrapTitle={false}
  63. >
  64. {stackTraceNotFound ? (
  65. <NoStackTraceMessage />
  66. ) : (
  67. <CrashContent
  68. projectId={projectId}
  69. event={event}
  70. stackView={stackView}
  71. newestFirst={newestFirst}
  72. stacktrace={data}
  73. stackType={STACK_TYPE.ORIGINAL}
  74. groupingCurrentLevel={groupingCurrentLevel}
  75. hasHierarchicalGrouping={hasHierarchicalGrouping}
  76. />
  77. )}
  78. </EventDataSection>
  79. );
  80. }
  81. export default StacktraceInterface;