"use client"; import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell, } from "@unsend/ui/src/table"; import { api } from "~/trpc/react"; import { Mail, MailCheck, MailOpen, MailSearch, MailWarning, MailX, } from "lucide-react"; import { formatDate, formatDistanceToNow } from "date-fns"; import { EmailStatus } from "@prisma/client"; import { EmailStatusBadge } from "./email-status-badge"; import EmailDetails from "./email-details"; import dynamic from "next/dynamic"; import { useUrlState } from "~/hooks/useUrlState"; import { Button } from "@unsend/ui/src/button"; import { Select, SelectContent, SelectItem, SelectTrigger, } from "@unsend/ui/src/select"; import Spinner from "@unsend/ui/src/spinner"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@unsend/ui/src/tooltip"; import { Input } from "@unsend/ui/src/input"; import { DEFAULT_QUERY_LIMIT } from "~/lib/constants"; import { useDebouncedCallback } from "use-debounce"; import { useState } from "react"; /* Stupid hydrating error. And I so stupid to understand the stupid NextJS docs */ const DynamicSheetWithNoSSR = dynamic( () => import("@unsend/ui/src/sheet").then((mod) => mod.Sheet), { ssr: false } ); const DynamicSheetContentWithNoSSR = dynamic( () => import("@unsend/ui/src/sheet").then((mod) => mod.SheetContent), { ssr: false } ); export default function EmailsList() { const [selectedEmail, setSelectedEmail] = useUrlState("emailId"); const [page, setPage] = useUrlState("page", "1"); const [status, setStatus] = useUrlState("status"); const [search, setSearch] = useUrlState("search"); const [domain, setDomain] = useUrlState("domain"); const [apiKey, setApiKey] = useUrlState("apikey"); const pageNumber = Number(page); const domainId = domain ? Number(domain) : undefined; const apiId = apiKey ? Number(apiKey) : undefined; const emailsQuery = api.email.emails.useQuery({ page: pageNumber, status: status?.toUpperCase() as EmailStatus, domain: domainId, search, apiId: apiId, }); const { data: domainsQuery } = api.domain.domains.useQuery(); const { data: apiKeysQuery } = api.apiKey.getApiKeys.useQuery(); const handleSelectEmail = (emailId: string) => { setSelectedEmail(emailId); }; const handleDomain = (val: string) => { setDomain(val === "All Domain" ? null : val); }; const handleApiKey = (val: string) => { setApiKey(val === "All ApiKey" ? null : val); }; const handleSheetChange = (isOpen: boolean) => { if (!isOpen) { setSelectedEmail(null); } }; const debouncedSearch = useDebouncedCallback((value: string) => { setSearch(value); }, 1000); return (
debouncedSearch(e.target.value)} />
To Status Subject Sent at {emailsQuery.isLoading ? ( ) : emailsQuery.data?.emails.length ? ( emailsQuery.data?.emails.map((email) => ( handleSelectEmail(email.id)} className=" cursor-pointer" >
{/* */}

{email.to}

{email.latestStatus === "SCHEDULED" && email.scheduledAt ? ( Scheduled at{" "} {formatDate( email.scheduledAt, "MMM dd'th', hh:mm a" )} ) : ( )}
{email.subject}
{email.latestStatus !== "SCHEDULED" ? formatDate( email.scheduledAt ?? email.createdAt, "MMM do, hh:mm a" ) : "--"}
)) ) : ( No emails found )}
{selectedEmail ? : null}
); } const EmailIcon: React.FC<{ status: EmailStatus }> = ({ status }) => { switch (status) { case "SENT": return ( //
//
); case "DELIVERED": return ( //
//
); case "BOUNCED": case "FAILED": return ( //
//
); case "CLICKED": return ( //
//
); case "OPENED": return ( //
//
); case "DELIVERY_DELAYED": case "COMPLAINED": return ( //
//
); default: return ( //
//
); } };