import {ReactChild, useEffect} from 'react';
import styled from '@emotion/styled';
import KeyValueList from 'sentry/components/events/interfaces/keyValueList';
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';
type SpanEvidencePreviewProps = {
children: ReactChild;
groupId: string;
query?: string;
};
type SpanEvidencePreviewBodyProps = {
groupId: string;
onRequestBegin: () => void;
onRequestEnd: () => void;
onUnmount: () => void;
query?: string;
};
function SpanEvidencePreviewBody({
onRequestBegin,
onRequestEnd,
onUnmount,
groupId,
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')};
}
const evidenceDisplay = data?.occurrence?.evidenceDisplay;
if (evidenceDisplay?.length) {
return (
({
key: item.name,
subject: item.name,
value: item.value,
}))}
shouldSort={false}
/>
);
}
return (
{t('There is no evidence available for this issue.')}
);
}
export function EvidencePreview({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)};
`;