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;