urlWalker.tsx 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import {memo, useCallback} from 'react';
  2. import {useReplayContext} from 'sentry/components/replays/replayContext';
  3. import {relativeTimeInMs} from 'sentry/components/replays/utils';
  4. import ChevronDividedList from 'sentry/components/replays/walker/chevronDividedList';
  5. import splitCrumbs from 'sentry/components/replays/walker/splitCrumbs';
  6. import {
  7. BreadcrumbLevelType,
  8. BreadcrumbType,
  9. BreadcrumbTypeNavigation,
  10. Crumb,
  11. } from 'sentry/types/breadcrumbs';
  12. import type {ReplayRecord} from 'sentry/views/replays/types';
  13. type CrumbProps = {
  14. crumbs: Crumb[];
  15. replayRecord: ReplayRecord;
  16. };
  17. type StringProps = {
  18. urls: string[];
  19. };
  20. export const CrumbWalker = memo(function CrumbWalker({crumbs, replayRecord}: CrumbProps) {
  21. const {setCurrentTime} = useReplayContext();
  22. const startTimestampMs = replayRecord.startedAt.getTime();
  23. const handleClick = useCallback(
  24. (crumb: Crumb) => {
  25. crumb.timestamp !== undefined
  26. ? setCurrentTime(relativeTimeInMs(crumb.timestamp, startTimestampMs))
  27. : null;
  28. },
  29. [setCurrentTime, startTimestampMs]
  30. );
  31. const navCrumbs = crumbs.filter(
  32. crumb => crumb.type === BreadcrumbType.NAVIGATION
  33. ) as BreadcrumbTypeNavigation[];
  34. return (
  35. <ChevronDividedList
  36. items={splitCrumbs({
  37. crumbs: navCrumbs,
  38. startTimestampMs,
  39. onClick: handleClick,
  40. })}
  41. />
  42. );
  43. });
  44. export const StringWalker = memo(function StringWalker({urls}: StringProps) {
  45. return (
  46. <ChevronDividedList
  47. items={splitCrumbs({
  48. crumbs: urls.map(urlToCrumb),
  49. startTimestampMs: 0,
  50. onClick: null,
  51. })}
  52. />
  53. );
  54. });
  55. function urlToCrumb(url: string) {
  56. return {
  57. type: BreadcrumbType.NAVIGATION,
  58. category: BreadcrumbType.NAVIGATION,
  59. level: BreadcrumbLevelType.INFO,
  60. description: 'Navigation',
  61. id: 0,
  62. color: 'green300',
  63. timestamp: undefined,
  64. data: {to: url},
  65. } as BreadcrumbTypeNavigation;
  66. }