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]'} /> ); }, }), ];