import {Fragment} from 'react'; import styled from '@emotion/styled'; import BreadcrumbIcon from 'sentry/components/events/interfaces/breadcrumbs/breadcrumb/type/icon'; import {PanelTable} from 'sentry/components/panels'; import {getDetails} from 'sentry/components/replays/breadcrumbs/utils'; import PlayerRelativeTime from 'sentry/components/replays/playerRelativeTime'; import Truncate from 'sentry/components/truncate'; import {SVGIconProps} from 'sentry/icons/svgIcon'; import {t} from 'sentry/locale'; import space from 'sentry/styles/space'; import useExtractedCrumbHtml from 'sentry/utils/replays/hooks/useExtractedCrumbHtml'; import type ReplayReader from 'sentry/utils/replays/replayReader'; type Props = { replay: ReplayReader; }; function DomMutations({replay}: Props) { const {isLoading, actions} = useExtractedCrumbHtml({replay}); const startTimestamp = replay.getEvent().startTimestamp; return ( {actions.map((mutation, i) => ( {getDetails(mutation.crumb).title} ')} value={mutation.crumb.message || ''} /> {mutation.html} {} ))} ); } const StyledPanelTable = styled(PanelTable)` grid-template-columns: max-content max-content 1fr max-content; font-size: ${p => p.theme.fontSizeSmall}; `; const Column = styled('div')` display: flex; align-items: flex-start; `; /** * Taken `from events/interfaces/.../breadcrumbs/types` */ const IconWrapper = styled('div')>>` display: flex; align-items: center; justify-content: center; width: 24px; height: 24px; border-radius: 50%; color: ${p => p.theme.white}; background: ${p => p.theme[p.color] ?? p.color}; box-shadow: ${p => p.theme.dropShadowLightest}; `; const TitleContainer = styled('div')` display: flex; justify-content: space-between; gap: ${space(1)}; `; const Title = styled('span')` ${p => p.theme.overflowEllipsis}; text-transform: capitalize; color: ${p => p.theme.gray400}; line-height: ${p => p.theme.text.lineHeightBody}; `; const HTMLCode = styled( ({children, className}: {children: string; className?: string}) => (