import {useMemo, useRef} from 'react'; import { AutoSizer, CellMeasurer, List as ReactVirtualizedList, ListRowProps, } from 'react-virtualized'; import Placeholder from 'sentry/components/placeholder'; import {t} from 'sentry/locale'; import type {ReplayFrame} from 'sentry/utils/replays/types'; import BreadcrumbRow from 'sentry/views/replays/detail/breadcrumbs/breadcrumbRow'; import useScrollToCurrentItem from 'sentry/views/replays/detail/breadcrumbs/useScrollToCurrentItem'; import FluidHeight from 'sentry/views/replays/detail/layout/fluidHeight'; import NoRowRenderer from 'sentry/views/replays/detail/noRowRenderer'; import TabItemContainer from 'sentry/views/replays/detail/tabItemContainer'; import useVirtualizedList from 'sentry/views/replays/detail/useVirtualizedList'; import useVirtualizedInspector from '../useVirtualizedInspector'; type Props = { frames: undefined | ReplayFrame[]; startTimestampMs: number; }; // Ensure this object is created once as it is an input to // `useVirtualizedList`'s memoization const cellMeasurer = { fixedWidth: true, minHeight: 53, }; function Breadcrumbs({frames, startTimestampMs}: Props) { const listRef = useRef(null); // Keep a reference of object paths that are expanded (via ) // by log row, so they they can be restored as the Console pane is scrolling. // Due to virtualization, components can be unmounted as the user scrolls, so // state needs to be remembered. // // Note that this is intentionally not in state because we do not want to // re-render when items are expanded/collapsed, though it may work in state as well. const expandPathsRef = useRef(new Map>()); const deps = useMemo(() => [frames], [frames]); const {cache, updateList} = useVirtualizedList({ cellMeasurer, ref: listRef, deps, }); const {handleDimensionChange} = useVirtualizedInspector({ cache, listRef, expandPathsRef, }); useScrollToCurrentItem({ frames, ref: listRef, }); const renderRow = ({index, key, style, parent}: ListRowProps) => { const item = (frames || [])[index]; return ( ); }; return ( {frames ? ( {({height, width}) => ( ( {}}> {t('No breadcrumbs recorded')} )} overscanRowCount={5} ref={listRef} rowCount={frames.length} rowHeight={cache.rowHeight} rowRenderer={renderRow} width={width} /> )} ) : ( )} ); } export default Breadcrumbs;