"use client"; import { api } from "~/trpc/react"; import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, } from "@unsend/ui/src/breadcrumb"; import Link from "next/link"; import AddContact from "./add-contact"; import ContactList from "./contact-list"; import { TextWithCopyButton } from "@unsend/ui/src/text-with-copy"; import { formatDistanceToNow } from "date-fns"; import EmojiPicker, { Theme } from "emoji-picker-react"; import { Popover, PopoverContent, PopoverTrigger, } from "@unsend/ui/src/popover"; import { Button } from "@unsend/ui/src/button"; import { useTheme } from "@unsend/ui"; export default function ContactsPage({ params, }: { params: { contactBookId: string }; }) { const { theme } = useTheme(); const contactBookDetailQuery = api.contacts.getContactBookDetails.useQuery({ contactBookId: params.contactBookId, }); const utils = api.useUtils(); const updateContactBookMutation = api.contacts.updateContactBook.useMutation({ onMutate: async (data) => { await utils.contacts.getContactBookDetails.cancel(); utils.contacts.getContactBookDetails.setData( { contactBookId: params.contactBookId, }, (old) => { if (!old) return old; return { ...old, ...data, }; } ); }, onSettled: () => { utils.contacts.getContactBookDetails.invalidate({ contactBookId: params.contactBookId, }); }, }); return (
Contact books
{ // Handle emoji selection here // You might want to update the contactBook's emoji updateContactBookMutation.mutate({ contactBookId: params.contactBookId, emoji: emojiObject.emoji, }); }} theme={ theme === "system" ? Theme.AUTO : theme === "dark" ? Theme.DARK : Theme.LIGHT } /> {contactBookDetailQuery.data?.name}

Metrics

Total Contacts
{contactBookDetailQuery.data?.totalContacts !== undefined ? contactBookDetailQuery.data?.totalContacts : "--"}
Unsubscribed
{contactBookDetailQuery.data?.unsubscribedContacts !== undefined ? contactBookDetailQuery.data?.unsubscribedContacts : "--"}

Details

Contact book ID
Created at
{contactBookDetailQuery.data?.createdAt ? formatDistanceToNow(contactBookDetailQuery.data.createdAt, { addSuffix: true, }) : "--"}

Recent campaigns

{!contactBookDetailQuery.isLoading && contactBookDetailQuery.data?.campaigns.length === 0 ? (
No campaigns yet.
) : null} {contactBookDetailQuery.data?.campaigns.map((campaign) => (
{campaign.name}
{formatDistanceToNow(campaign.createdAt, {})}
))}
); }