import {ReactChild, useEffect} from 'react'; import styled from '@emotion/styled'; import {SpanEvidenceKeyValueList} from 'sentry/components/events/interfaces/performance/spanEvidenceKeyValueList'; import {GroupPreviewHovercard} from 'sentry/components/groupPreviewTooltip/groupPreviewHovercard'; import { useDelayedLoadingState, usePreviewEvent, } from 'sentry/components/groupPreviewTooltip/utils'; import LoadingIndicator from 'sentry/components/loadingIndicator'; import {t} from 'sentry/locale'; import {space} from 'sentry/styles/space'; import {EventTransaction} from 'sentry/types'; type SpanEvidencePreviewProps = { children: ReactChild; groupId: string; query?: string; }; type SpanEvidencePreviewBodyProps = { groupId: string; onRequestBegin: () => void; onRequestEnd: () => void; onUnmount: () => void; query?: string; }; function SpanEvidencePreviewBody({ groupId, onRequestBegin, onRequestEnd, onUnmount, query, }: SpanEvidencePreviewBodyProps) { const {data, isLoading, isError} = usePreviewEvent({ groupId, query, }); useEffect(() => { if (isLoading) { onRequestBegin(); } else { onRequestEnd(); } return onUnmount; }, [isLoading, onRequestBegin, onRequestEnd, onUnmount]); if (isLoading) { return ( ); } if (isError) { return {t('Failed to load preview')}; } if (data) { return ( ); } return ( {t('There is no span evidence available for this issue.')} ); } export function SpanEvidencePreview({ children, groupId, query, }: SpanEvidencePreviewProps) { const {shouldShowLoadingState, onRequestBegin, onRequestEnd, reset} = useDelayedLoadingState(); return ( } > {children} ); } const EmptyWrapper = styled('div')` color: ${p => p.theme.subText}; padding: ${space(1.5)}; font-size: ${p => p.theme.fontSizeMedium}; display: flex; align-items: center; justify-content: center; min-height: 56px; `; const SpanEvidencePreviewWrapper = styled('div')` width: 700px; padding: ${space(1.5)} ${space(1.5)} 0 ${space(1.5)}; `;