123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- import {Fragment} from 'react';
- import styled from '@emotion/styled';
- import UserAvatar from 'sentry/components/avatar/userAvatar';
- import CommitLink from 'sentry/components/commitLink';
- import {BannerContainer, BannerSummary} from 'sentry/components/events/styles';
- import TimeSince from 'sentry/components/timeSince';
- import Version from 'sentry/components/version';
- import {IconCheckmark} from 'sentry/icons';
- import {t, tct} from 'sentry/locale';
- import space from 'sentry/styles/space';
- import {
- GroupActivity,
- GroupActivitySetByResolvedInRelease,
- GroupActivityType,
- Repository,
- ResolutionStatusDetails,
- } from 'sentry/types';
- type Props = {
- projectId: string;
- statusDetails: ResolutionStatusDetails;
- activities?: GroupActivity[];
- };
- function renderReason(
- statusDetails: ResolutionStatusDetails,
- projectId: string,
- activities: GroupActivity[]
- ) {
- const actor = statusDetails.actor ? (
- <strong>
- <UserAvatar user={statusDetails.actor} size={20} className="avatar" />
- <span style={{marginLeft: 5}}>{statusDetails.actor.name}</span>
- </strong>
- ) : null;
- const relevantActivity = activities.find(
- activity => activity.type === GroupActivityType.SET_RESOLVED_IN_RELEASE
- ) as GroupActivitySetByResolvedInRelease | undefined;
- const currentReleaseVersion = relevantActivity?.data.current_release_version!;
- if (statusDetails.inNextRelease && statusDetails.actor) {
- return tct('[actor] marked this issue as resolved in the upcoming release.', {
- actor,
- });
- }
- if (statusDetails.inNextRelease) {
- return t('This issue has been marked as resolved in the upcoming release.');
- }
- if (statusDetails.inRelease && statusDetails.actor) {
- return currentReleaseVersion
- ? tct('[actor] marked this issue as resolved in versions greater than [version].', {
- actor,
- version: (
- <Version
- version={currentReleaseVersion}
- projectId={projectId}
- tooltipRawVersion
- />
- ),
- })
- : tct('[actor] marked this issue as resolved in version [version].', {
- actor,
- version: (
- <Version
- version={statusDetails.inRelease}
- projectId={projectId}
- tooltipRawVersion
- />
- ),
- });
- }
- if (statusDetails.inRelease) {
- return currentReleaseVersion
- ? tct(
- 'This issue has been marked as resolved in versions greater than [version].',
- {
- version: (
- <Version
- version={currentReleaseVersion}
- projectId={projectId}
- tooltipRawVersion
- />
- ),
- }
- )
- : tct('This issue has been marked as resolved in version [version].', {
- version: (
- <Version
- version={statusDetails.inRelease}
- projectId={projectId}
- tooltipRawVersion
- />
- ),
- });
- }
- if (statusDetails.inCommit) {
- return tct('This issue has been marked as resolved by [commit]', {
- commit: (
- <Fragment>
- <CommitLink
- commitId={statusDetails.inCommit.id}
- repository={statusDetails.inCommit.repository as Repository}
- />
- {statusDetails.inCommit.dateCreated && (
- <StyledTimeSince date={statusDetails.inCommit.dateCreated} />
- )}
- </Fragment>
- ),
- });
- }
- return t('This issue has been marked as resolved.');
- }
- function ResolutionBox({statusDetails, projectId, activities = []}: Props) {
- return (
- <BannerContainer priority="default">
- <BannerSummary>
- <StyledIconCheckmark color="green300" />
- <span>{renderReason(statusDetails, projectId, activities)}</span>
- </BannerSummary>
- </BannerContainer>
- );
- }
- const StyledTimeSince = styled(TimeSince)`
- color: ${p => p.theme.gray300};
- margin-left: ${space(0.5)};
- font-size: ${p => p.theme.fontSizeSmall};
- `;
- const StyledIconCheckmark = styled(IconCheckmark)`
- /* override margin defined in BannerSummary */
- margin-top: 0 !important;
- align-self: center;
- @media (max-width: ${p => p.theme.breakpoints.small}) {
- margin-top: ${space(0.5)} !important;
- align-self: flex-start;
- }
- `;
- export default ResolutionBox;
|