import {css} from '@emotion/react'; import styled from '@emotion/styled'; import {openModal} from 'sentry/actionCreators/modal'; import {Button, LinkButton} from 'sentry/components/button'; import ButtonBar from 'sentry/components/buttonBar'; import {openConfirmModal} from 'sentry/components/confirm'; import CustomCommitsResolutionModal from 'sentry/components/customCommitsResolutionModal'; import CustomResolutionModal from 'sentry/components/customResolutionModal'; import {DropdownMenu, MenuItemProps} from 'sentry/components/dropdownMenu'; import {Tooltip} from 'sentry/components/tooltip'; import {IconChevron, IconReleases} from 'sentry/icons'; import {t} from 'sentry/locale'; import {space} from 'sentry/styles/space'; import { GroupStatus, GroupStatusResolution, GroupSubstatus, Project, ResolvedStatusDetails, } from 'sentry/types'; import {trackAnalytics} from 'sentry/utils/analytics'; import {formatVersion, isSemverRelease} from 'sentry/utils/formatters'; import useOrganization from 'sentry/utils/useOrganization'; function SetupReleasesPrompt() { return (
{t('Resolving is better with Releases')} {t( 'Set up Releases so Sentry can bother you when this problem comes back in a future release.' )}
{t('Set up Releases Now')}
); } export interface ResolveActionsProps { hasRelease: boolean; onUpdate: (data: GroupStatusResolution) => void; confirmLabel?: string; confirmMessage?: React.ReactNode; disableDropdown?: boolean; disabled?: boolean; isAutoResolved?: boolean; isResolved?: boolean; latestRelease?: Project['latestRelease']; multipleProjectsSelected?: boolean; priority?: 'primary'; projectFetchError?: boolean; projectSlug?: string; shouldConfirm?: boolean; size?: 'xs' | 'sm'; } function ResolveActions({ size = 'xs', isResolved = false, isAutoResolved = false, confirmLabel = t('Resolve'), projectSlug, hasRelease, latestRelease, confirmMessage, shouldConfirm, disabled, disableDropdown, priority, projectFetchError, multipleProjectsSelected, onUpdate, }: ResolveActionsProps) { const organization = useOrganization(); function handleCommitResolution(statusDetails: ResolvedStatusDetails) { onUpdate({ status: GroupStatus.RESOLVED, statusDetails, substatus: null, }); } function handleAnotherExistingReleaseResolution(statusDetails: ResolvedStatusDetails) { onUpdate({ status: GroupStatus.RESOLVED, statusDetails, substatus: null, }); trackAnalytics('resolve_issue', { organization, release: 'anotherExisting', }); } function handleCurrentReleaseResolution() { if (hasRelease) { onUpdate({ status: GroupStatus.RESOLVED, statusDetails: { inRelease: latestRelease ? latestRelease.version : 'latest', }, substatus: null, }); } trackAnalytics('resolve_issue', { organization, release: 'current', }); } function handleNextReleaseResolution() { if (hasRelease) { onUpdate({ status: GroupStatus.RESOLVED, statusDetails: { inNextRelease: true, }, substatus: null, }); } trackAnalytics('resolve_issue', { organization, release: 'next', }); } function renderResolved() { return (