traceRootNode.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import {Fragment} from 'react';
  2. import {t} from 'sentry/locale';
  3. import {isTraceNode} from '../traceGuards';
  4. import {TraceIcons} from '../traceIcons';
  5. import type {TraceTree} from '../traceModels/traceTree';
  6. import type {TraceTreeNode} from '../traceModels/traceTreeNode';
  7. import {makeTraceNodeBarColor, TraceBar} from '../traceRow/traceBar';
  8. import {
  9. maybeFocusTraceRow,
  10. TRACE_COUNT_FORMATTER,
  11. TraceChildrenButton,
  12. TraceRowConnectors,
  13. type TraceRowProps,
  14. } from '../traceRow/traceRow';
  15. import {useHasTraceNewUi} from '../useHasTraceNewUi';
  16. const NO_ERRORS = new Set<TraceTree.TraceError>();
  17. const NO_PERFORMANCE_ISSUES = new Set<TraceTree.TracePerformanceIssue>();
  18. const NO_PROFILES = [];
  19. export function TraceRootRow(props: TraceRowProps<TraceTreeNode<TraceTree.Trace>>) {
  20. const hasTraceNewUi = useHasTraceNewUi();
  21. if (!isTraceNode(props.node)) {
  22. throw new Error('Trace row rendered called on row that is not root');
  23. }
  24. return (
  25. <div
  26. key={props.index}
  27. ref={r =>
  28. props.tabIndex === 0
  29. ? maybeFocusTraceRow(r, props.node, props.previouslyFocusedNodeRef)
  30. : null
  31. }
  32. tabIndex={props.tabIndex}
  33. className={`TraceRow ${props.rowSearchClassName} ${props.node.hasErrors ? props.node.maxIssueSeverity : ''}`}
  34. onPointerDown={props.onRowClick}
  35. onKeyDown={props.onRowKeyDown}
  36. style={props.style}
  37. >
  38. <div
  39. className="TraceLeftColumn"
  40. ref={props.registerListColumnRef}
  41. onDoubleClick={props.onRowDoubleClick}
  42. >
  43. <div className="TraceLeftColumnInner" style={props.listColumnStyle}>
  44. {' '}
  45. <div className="TraceChildrenCountWrapper Root">
  46. <TraceRowConnectors node={props.node} manager={props.manager} />
  47. {props.node.children.length > 0 || props.node.canFetch ? (
  48. <TraceChildrenButton
  49. icon={''}
  50. status={props.node.fetchStatus}
  51. expanded
  52. onClick={() => void 0}
  53. onDoubleClick={props.onExpandDoubleClick}
  54. >
  55. {props.node.fetchStatus === 'loading'
  56. ? null
  57. : props.node.children.length > 0
  58. ? TRACE_COUNT_FORMATTER.format(props.node.children.length)
  59. : null}
  60. </TraceChildrenButton>
  61. ) : null}
  62. </div>
  63. <span className="TraceOperation">{t('Trace')}</span>
  64. {props.trace_id ? (
  65. <Fragment>
  66. <strong className="TraceEmDash"> — </strong>
  67. <span className="TraceDescription">{props.trace_id}</span>
  68. </Fragment>
  69. ) : null}
  70. </div>
  71. </div>
  72. <div
  73. ref={props.registerSpanColumnRef}
  74. className={props.spanColumnClassName}
  75. onDoubleClick={props.onRowDoubleClick}
  76. >
  77. {!hasTraceNewUi && (
  78. <Fragment>
  79. <TraceBar
  80. node={props.node}
  81. virtualized_index={props.virtualized_index}
  82. manager={props.manager}
  83. color={makeTraceNodeBarColor(props.theme, props.node)}
  84. node_space={props.node.space}
  85. errors={NO_ERRORS}
  86. performance_issues={NO_PERFORMANCE_ISSUES}
  87. profiles={NO_PROFILES}
  88. />
  89. <button
  90. ref={props.registerSpanArrowRef}
  91. className="TraceArrow"
  92. onClick={props.onSpanArrowClick}
  93. >
  94. <TraceIcons.Chevron direction="left" />
  95. </button>
  96. </Fragment>
  97. )}
  98. </div>
  99. </div>
  100. );
  101. }