import './TraceDetailV2.styles.scss'; import { Button, Tabs } from 'antd'; import FlamegraphImg from 'assets/TraceDetail/Flamegraph'; import TraceFlamegraph from 'container/PaginatedTraceFlamegraph/PaginatedTraceFlamegraph'; import SpanDetailsDrawer from 'container/SpanDetailsDrawer/SpanDetailsDrawer'; import TraceMetadata from 'container/TraceMetadata/TraceMetadata'; import TraceWaterfall, { IInterestedSpan, } from 'container/TraceWaterfall/TraceWaterfall'; import useGetTraceV2 from 'hooks/trace/useGetTraceV2'; import useUrlQuery from 'hooks/useUrlQuery'; import { defaultTo } from 'lodash-es'; import { useEffect, useMemo, useState } from 'react'; import { useParams } from 'react-router-dom'; import { Span, TraceDetailV2URLProps } from 'types/api/trace/getTraceV2'; import NoData from './NoData/NoData'; function TraceDetailsV2(): JSX.Element { const { id: traceId } = useParams(); const urlQuery = useUrlQuery(); const [interestedSpanId, setInterestedSpanId] = useState( () => ({ spanId: urlQuery.get('spanId') || '', isUncollapsed: urlQuery.get('spanId') !== '', }), ); const [ traceFlamegraphStatsWidth, setTraceFlamegraphStatsWidth, ] = useState(450); const [isSpanDetailsDocked, setIsSpanDetailsDocked] = useState(false); const [selectedSpan, setSelectedSpan] = useState(); useEffect(() => { setInterestedSpanId({ spanId: urlQuery.get('spanId') || '', isUncollapsed: urlQuery.get('spanId') !== '', }); }, [urlQuery]); const [uncollapsedNodes, setUncollapsedNodes] = useState([]); const { data: traceData, isFetching: isFetchingTraceData, error: errorFetchingTraceData, } = useGetTraceV2({ traceId, uncollapsedSpans: uncollapsedNodes, selectedSpanId: interestedSpanId.spanId, isSelectedSpanIDUnCollapsed: interestedSpanId.isUncollapsed, }); useEffect(() => { if (traceData && traceData.payload && traceData.payload.uncollapsedSpans) { setUncollapsedNodes(traceData.payload.uncollapsedSpans); } }, [traceData]); useEffect(() => { if (selectedSpan) { setIsSpanDetailsDocked(false); } }, [selectedSpan]); const noData = useMemo( () => !isFetchingTraceData && !errorFetchingTraceData && defaultTo(traceData?.payload?.spans?.length, 0) === 0, [ errorFetchingTraceData, isFetchingTraceData, traceData?.payload?.spans?.length, ], ); useEffect(() => { if (noData) { setIsSpanDetailsDocked(true); } }, [noData]); const items = [ { label: ( ), key: 'flamegraph', children: ( <> ), }, ]; return (
{!noData ? ( ) : ( )}
); } export default TraceDetailsV2;