"use client"; import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, } from "@unsend/ui/src/breadcrumb"; import Link from "next/link"; import Spinner from "@unsend/ui/src/spinner"; import { formatDistanceToNow } from "date-fns"; import { api } from "~/trpc/react"; import { EmailStatusIcon } from "../../emails/email-status-badge"; import { EmailStatus } from "@prisma/client"; import { Separator } from "@unsend/ui/src/separator"; import { ExternalLinkIcon } from "lucide-react"; export default function CampaignDetailsPage({ params, }: { params: { campaignId: string }; }) { const { data: campaign, isLoading } = api.campaign.getCampaign.useQuery({ campaignId: params.campaignId, }); if (isLoading) { return (
); } if (!campaign) { return
Campaign not found
; } const statusCards = [ { status: "delivered", count: campaign.delivered, percentage: 100, }, { status: "unsubscribed", count: campaign.unsubscribed, percentage: (campaign.unsubscribed / campaign.delivered) * 100, }, { status: "clicked", count: campaign.clicked, percentage: (campaign.clicked / campaign.delivered) * 100, }, { status: "opened", count: campaign.opened, percentage: (campaign.opened / campaign.delivered) * 100, }, ]; return (
Campaigns {campaign.name}

Statistics

{statusCards.map((card) => (
{card.status !== "total" ? ( ) : null}
{card.status.toLowerCase()}
{card.count}
{card.status !== "total" ? (
{card.percentage.toFixed(1)}%
) : null}
))}
{campaign.html && (

Email

From {campaign.from}
To {campaign.contactBookId ? ( {campaign.contactBook?.name} ) : (
No one
)}
Subject {campaign.subject}
)}
); } export const CampaignStatusBadge: React.FC<{ status: string }> = ({ status, }) => { let outsideColor = "bg-gray-600"; let insideColor = "bg-gray-600/50"; switch (status) { case "delivered": outsideColor = "bg-emerald-500/30"; insideColor = "bg-emerald-500"; break; case "bounced": case "unsubscribed": outsideColor = "bg-red-500/30"; insideColor = "bg-red-500"; break; case "clicked": outsideColor = "bg-cyan-500/30"; insideColor = "bg-cyan-500"; break; case "opened": outsideColor = "bg-indigo-500/30"; insideColor = "bg-indigo-500"; break; case "complained": outsideColor = "bg-yellow-500/30"; insideColor = "bg-yellow-500"; break; default: outsideColor = "bg-gray-600/40"; insideColor = "bg-gray-600"; } return (
); };