viewIssueLink.tsx 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import styled from '@emotion/styled';
  2. import {Hovercard} from 'sentry/components/hovercard';
  3. import ProjectBadge from 'sentry/components/idBadge/projectBadge';
  4. import Link from 'sentry/components/links/link';
  5. import ShortId from 'sentry/components/shortId';
  6. import {t} from 'sentry/locale';
  7. import space from 'sentry/styles/space';
  8. import {BreadcrumbTypeDefault, Crumb} from 'sentry/types/breadcrumbs';
  9. import useOrganization from 'sentry/utils/useOrganization';
  10. import {breadcrumbHasIssue} from 'sentry/views/replays/detail/console/utils';
  11. type Props = {
  12. breadcrumb: Extract<Crumb, BreadcrumbTypeDefault>;
  13. };
  14. function ViewIssueLink({breadcrumb}: Props) {
  15. const organization = useOrganization();
  16. if (!breadcrumbHasIssue(breadcrumb)) {
  17. return null;
  18. }
  19. const {project: projectSlug, groupId, groupShortId, eventId} = breadcrumb.data || {};
  20. const to = {
  21. pathname: `/organizations/${organization.slug}/issues/${groupId}/events/${eventId}/?referrer=replay-console`,
  22. };
  23. return (
  24. <StyledHovercard
  25. body={
  26. <ShortIdBreadrcumb>
  27. <ProjectBadge
  28. project={{slug: projectSlug}}
  29. avatarSize={16}
  30. hideName
  31. avatarProps={{tooltip: projectSlug}}
  32. />
  33. <ShortId to={to} shortId={groupShortId} />
  34. </ShortIdBreadrcumb>
  35. }
  36. >
  37. <Link to={to}>{t('View Details')}</Link>
  38. </StyledHovercard>
  39. );
  40. }
  41. const ShortIdBreadrcumb = styled('div')`
  42. display: flex;
  43. gap: ${space(1)};
  44. align-items: center;
  45. `;
  46. const StyledHovercard = styled(
  47. ({children, bodyClassName, ...props}: React.ComponentProps<typeof Hovercard>) => (
  48. <Hovercard bodyClassName={bodyClassName || '' + ' view-issue-hovercard'} {...props}>
  49. {children}
  50. </Hovercard>
  51. )
  52. )`
  53. width: auto;
  54. .view-issue-hovercard {
  55. padding: ${space(0.75)} ${space(1.5)};
  56. }
  57. `;
  58. export default ViewIssueLink;