releaseActivityItems.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import styled from '@emotion/styled';
  2. import EventOrGroupExtraDetails from 'sentry/components/eventOrGroupExtraDetails';
  3. import EventOrGroupHeader from 'sentry/components/eventOrGroupHeader';
  4. import TimeSince from 'sentry/components/timeSince';
  5. import {IconExclamation, IconSentry} from 'sentry/icons';
  6. import {t} from 'sentry/locale';
  7. import space from 'sentry/styles/space';
  8. import useOrganization from 'sentry/utils/useOrganization';
  9. import {ReleaseActivityRow} from './releaseActivityRow';
  10. import {
  11. ReleaseActivity,
  12. ReleaseActivityDeployed,
  13. ReleaseActivityIssue,
  14. ReleaseActivityType,
  15. } from './types';
  16. function ReleaseActivityStartStop(props: ReleaseActivityItemProps) {
  17. const isFinished = props.activity.type === ReleaseActivityType.FINISHED;
  18. return (
  19. <ReleaseActivityRow
  20. icon={<StyledIconSentry color="white" size="lg" />}
  21. iconColor="gray500"
  22. hideConnector={isFinished}
  23. >
  24. <div>
  25. {isFinished
  26. ? t('Release has been deployed for an hour and is no longer active')
  27. : t('Release Created')}
  28. </div>
  29. <DateContainer>
  30. <TimeSince date={props.activity.dateAdded} />
  31. </DateContainer>
  32. </ReleaseActivityRow>
  33. );
  34. }
  35. export function ReleaseActivityWaiting() {
  36. return (
  37. <ReleaseActivityRow
  38. icon={<StyledIconSentry color="white" size="lg" />}
  39. iconColor="gray500"
  40. hideConnector
  41. >
  42. <WaitingContainer>{t('Waiting for issues in this release...')}</WaitingContainer>
  43. </ReleaseActivityRow>
  44. );
  45. }
  46. interface ReleaseActivityDeployProps {
  47. activity: ReleaseActivityDeployed;
  48. }
  49. function ReleaseActivityDeploy(props: ReleaseActivityDeployProps) {
  50. return (
  51. <ReleaseActivityRow
  52. icon={<StyledIconSentry color="white" size="lg" />}
  53. iconColor="gray500"
  54. >
  55. <div>{t('Deployed to %s', props.activity.data.environment)}</div>
  56. <DateContainer>
  57. <TimeSince date={props.activity.dateAdded} />
  58. </DateContainer>
  59. </ReleaseActivityRow>
  60. );
  61. }
  62. interface ReleaseIssueActivityProps {
  63. activity: ReleaseActivityIssue;
  64. }
  65. function ReleaseIssueActivity(props: ReleaseIssueActivityProps) {
  66. const org = useOrganization();
  67. const group = props.activity.data.group;
  68. return (
  69. <ReleaseActivityRow
  70. icon={<IconExclamation color="white" size="lg" />}
  71. iconColor="yellow300"
  72. >
  73. <GroupSummary>
  74. <EventOrGroupHeader
  75. organization={org}
  76. data={group}
  77. query=""
  78. size="normal"
  79. includeLink
  80. hideLevel
  81. />
  82. <EventOrGroupExtraDetails data={group} showInboxTime={false} />
  83. </GroupSummary>
  84. </ReleaseActivityRow>
  85. );
  86. }
  87. interface ReleaseActivityItemProps {
  88. activity: ReleaseActivity;
  89. }
  90. export function ReleaseActivityItem(props: ReleaseActivityItemProps) {
  91. switch (props.activity.type) {
  92. case ReleaseActivityType.CREATED:
  93. case ReleaseActivityType.FINISHED:
  94. return <ReleaseActivityStartStop activity={props.activity} />;
  95. case ReleaseActivityType.DEPLOYED:
  96. return <ReleaseActivityDeploy activity={props.activity} />;
  97. case ReleaseActivityType.ISSUE:
  98. return <ReleaseIssueActivity activity={props.activity} />;
  99. default:
  100. return null;
  101. }
  102. }
  103. const DateContainer = styled('div')`
  104. color: ${p => p.theme.subText};
  105. font-size: ${p => p.theme.fontSizeMedium};
  106. `;
  107. // Fix sentry icon looking off center
  108. const StyledIconSentry = styled(IconSentry)`
  109. margin-top: -${space(0.5)};
  110. `;
  111. const GroupSummary = styled('div')`
  112. overflow: hidden;
  113. flex: 1;
  114. margin-top: ${space(0.75)};
  115. `;
  116. const WaitingContainer = styled('div')`
  117. padding: ${space(1.5)} 0;
  118. `;