// @ts-nocheck // React Hook Form messes up our types, ignore the entire file import { zodResolver } from "@hookform/resolvers/zod"; import { ContactSchemas, EventSchemas, type UtilitySchemas } from "@plunk/shared"; import type { Contact, Email, Template } from "@prisma/client"; import dayjs from "dayjs"; import { motion } from "framer-motion"; import { Save } from "lucide-react"; import { useRouter } from "next/router"; import React, { useEffect, useState } from "react"; import { useFieldArray, useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; import { Card, Empty, FullscreenLoader, Input, Modal, Toggle } from "../../components"; import { Dashboard } from "../../layouts"; import { useContact } from "../../lib/hooks/contacts"; import { useActiveProject } from "../../lib/hooks/projects"; import { network } from "../../lib/network"; interface ContactValues { email: string; data: string | null; subscribed: boolean; } interface EventValues { event: string; } /** * */ export default function Index() { const router = useRouter(); const [selectedEmail, setSelectedEmail] = useState(null); if (!router.isReady) { return ; } const [eventModal, setEventModal] = useState(false); const project = useActiveProject(); const { data: contact, mutate } = useContact({ id: router.query.id as string, }); const { handleSubmit, watch, setValue, reset } = useForm({ resolver: zodResolver(ContactSchemas.manage), }); const { register: dataRegister, control, getValues: getDataValues, reset: dataReset, } = useForm({ defaultValues: { data: Object.entries(JSON.parse(contact?.data ? contact.data : "{}")).map(([key]) => ({ value: { key }, })), }, resolver: zodResolver( z.object({ data: z .array( z.object({ value: z.object({ key: z.string(), value: z.string() }), }), ) .min(0), }), ), }); const { fields, append: fieldAppend, remove: fieldRemove } = useFieldArray({ control, name: "data" }); const { register: eventRegister, handleSubmit: eventHandleSubmit, formState: { errors: eventErrors }, reset: eventReset, } = useForm({ resolver: zodResolver(EventSchemas.post.pick({ event: true })), }); useEffect(() => { if (!contact) { return; } reset({ email: contact.email, subscribed: contact.subscribed, }); dataReset({ data: Object.entries(JSON.parse(contact.data ? contact.data : "{}")).map(([key, value]) => ({ value: { key, value }, })), }); }, [dataReset, reset, contact]); if (!contact) { return ; } const create = (data: EventValues) => { toast.promise( network.mock(project.secret, "POST", "/v1", { ...data, email: contact.email, }), { loading: "Creating new event", success: () => { void mutate(); eventReset(); return "Created new event"; }, error: "Could not create new event!", }, ); setEventModal(false); }; const update = (data: ContactValues) => { const entries = getDataValues().data.map(({ value }) => [value.key, value.value]); let dataObject = {}; entries.forEach(([key, value]) => { Object.assign(dataObject, { [key]: value }); }); dataObject = Object.fromEntries(Object.entries(dataObject).filter(([, value]) => value !== "")); toast.promise( network.mock(project.secret, "PUT", "/v1/contacts", { ...data, data: dataObject, }), { loading: "Saving your changes", success: () => { void mutate(); return "Saved your changes"; }, error: "Could not save your changes!", }, ); }; const remove = async (e: { preventDefault: () => void }) => { e.preventDefault(); toast.promise( network.mock(project.secret, "DELETE", "/v1/contacts", { id: contact.id, }), { loading: "Deleting contact", success: "Deleted contact", error: "Could not delete contact!", }, ); await router.push("/contacts"); }; return ( <> setEventModal(!eventModal)} onAction={eventHandleSubmit(create)} type={"info"} action={"Trigger"} title={"Trigger event"} description={`Trigger an event for ${contact.email}`} icon={ <> } > } >
{contact.email[0].toUpperCase()}

{contact.email[0].toUpperCase()} {contact.email.slice(1)}

{fields.length > 0 ? ( fields.map((field, index) => { return ( <>
); }) ) : (

No fields added

)}
setValue("subscribed", !watch("subscribed"))} />
Save
{contact.triggers.length > 0 || contact.emails.length > 0 ? (
    {[...contact.triggers, ...contact.emails] .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()) .map((t, index) => { if (t.messageId) { const email = t as Email; const expanded = selectedEmail?.id === email.id; return (
  • {contact.triggers.length + contact.emails.length - 1 !== index && (
  • ); } if (t.action) { return (
  • {contact.triggers.length + contact.emails.length - 1 !== index && (
  • ); } if (t.event) { return (
  • {contact.triggers.length + contact.emails.length - 1 !== index && (
  • ); } })}
) : ( )}
); }