import { Link, useLocation, useNavigate, useParams } from 'react-router-dom' import { Prisma } from '@prisma/client' import relativeTime from '~/utils/date' import { dateTimeFormatter } from '~/utils/formatters' import { statusEnumToString } from '~/utils/text' import classNames from 'classnames' import { useOrgParams } from '~/utils/organization' import { ActionWithPossibleMetadata } from '~/utils/types' import IVButton from '~/components/IVButton' import IconSchedule from '~/icons/compiled/Schedule' import EmptyState from '~/components/EmptyState' import useDashboard from '~/components/DashboardContext' import useSearchParams from '~/utils/useSearchParams' interface TransactionsListProps { transactions: (Prisma.TransactionGetPayload<{ include: { owner: true actionSchedule: true actionScheduleRun: true } }> & { action: ActionWithPossibleMetadata })[] } export default function TransactionsList(props: TransactionsListProps) { const { orgSlug } = useParams() const [search, setSearch] = useSearchParams() const searchQuery = search.get('s') if (!props.transactions.length) { if (searchQuery) { return (

We couldn't find any transactions matching your search query.

{ setSearch(prev => ({ ...prev, page: undefined, s: undefined, })) }} />

} /> ) } return (

Transactions {' '} are created each time an action is run.

Visit the Development environment {' '} to install the SDK and develop your first actions. Then{' '} create a live key {' '} and{' '} deploy {' '} to run them and view your transaction history here.

} actions={[ { theme: 'secondary', href: `/dashboard/${orgSlug}/develop/actions`, label: Go to Development ›, }, ]} /> ) } return (
Action
Ran at
Ran by
Status
{props.transactions.map(t => ( ))}
) } function TransactionsListItem(props: { transaction: TransactionsListProps['transactions'][0] }) { const { transaction: t } = props const navigate = useNavigate() const { orgEnvSlug } = useOrgParams() const { me } = useDashboard() const didHostDrop = t.status === 'HOST_CONNECTION_DROPPED' const canNavigateToAction = (!didHostDrop && t.ownerId === me.id) || t.status === 'COMPLETED' return (
{ if (!canNavigateToAction) return navigate(`/dashboard/${orgEnvSlug}/transactions/${t.id}`) }} >

{t.action.metadata?.name ?? t.action.slug}

Ran at: {dateTimeFormatter.format(t.createdAt)}
Ran by: {t.owner.firstName} {t.owner.lastName} ({t.owner.email})
Status: {statusEnumToString(t.resultStatus ?? t.status)}

{t.actionScheduleRun && ( )} {t.action.metadata?.name ?? t.action.slug}
{relativeTime(t.createdAt, { fullDateThresholdInHours: 24 })}
{t.owner.firstName} {t.owner.lastName} ({t.owner.email})
{statusEnumToString(t.resultStatus ?? t.status)}
) }