sharedGroupHeader.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import styled from '@emotion/styled';
  2. import {FeatureBadge} from 'sentry/components/core/badge/featureBadge';
  3. import {DateTime} from 'sentry/components/dateTime';
  4. import EventMessage from 'sentry/components/events/eventMessage';
  5. import ProjectBadge from 'sentry/components/idBadge/projectBadge';
  6. import ShortId from 'sentry/components/shortId';
  7. import {Tooltip} from 'sentry/components/tooltip';
  8. import {t} from 'sentry/locale';
  9. import {space} from 'sentry/styles/space';
  10. import type {Group} from 'sentry/types/group';
  11. import {IssueCategory} from 'sentry/types/group';
  12. import EventCreatedTooltip from 'sentry/views/issueDetails/eventCreatedTooltip';
  13. type Props = {
  14. group: Group;
  15. };
  16. function SharedGroupHeader({group}: Props) {
  17. const date = new Date(
  18. (group.latestEvent?.dateCreated ?? group.latestEvent?.dateReceived) as string
  19. );
  20. const event = group.latestEvent;
  21. return (
  22. <Wrapper>
  23. <Details>
  24. <TitleWrap>
  25. <Title>{group.title}</Title>
  26. <ShortIdWrapper>
  27. <ShortId
  28. shortId={group.shortId}
  29. avatar={<ProjectBadge project={group.project} avatarSize={20} hideName />}
  30. />
  31. {group.issueCategory === IssueCategory.PERFORMANCE && (
  32. <FeatureBadge
  33. type="beta"
  34. tooltipProps={{
  35. title: t(
  36. 'Not all features have been implemented for shared Performance Issues and these issues may be missing context.'
  37. ),
  38. }}
  39. />
  40. )}
  41. </ShortIdWrapper>
  42. {event && (event.dateCreated ?? event.dateReceived) && (
  43. <TimeStamp data-test-id="sgh-timestamp">
  44. {t('Last seen ')}
  45. <EventTimeLabel>
  46. <Tooltip
  47. isHoverable
  48. showUnderline
  49. title={<EventCreatedTooltip event={event} />}
  50. overlayStyle={{maxWidth: 300}}
  51. >
  52. <DateTime date={date} />
  53. </Tooltip>
  54. </EventTimeLabel>
  55. </TimeStamp>
  56. )}
  57. </TitleWrap>
  58. <EventMessage
  59. showUnhandled={group.isUnhandled}
  60. message={group.culprit}
  61. level={group.level}
  62. type={group.type}
  63. data={group}
  64. />
  65. </Details>
  66. </Wrapper>
  67. );
  68. }
  69. export default SharedGroupHeader;
  70. const Wrapper = styled('div')`
  71. padding: ${space(3)} ${space(4)} ${space(3)} ${space(4)};
  72. border-bottom: 1px solid ${p => p.theme.border};
  73. position: relative;
  74. `;
  75. const Details = styled('div')`
  76. max-width: 960px;
  77. margin: 0 auto;
  78. `;
  79. const ShortIdWrapper = styled('div')`
  80. display: flex;
  81. `;
  82. const TitleWrap = styled('div')`
  83. display: grid;
  84. grid-template-columns: 1fr max-content;
  85. align-items: center;
  86. margin-bottom: ${space(1)};
  87. `;
  88. const Title = styled('h3')`
  89. color: ${p => p.theme.headingColor};
  90. font-size: ${p => p.theme.fontSizeExtraLarge};
  91. line-height: ${p => p.theme.text.lineHeightHeading};
  92. margin-right: ${space(2)};
  93. margin-bottom: 0;
  94. ${p => p.theme.overflowEllipsis};
  95. @media (min-width: ${props => props.theme.breakpoints.small}) {
  96. font-size: ${p => p.theme.headerFontSize};
  97. }
  98. `;
  99. const TimeStamp = styled('div')`
  100. color: ${p => p.theme.headingColor};
  101. font-size: ${p => p.theme.fontSizeMedium};
  102. line-height: ${p => p.theme.text.lineHeightHeading};
  103. margin-top: ${space(0.25)};
  104. `;
  105. const EventTimeLabel = styled('span')`
  106. color: ${p => p.theme.subText};
  107. margin-left: ${space(0.25)};
  108. `;