import {Fragment} from 'react'; import styled from '@emotion/styled'; import {LinkButton} from 'sentry/components/button'; import GroupList from 'sentry/components/issues/groupList'; import Link from 'sentry/components/links/link'; import LoadingError from 'sentry/components/loadingError'; import LoadingIndicator from 'sentry/components/loadingIndicator'; import {t} from 'sentry/locale'; import {space} from 'sentry/styles/space'; import type {RouteComponentProps} from 'sentry/types/legacyReactRouter'; import {useApiQuery} from 'sentry/utils/queryClient'; import useOrganization from 'sentry/utils/useOrganization'; type RouteParams = { groupId: string; }; type Props = Pick, 'params'>; type RelatedIssuesResponse = { data: number[]; meta: { event_id: string; trace_id: string; }; type: string; }; interface RelatedIssuesSectionProps { groupId: string; orgSlug: string; relationType: string; } function GroupRelatedIssues({params}: Props) { const {groupId} = params; const organization = useOrganization(); const orgSlug = organization.slug; return ( ); } function RelatedIssuesSection({ groupId, orgSlug, relationType, }: RelatedIssuesSectionProps) { // Fetch the list of related issues const { isPending, isError, data: relatedIssues, refetch, } = useApiQuery( [`/issues/${groupId}/related-issues/?type=${relationType}`], { staleTime: 0, } ); const traceMeta = relationType === 'trace_connected' ? relatedIssues?.meta : undefined; const issues = relatedIssues?.data ?? []; const query = `issue.id:[${issues}]`; // project=-1 allows ensuring that the query will show issues from any projects for the org // This is important for traces since issues can be for any project in the org const baseUrl = `/organizations/${orgSlug}/issues/?project=-1`; let title: React.ReactNode = null; let linkToTrace: React.ReactNode = null; let openIssuesButton: React.ReactNode = null; if (relationType === 'trace_connected' && traceMeta) { title = t('Issues in the same trace'); linkToTrace = ( {t('These issues were all found within ')} {t('this trace')} . ); openIssuesButton = ( {t('Open in Issues')} ); } else { title = t('Issues caused by the same root cause'); openIssuesButton = ( {t('Open in Issues')} ); } return ( {isPending ? ( ) : isError ? ( ) : issues.length > 0 ? ( {title} {linkToTrace} {openIssuesButton} ) : null} ); } // Export the component without feature flag controls export {GroupRelatedIssues}; const Title = styled('h4')` margin-bottom: ${space(0.75)}; `; const HeaderWrapper = styled('div')` margin-bottom: ${space(2)}; small { color: ${p => p.theme.subText}; } `; const TextButtonWrapper = styled('div')` display: flex; justify-content: space-between; margin-bottom: ${space(1)}; `;