sampleDrawerHeaderTransaction.tsx 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import {Link} from 'react-router-dom';
  2. import styled from '@emotion/styled';
  3. import * as qs from 'query-string';
  4. import ProjectAvatar from 'sentry/components/avatar/projectAvatar';
  5. import {space} from 'sentry/styles/space';
  6. import type {Project} from 'sentry/types/project';
  7. import useOrganization from 'sentry/utils/useOrganization';
  8. import {getTransactionSummaryBaseUrl} from 'sentry/views/performance/transactionSummary/utils';
  9. import {useDomainViewFilters} from '../../pages/useFilters';
  10. interface SampleDrawerHeaderProps {
  11. transaction: string;
  12. project?: Project;
  13. subtitle?: string;
  14. transactionMethod?: string;
  15. }
  16. export function SampleDrawerHeaderTransaction(props: SampleDrawerHeaderProps) {
  17. const organization = useOrganization();
  18. const {project, subtitle, transaction, transactionMethod} = props;
  19. const {view} = useDomainViewFilters();
  20. const label =
  21. transaction && transactionMethod && !transaction.startsWith(transactionMethod)
  22. ? `${transactionMethod} ${transaction}`
  23. : transaction;
  24. return (
  25. <Bar>
  26. {project && (
  27. <ProjectAvatar
  28. project={project}
  29. direction="left"
  30. size={16}
  31. hasTooltip
  32. tooltip={project.slug}
  33. />
  34. )}
  35. {subtitle ? (
  36. <Deemphasize>
  37. {subtitle}
  38. {DELIMITER}
  39. </Deemphasize>
  40. ) : null}
  41. {project ? (
  42. <TruncatedLink
  43. to={{
  44. pathname: getTransactionSummaryBaseUrl(organization, view),
  45. search: qs.stringify({
  46. project: project.slug,
  47. transaction,
  48. }),
  49. }}
  50. >
  51. {label}
  52. </TruncatedLink>
  53. ) : (
  54. <TruncatedSpan>{label}</TruncatedSpan>
  55. )}
  56. </Bar>
  57. );
  58. }
  59. const DELIMITER = ':';
  60. const Bar = styled('h4')`
  61. display: flex;
  62. align-items: center;
  63. gap: ${space(1)};
  64. padding: 0;
  65. margin: 0;
  66. font-size: ${p => p.theme.fontSizeMedium};
  67. font-weight: ${p => p.theme.fontWeightNormal};
  68. overflow: hidden;
  69. `;
  70. const Deemphasize = styled('span')`
  71. color: ${p => p.theme.gray300};
  72. `;
  73. const TruncatedLink = styled(Link)`
  74. ${p => p.theme.overflowEllipsis}
  75. `;
  76. const TruncatedSpan = styled('span')`
  77. ${p => p.theme.overflowEllipsis}
  78. `;