import {Fragment, useEffect} from 'react'; import styled from '@emotion/styled'; import {Button} from 'sentry/components/button'; import {SectionHeading} from 'sentry/components/charts/styles'; import EmptyStateWarning from 'sentry/components/emptyStateWarning'; import GroupList from 'sentry/components/issues/groupList'; import LoadingError from 'sentry/components/loadingError'; import Panel from 'sentry/components/panels/panel'; import PanelBody from 'sentry/components/panels/panelBody'; import {t} from 'sentry/locale'; import {space} from 'sentry/styles/space'; import type {OrganizationSummary, Project} from 'sentry/types'; import useRouter from 'sentry/utils/useRouter'; import { RELATED_ISSUES_BOOLEAN_QUERY_ERROR, RelatedIssuesNotAvailable, } from 'sentry/views/alerts/rules/metric/details/relatedIssuesNotAvailable'; import {makeDefaultCta} from 'sentry/views/alerts/rules/metric/metricRulePresets'; import type {MetricRule} from 'sentry/views/alerts/rules/metric/types'; import {isSessionAggregate} from 'sentry/views/alerts/utils'; import type {TimePeriodType} from './constants'; interface Props { organization: OrganizationSummary; projects: Project[]; rule: MetricRule; timePeriod: TimePeriodType; query?: string; } function RelatedIssues({rule, organization, projects, query, timePeriod}: Props) { const router = useRouter(); // Add environment to the query parameters to be picked up by GlobalSelectionLink // GlobalSelectionLink uses the current query parameters to build links to issue details useEffect(() => { const env = rule.environment ?? ''; if (env !== (router.location.query.environment ?? '')) { router.replace({ pathname: router.location.pathname, query: {...router.location.query, environment: env}, }); } }, [rule.environment, router]); function renderErrorMessage({detail}: {detail: string}, retry: () => void) { if ( detail === RELATED_ISSUES_BOOLEAN_QUERY_ERROR && !isSessionAggregate(rule.aggregate) ) { const {buttonText, to} = makeDefaultCta({ orgSlug: organization.slug, projects, rule, query, timePeriod, }); return ; } return ; } function renderEmptyMessage() { return ( {t('No issues for this alert rule')} ); } const {start, end} = timePeriod; const path = `/organizations/${organization.slug}/issues/`; const queryParams = { start, end, groupStatsPeriod: 'auto', limit: 5, ...(rule.environment ? {environment: rule.environment} : {}), sort: rule.aggregate === 'count_unique(user)' ? 'user' : 'freq', query, project: projects.map(project => project.id), }; const issueSearch = { pathname: `/organizations/${organization.slug}/issues/`, query: queryParams, }; return ( {t('Related Issues')} ); } const StyledSectionHeading = styled(SectionHeading)` display: flex; align-items: center; `; const ControlsWrapper = styled('div')` display: flex; align-items: center; justify-content: space-between; margin-bottom: ${space(1)}; `; const TableWrapper = styled('div')` margin-bottom: ${space(4)}; ${Panel} { /* smaller space between table and pagination */ margin-bottom: -${space(1)}; } `; export default RelatedIssues;