import styled from '@emotion/styled'; import Loading from 'sentry/components/loadingIndicator'; import Placeholder from 'sentry/components/placeholder'; import {IconSad} from 'sentry/icons'; import {t} from 'sentry/locale'; import {useLocation} from 'sentry/utils/useLocation'; import useOrganization from 'sentry/utils/useOrganization'; import TraceView from 'sentry/views/performance/traceDetails/traceView'; import EmptyState from 'sentry/views/replays/detail/emptyState'; import FluidHeight from 'sentry/views/replays/detail/layout/fluidHeight'; import { useFetchTransactions, useTransactionData, } from 'sentry/views/replays/detail/trace/replayTransactionContext'; import type {ReplayRecord} from 'sentry/views/replays/types'; type Props = { replayRecord: undefined | ReplayRecord; }; function Trace({replayRecord}: Props) { const location = useLocation(); const organization = useOrganization(); const { state: {didInit, errors, isFetching, traces}, eventView, } = useTransactionData(); useFetchTransactions(); if (!replayRecord || !didInit || (isFetching && !traces?.length)) { // Show the blank screen until we start fetching, thats when you get a spinner return ( {isFetching ? : null} ); } if (errors.length) { // Same style as return (

{t('Unable to retrieve traces')}

); } if (!traces?.length) { return (

{t('No traces found')}

); } return ( ); } // This has the gray background, to match other loaders on Replay Details const StyledPlaceholder = styled(Placeholder)` border: 1px solid ${p => p.theme.border}; border-radius: ${p => p.theme.borderRadius}; `; // White background, to match the loaded component const BorderedSection = styled(FluidHeight)` border: 1px solid ${p => p.theme.border}; border-radius: ${p => p.theme.borderRadius}; `; export default Trace;