urlWalker.tsx 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import {memo} from 'react';
  2. import ChevronDividedList from 'sentry/components/replays/walker/chevronDividedList';
  3. import splitCrumbs from 'sentry/components/replays/walker/splitCrumbs';
  4. import {BreadcrumbLevelType, BreadcrumbType, Crumb} from 'sentry/types/breadcrumbs';
  5. import useCrumbHandlers from 'sentry/utils/replays/hooks/useCrumbHandlers';
  6. import type {ReplayRecord} from 'sentry/views/replays/types';
  7. type CrumbProps = {
  8. crumbs: Crumb[];
  9. replayRecord: ReplayRecord;
  10. };
  11. type StringProps = {
  12. urls: string[];
  13. };
  14. export const CrumbWalker = memo(function CrumbWalker({crumbs, replayRecord}: CrumbProps) {
  15. const startTimestampMs = replayRecord.started_at.getTime();
  16. const {handleClick} = useCrumbHandlers(startTimestampMs);
  17. return (
  18. <ChevronDividedList
  19. items={splitCrumbs({
  20. crumbs,
  21. startTimestampMs,
  22. onClick: handleClick,
  23. })}
  24. />
  25. );
  26. });
  27. export const StringWalker = memo(function StringWalker({urls}: StringProps) {
  28. return (
  29. <ChevronDividedList
  30. items={splitCrumbs({
  31. crumbs: urls.map(urlToCrumb),
  32. startTimestampMs: 0,
  33. onClick: null,
  34. })}
  35. />
  36. );
  37. });
  38. function urlToCrumb(url: string): Crumb {
  39. return {
  40. type: BreadcrumbType.NAVIGATION,
  41. category: BreadcrumbType.NAVIGATION,
  42. level: BreadcrumbLevelType.INFO,
  43. description: 'Navigation',
  44. id: 0,
  45. color: 'green300',
  46. timestamp: undefined,
  47. data: {to: url},
  48. };
  49. }