import {Fragment, useMemo} from 'react'; import styled from '@emotion/styled'; import EmptyMessage from 'sentry/components/emptyMessage'; import Placeholder from 'sentry/components/placeholder'; import {useReplayContext} from 'sentry/components/replays/replayContext'; import {t} from 'sentry/locale'; import {space} from 'sentry/styles/space'; import useCountDomNodes from 'sentry/utils/replays/hooks/useCountDomNodes'; import useCurrentHoverTime from 'sentry/utils/replays/playback/providers/useCurrentHoverTime'; import DomNodesChart from 'sentry/views/replays/detail/memoryPanel/domNodesChart'; import MemoryChart from 'sentry/views/replays/detail/memoryPanel/memoryChart'; export default function MemoryPanel() { const {currentTime, isFetching, replay, setCurrentTime} = useReplayContext(); const [currentHoverTime, setCurrentHoverTime] = useCurrentHoverTime(); const memoryFrames = replay?.getMemoryFrames(); const {data: frameToCount, isLoading: isDomNodeDataLoading} = useCountDomNodes({ replay, }); const domNodeData = useMemo( () => Array.from(frameToCount?.values() || []), [frameToCount] ); const memoryChart = !replay || isFetching ? ( ) : !replay || !memoryFrames?.length ? ( ) : ( {t('Heap Size')} ); const domNodesChart = !replay || isDomNodeDataLoading ? ( ) : ( {t('DOM Nodes')} ); return ( {memoryChart} {domNodesChart} ); } const Grid = styled('div')` display: grid; grid-template-rows: 1fr 1fr; grid-template-columns: 1fr; gap: ${space(1)}; justify-content: center; height: 100%; `; const ChartWrapper = styled('div')` border: 1px solid ${p => p.theme.border}; border-radius: ${space(0.5)}; padding: ${space(1)}; overflow: hidden; display: flex; flex-direction: column; & > * { flex-grow: 1; } `; const ChartTitle = styled('h5')` font-size: ${p => p.theme.fontSizeLarge}; font-weight: ${p => p.theme.text.cardTitle.fontWeight}; line-height: ${p => p.theme.text.cardTitle.lineHeight}; color: ${p => p.theme.subText}; flex: 0 1 auto; margin: 0; `;