Files
govoplan-campaign/webui/src/features/campaigns/review/DeliveryJobDetailOverlay.tsx

137 lines
4.1 KiB
TypeScript

import { Button, Dialog, i18nMessage } from "@govoplan/core-webui";
import { asArray, asRecord, formatDateTime, humanize } from "../utils/campaignView";
import { formatAddressList } from "./reviewFormatters";
export default function DeliveryJobDetailOverlay({
detail,
onClose
}: {
detail: Record<string, unknown>;
onClose: () => void;
}) {
const job = asRecord(detail.job);
const attempts = asRecord(detail.attempts);
const smtpAttempts = asArray(attempts.smtp).map(asRecord);
const imapAttempts = asArray(attempts.imap).map(asRecord);
const issues = asArray(job.issues).map(asRecord);
return (
<Dialog
open
title="i18n:govoplan-campaign.delivery_job_details.0d9c5b1f"
className="template-preview-modal"
onClose={onClose}
footer={
<Button variant="primary" onClick={onClose}>
i18n:govoplan-campaign.close.bbfa773e
</Button>
}
>
<dl className="detail-list">
<div>
<dt>i18n:govoplan-campaign.recipient.90343260</dt>
<dd>
{formatAddressList(asRecord(job.resolved_recipients).to) ||
String(job.recipient_email ?? "-")}
</dd>
</div>
<div>
<dt>i18n:govoplan-campaign.subject.8d183dbd</dt>
<dd>{String(job.subject ?? "-")}</dd>
</div>
<div>
<dt>i18n:govoplan-campaign.smtp_status.6211cb2b</dt>
<dd>{humanize(String(job.send_status ?? "-"))}</dd>
</div>
<div>
<dt>i18n:govoplan-campaign.imap_status.dbc2e430</dt>
<dd>{humanize(String(job.imap_status ?? "-"))}</dd>
</div>
{job.last_error ? (
<div>
<dt>i18n:govoplan-campaign.last_error.5e4df866</dt>
<dd>{String(job.last_error)}</dd>
</div>
) : null}
</dl>
{issues.length > 0 && (
<AttemptList
title="i18n:govoplan-campaign.message_issues.9092a7db"
rows={issues}
/>
)}
<AttemptList
title="i18n:govoplan-campaign.smtp_attempts.eb0a9ca6"
rows={smtpAttempts}
emptyText="i18n:govoplan-campaign.no_smtp_attempts_were_recorded.ff5b4c5d"
/>
<AttemptList
title="i18n:govoplan-campaign.imap_attempts.e815f0c2"
rows={imapAttempts}
emptyText="i18n:govoplan-campaign.no_imap_append_attempts_were_recorded_if_status_.12279f7e"
/>
</Dialog>
);
}
function AttemptList({
title,
rows,
emptyText = "i18n:govoplan-campaign.no_rows.fdbeab75"
}: {
title: string;
rows: Record<string, unknown>[];
emptyText?: string;
}) {
return (
<section className="review-flow-data-section">
<h3>{title}</h3>
{rows.length === 0 ? (
<p className="muted small-note">{emptyText}</p>
) : (
<dl className="detail-list">
{rows.map((row, index) => (
<div key={`${String(row.id ?? row.code ?? index)}:${index}`}>
<dt>
{String(
row.status ??
row.severity ??
row.code ??
i18nMessage("i18n:govoplan-campaign.value.44b8c76f", {
value0: index + 1
})
)}
</dt>
<dd>
<strong>
{String(
row.message ??
row.error_message ??
row.smtp_response ??
row.folder ??
row.path ??
"-"
)}
</strong>
{row.started_at || row.created_at ? (
<span className="muted">
{" · "}
{formatDateTime(String(row.started_at ?? row.created_at))}
</span>
) : null}
{row.finished_at || row.updated_at ? (
<span className="muted">
{" → "}
{formatDateTime(String(row.finished_at ?? row.updated_at))}
</span>
) : null}
</dd>
</div>
))}
</dl>
)}
</section>
);
}