"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 (