import {Fragment, ReactNode} from 'react'; import styled from '@emotion/styled'; import {Alert} from 'sentry/components/alert'; import {PanelTable} from 'sentry/components/panels'; import {t} from 'sentry/locale'; import EventView from 'sentry/utils/discover/eventView'; import type {Sort} from 'sentry/utils/discover/fields'; import getRouteStringFromRoutes from 'sentry/utils/getRouteStringFromRoutes'; import {useLocation} from 'sentry/utils/useLocation'; import useOrganization from 'sentry/utils/useOrganization'; import {useRoutes} from 'sentry/utils/useRoutes'; import type {ReplayListRecordWithTx} from 'sentry/views/performance/transactionSummary/transactionReplays/useReplaysWithTxData'; import HeaderCell from 'sentry/views/replays/replayTable/headerCell'; import { ActivityCell, BrowserCell, DurationCell, ErrorCountCell, OSCell, ReplayCell, TransactionCell, } from 'sentry/views/replays/replayTable/tableCell'; import {ReplayColumn} from 'sentry/views/replays/replayTable/types'; import type {ReplayListRecord} from 'sentry/views/replays/types'; type Props = { fetchError: undefined | Error; isFetching: boolean; replays: undefined | ReplayListRecord[] | ReplayListRecordWithTx[]; sort: Sort | undefined; visibleColumns: ReplayColumn[]; emptyMessage?: ReactNode; }; function ReplayTable({ fetchError, isFetching, replays, sort, visibleColumns, emptyMessage, }: Props) { const routes = useRoutes(); const location = useLocation(); const organization = useOrganization(); const tableHeaders = visibleColumns .filter(Boolean) .map(column => ); if (fetchError && !isFetching) { return ( {typeof fetchError === 'string' ? fetchError : t( 'Sorry, the list of replays could not be loaded. This could be due to invalid search parameters or an internal systems error.' )} ); } const referrer = getRouteStringFromRoutes(routes); const eventView = EventView.fromLocation(location); return ( {replays?.map(replay => { return ( {visibleColumns.map(column => { switch (column) { case ReplayColumn.ACTIVITY: return ; case ReplayColumn.BROWSER: return ; case ReplayColumn.COUNT_ERRORS: return ; case ReplayColumn.DURATION: return ; case ReplayColumn.OS: return ; case ReplayColumn.REPLAY: return ( ); case ReplayColumn.SLOWEST_TRANSACTION: return ( ); default: return null; } })} ); })} ); } const StyledPanelTable = styled(PanelTable)<{ visibleColumns: ReplayColumn[]; }>` grid-template-columns: ${p => p.visibleColumns .filter(Boolean) .map(column => (column === 'replay' ? 'minmax(100px, 1fr)' : 'max-content')) .join(' ')}; `; const StyledAlert = styled(Alert)` border-radius: 0; border-width: 1px 0 0 0; grid-column: 1/-1; margin-bottom: 0; `; export default ReplayTable;