focusArea.tsx 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import {useMemo} from 'react';
  2. import Placeholder from 'sentry/components/placeholder';
  3. import {useReplayContext} from 'sentry/components/replays/replayContext';
  4. import type {RawCrumb} from 'sentry/types/breadcrumbs';
  5. import {isBreadcrumbTypeDefault} from 'sentry/types/breadcrumbs';
  6. import useActiveReplayTab from 'sentry/utils/replays/hooks/useActiveReplayTab';
  7. import useOrganization from 'sentry/utils/useOrganization';
  8. import Console from './console';
  9. import DomMutations from './domMutations';
  10. import IssueList from './issueList';
  11. import MemoryChart from './memoryChart';
  12. import NetworkList from './networkList';
  13. import Trace from './trace';
  14. type Props = {};
  15. function getBreadcrumbsByCategory(breadcrumbs: RawCrumb[], categories: string[]) {
  16. return breadcrumbs
  17. .filter(isBreadcrumbTypeDefault)
  18. .filter(breadcrumb => categories.includes(breadcrumb.category || ''));
  19. }
  20. function FocusArea({}: Props) {
  21. const {getActiveTab} = useActiveReplayTab();
  22. const {currentTime, currentHoverTime, replay, setCurrentTime, setCurrentHoverTime} =
  23. useReplayContext();
  24. const organization = useOrganization();
  25. // Memoize this because re-renders will interfere with the mouse state of the
  26. // chart (e.g. on mouse over and out)
  27. const memorySpans = useMemo(() => {
  28. return replay?.getRawSpans().filter(replay.isMemorySpan);
  29. }, [replay]);
  30. if (!replay || !memorySpans) {
  31. return <Placeholder height="150px" />;
  32. }
  33. const event = replay.getEvent();
  34. const getNetworkSpans = () => {
  35. return replay.getRawSpans().filter(replay.isNotMemorySpan);
  36. };
  37. switch (getActiveTab()) {
  38. case 'console':
  39. const consoleMessages = getBreadcrumbsByCategory(replay?.getRawCrumbs(), [
  40. 'console',
  41. 'exception',
  42. ]);
  43. return (
  44. <Console
  45. breadcrumbs={consoleMessages ?? []}
  46. startTimestamp={event?.startTimestamp}
  47. />
  48. );
  49. case 'network':
  50. return <NetworkList event={event} networkSpans={getNetworkSpans()} />;
  51. case 'trace':
  52. return <Trace organization={organization} event={event} />;
  53. case 'issues':
  54. return <IssueList replayId={event.id} projectId={event.projectID} />;
  55. case 'dom':
  56. return <DomMutations replay={replay} />;
  57. case 'memory':
  58. return (
  59. <MemoryChart
  60. currentTime={currentTime}
  61. currentHoverTime={currentHoverTime}
  62. memorySpans={memorySpans}
  63. setCurrentTime={setCurrentTime}
  64. setCurrentHoverTime={setCurrentHoverTime}
  65. startTimestamp={event?.startTimestamp}
  66. />
  67. );
  68. default:
  69. return null;
  70. }
  71. }
  72. export default FocusArea;