import { useT } from "@agent-native/core/client/i18n"; import { IconInfoCircle } from "@tabler/icons-react"; import { ActionQueryError } from "./action-query-error"; import { type ProviderMetricsResult } from "./transactional-email-metrics"; import { Alert, AlertDescription, AlertTitle } from "./ui/alert"; import { Skeleton } from "./ui/skeleton"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "./ui/table"; export interface EmailActivityEntry { msgId: string; toEmail: string; fromEmail: string; subject: string; status: string; opensCount: number; clicksCount: number; lastEventTime: string; } /** * Renders one email's activity feed. Used both inline on the detail page and * inside the list page's activity dialog, so the "unavailable" and "empty" * states only need to be written once. */ export function ActivityTable({ result, isLoading, isError, error, onRetry, }: { result: ProviderMetricsResult | undefined; isLoading: boolean; isError: boolean; error: unknown; onRetry: () => void; }) { const t = useT(); if (isError) { return ; } if (isLoading) { return ; } if (result && !result.available) { return ( {t("dispatch.transactionalEmail.activityUnavailable")} {result.reason} ); } if (result && result.data.length === 0) { return (
{t("dispatch.transactionalEmail.activityEmpty")}
); } if (!result) return null; return (
{t("dispatch.transactionalEmail.recipient")} {t("dispatch.transactionalEmail.subject")} {t("dispatch.transactionalEmail.status")} {t("dispatch.transactionalEmail.opens")} {t("dispatch.transactionalEmail.lastEvent")} {result.data.map((entry) => ( {entry.toEmail} {entry.subject} {entry.status} {entry.opensCount} {entry.lastEventTime} ))}
); }