import { FilterOutlined } from '@ant-design/icons'; import { Button, Col } from 'antd'; import { StyledCol, StyledDiv, StyledDivider, StyledRow, StyledSpace, StyledTypography, } from 'components/Styled'; import * as StyledStyles from 'components/Styled/styles'; import GanttChart from 'container/GantChart'; import { getNodeById } from 'container/GantChart/utils'; import Timeline from 'container/Timeline'; import TraceFlameGraph from 'container/TraceFlameGraph'; import dayjs from 'dayjs'; import useUrlQuery from 'hooks/useUrlQuery'; import { spanServiceNameToColorMapping } from 'lib/getRandomColor'; import history from 'lib/history'; import { SPAN_DETAILS_LEFT_COL_WIDTH } from 'pages/TraceDetail/constants'; import React, { useEffect, useMemo, useState } from 'react'; import { ITraceTree, PayloadProps } from 'types/api/trace/getTraceItem'; import { getSpanTreeMetadata } from 'utils/getSpanTreeMetadata'; import { spanToTreeUtil } from 'utils/spanToTree'; import SelectedSpanDetails from './SelectedSpanDetails'; import * as styles from './styles'; import { getSortedData, IIntervalUnit, INTERVAL_UNITS } from './utils'; function TraceDetail({ response }: TraceDetailProps): JSX.Element { const spanServiceColors = useMemo( () => spanServiceNameToColorMapping(response[0].events), [response], ); const urlQuery = useUrlQuery(); const [spanId] = useState(urlQuery.get('spanId')); const [intervalUnit, setIntervalUnit] = useState( INTERVAL_UNITS[0], ); // const [searchSpanString, setSearchSpanString] = useState(''); const [activeHoverId, setActiveHoverId] = useState(''); const [activeSelectedId, setActiveSelectedId] = useState(spanId || ''); const [treeData, setTreeData] = useState( spanToTreeUtil(response[0].events), ); const { treeData: tree, ...traceMetaData } = useMemo(() => { const tree = getSortedData(treeData); return getSpanTreeMetadata(tree, spanServiceColors); }, [treeData, spanServiceColors]); const [globalTraceMetadata] = useState>({ ...traceMetaData, }); useEffect(() => { if (activeSelectedId) { history.replace({ pathname: history.location.pathname, search: `?spanId=${activeSelectedId}`, }); } }, [activeSelectedId]); const getSelectedNode = useMemo(() => { return getNodeById(activeSelectedId, treeData); }, [activeSelectedId, treeData]); // const onSearchHandler = (value: string) => { // setSearchSpanString(value); // setTreeData(spanToTreeUtil(response[0].events)); // }; const onFocusSelectedSpanHandler = () => { const treeNode = getNodeById(activeSelectedId, tree); if (treeNode) { setTreeData(treeNode); } }; const onResetHandler = (): void => { setTreeData(spanToTreeUtil(response[0].events)); }; return ( Trace Details {traceMetaData.totalSpans} Span {tree && dayjs(tree.startTime).format('hh:mm:ss a MM/DD')} {/* */} ); } interface TraceDetailProps { response: PayloadProps; } export default TraceDetail;