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, GroupActivitySetByResolvedInNextSemverRelease, GroupActivitySetByResolvedInRelease, GroupActivityType, Repository, ResolvedStatusDetails, } from 'sentry/types'; type Props = { projectId: string; // TODO(ts): This should be a union type `IgnoredStatusDetails | ResolvedStatusDetails` statusDetails: ResolvedStatusDetails; activities?: GroupActivity[]; }; function renderReason( statusDetails: ResolvedStatusDetails, projectId: string, activities: GroupActivity[] ) { const actor = statusDetails.actor ? ( {statusDetails.actor.name} ) : null; const relevantActivity = activities.find( activity => activity.type === GroupActivityType.SET_RESOLVED_IN_RELEASE ) as | GroupActivitySetByResolvedInRelease | GroupActivitySetByResolvedInNextSemverRelease | undefined; if (statusDetails.inNextRelease) { // Resolved in next release has current_release_version (semver only) if (relevantActivity && 'current_release_version' in relevantActivity.data) { const version = ( ); return statusDetails.actor ? tct( '[actor] marked this issue as resolved in versions greater than [version].', { actor, version, } ) : tct( 'This issue has been marked as resolved in versions greater than [version].', {version} ); } return actor ? tct('[actor] marked this issue as resolved in the upcoming release.', { actor, }) : t('This issue has been marked as resolved in the upcoming release.'); } if (statusDetails.inRelease) { const version = ( ); return actor ? tct('[actor] marked this issue as resolved in version [version].', { actor, version, }) : tct('This issue has been marked as resolved in version [version].', {version}); } if (statusDetails.inCommit) { return tct('This issue has been marked as resolved by [commit]', { commit: ( {statusDetails.inCommit.dateCreated && ( )} ), }); } return t('This issue has been marked as resolved.'); } function ResolutionBox({statusDetails, projectId, activities = []}: Props) { return ( {renderReason(statusDetails, projectId, activities)} ); } 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;