import { createColumnHelper } from '@tanstack/react-table';
import { TAlertsList, TAlertState } from '@/domains/alerts/fetchers';
import dayjs from 'dayjs';
import { Badge, severityToClassName, TextWithNAFallback } from '@ballerine/ui';
import { ctw } from '@/common/utils/ctw/ctw';
import { UserCircle2 } from 'lucide-react';
import { Avatar } from '@/common/components/atoms/Avatar_/Avatar_';
import { AvatarImage } from '@/common/components/atoms/Avatar_/Avatar.Image';
import { AvatarFallback } from '@/common/components/atoms/Avatar_/Avatar.Fallback';
import { createInitials } from '@/common/utils/create-initials/create-initials';
import React, { ComponentProps } from 'react';
import { IndeterminateCheckbox } from '@/common/components/atoms/IndeterminateCheckbox/IndeterminateCheckbox';
import { SnakeCase, titleCase } from 'string-ts';
import { toScreamingSnakeCase } from '@/common/utils/to-screaming-snake-case/to-screaming-snake-case';
import { useEllipsesWithTitle } from '@/common/hooks/useEllipsesWithTitle/useEllipsesWithTitle';
import { buttonVariants } from '@/common/components/atoms/Button/Button';
const columnHelper = createColumnHelper<
TAlertsList[number] & {
// TODO: Change type once decisions PR is merged
// Computed from `alert.state`
decision: string;
}
>();
export const columns = [
columnHelper.accessor('dataTimestamp', {
cell: info => {
const dataTimestamp = info.getValue();
if (!dataTimestamp) {
return {dataTimestamp};
}
const date = dayjs(dataTimestamp).local().format('MMM DD, YYYY');
const time = dayjs(dataTimestamp).local().format('hh:mm');
return (
{date}
{time}
);
},
header: 'Created At',
}),
columnHelper.accessor('updatedAt', {
cell: info => {
const updatedAt = info.getValue();
if (!updatedAt) {
return {updatedAt};
}
const date = dayjs(updatedAt).local().format('MMM DD, YYYY');
const time = dayjs(updatedAt).local().format('hh:mm');
return (
{date}
{time}
);
},
header: 'Updated At',
}),
columnHelper.accessor('correlationId', {
cell: info => {
const correlationId = info.getValue();
return (
{correlationId}
);
},
header: 'Correlation Id',
}),
columnHelper.accessor('subject', {
cell: info => {
const subject = info.getValue();
return {subject.name};
},
header: 'Subject',
}),
columnHelper.accessor('subject.type', {
cell: info => {
const subjectType = info.getValue();
return (
{titleCase(subjectType)}
);
},
header: 'Subject Type',
}),
columnHelper.accessor('subject.correlationId', {
cell: info => {
// eslint-disable-next-line react-hooks/rules-of-hooks -- ESLint doesn't like `cell` not being `Cell`.
const { ref, styles } = useEllipsesWithTitle();
const subjectId = info.getValue();
return (
{subjectId}
);
},
header: 'Subject ID',
}),
columnHelper.accessor('severity', {
cell: info => {
const severity = info.getValue();
return (
{titleCase(severity ?? '')}
);
},
header: 'Severity',
}),
columnHelper.accessor('alertDetails', {
cell: info => {
const alertDetails = info.getValue();
return {alertDetails};
},
header: 'Alert Details',
}),
// columnHelper.accessor('amountOfTxs', {
// cell: info => {
// const value = info.getValue();
//
// return {value};
// },
// header: '# of TXs',
// }),
columnHelper.accessor('assignee', {
cell: info => {
const assignee = info.getValue();
return (
{!assignee &&
}
{assignee && (
{createInitials(assignee?.fullName)}
)}
{assignee?.fullName}
);
},
header: 'Assignee',
}),
columnHelper.accessor('status', {
cell: info => {
const status = info.getValue();
return (
{titleCase(status)}
);
},
header: 'Status',
}),
columnHelper.accessor('decision', {
cell: info => {
const decision = info.getValue();
const screamingSnakeDecision = toScreamingSnakeCase(decision ?? '');
const decisionToTextColor = {
CLEARED: 'text-success',
REJECTED: 'text-destructive',
} as const satisfies Record<
Extract>, 'CLEARED' | 'REJECTED'>,
ComponentProps['className']
>;
return (
{titleCase(decision ?? '')}
);
},
header: 'Decision',
}),
columnHelper.display({
id: 'select',
cell: ({ row }) => {
return (
)}
className={'border-[#E5E7EB]'}
/>
);
},
header: ({ table }) => {
return (
table.getToggleAllRowsSelectedHandler()({
target: { checked },
}),
} satisfies ComponentProps)}
className={'border-[#E5E7EB]'}
/>
);
},
}),
];