import styled from '@emotion/styled'; import Duration from 'sentry/components/duration'; import ProjectBadge from 'sentry/components/idBadge/projectBadge'; import UserBadge from 'sentry/components/idBadge/userBadge'; import Link from 'sentry/components/links/link'; import {StringWalker} from 'sentry/components/replays/walker/urlWalker'; import ScoreBar from 'sentry/components/scoreBar'; import TimeSince from 'sentry/components/timeSince'; import CHART_PALETTE from 'sentry/constants/chartPalette'; import space from 'sentry/styles/space'; import type {Organization} from 'sentry/types'; import EventView from 'sentry/utils/discover/eventView'; import {spanOperationRelativeBreakdownRenderer} from 'sentry/utils/discover/fieldRenderers'; import {useLocation} from 'sentry/utils/useLocation'; import useProjects from 'sentry/utils/useProjects'; import type {ReplayListRecordWithTx} from 'sentry/views/performance/transactionSummary/transactionReplays/useReplaysWithTxData'; import type {ReplayListRecord} from 'sentry/views/replays/types'; type Props = { replay: ReplayListRecord | ReplayListRecordWithTx; }; export function SessionCell({ eventView, organization, referrer, replay, }: Props & {eventView: EventView; organization: Organization; referrer: string}) { const {projects} = useProjects(); const project = projects.find(p => p.id === replay.project_id); return ( {replay.user.display_name || ''} } user={{ username: replay.user.display_name || '', email: replay.user.email || '', id: replay.user.id || '', ip_address: replay.user.ip || '', name: replay.user.username || '', }} // this is the subheading for the avatar, so displayEmail in this case is a misnomer displayEmail={} /> ); } export function ProjectCell({replay}: Props) { const {projects} = useProjects(); const project = projects.find(p => p.id === replay.project_id); return ( {project ? : null} ); } export function TransactionCell({ organization, replay, }: Props & {organization: Organization}) { const location = useLocation(); const hasTxEvent = 'txEvent' in replay; const txDuration = hasTxEvent ? replay.txEvent?.['transaction.duration'] : undefined; return hasTxEvent ? ( {txDuration ?
{txDuration}ms
: null} {spanOperationRelativeBreakdownRenderer( replay.txEvent, { organization, location, }, { enableOnClick: false, } )}
) : null; } export function StartedAtCell({replay}: Props) { return ( ); } export function DurationCell({replay}: Props) { return ( ); } export function ErrorCountCell({replay}: Props) { return {replay.count_errors || 0}; } export function ActivityCell({replay}: Props) { const scoreBarPalette = new Array(10).fill([CHART_PALETTE[0][0]]); return ( ); } const Item = styled('div')` display: flex; align-items: center; gap: ${space(1)}; `; const SpanOperationBreakdown = styled('div')` width: 100%; display: flex; flex-direction: column; gap: ${space(0.5)}; color: ${p => p.theme.gray500}; font-size: ${p => p.theme.fontSizeMedium}; text-align: right; `;