import { zodResolver } from "@hookform/resolvers/zod"; import { ProjectSchemas } from "@plunk/shared"; import type { Project } from "@prisma/client"; import { AnimatePresence, motion } from "framer-motion"; import { useAtom } from "jotai"; import Link from "next/link"; import { useRouter } from "next/router"; import React, { useState } from "react"; import { useForm, useFormState } from "react-hook-form"; import Shared from "../../public/assets/shared.svg"; import { FullscreenLoader, Redirect } from "../components"; import { atomActiveProject } from "../lib/atoms/project"; import { useProjects } from "../lib/hooks/projects"; import { useUser } from "../lib/hooks/users"; import { network } from "../lib/network"; interface ProjectValues { name: string; url: string; error: string; } /** * */ export default function Index() { const router = useRouter(); const [, setActiveProjectId] = useAtom(atomActiveProject); const { data: user, error } = useUser(); const { data: projects, mutate } = useProjects(); const [submitted, setSubmitted] = useState(false); const { register, handleSubmit, formState: { errors }, setError, control, } = useForm({ resolver: zodResolver(ProjectSchemas.create), }); const { isValid } = useFormState({ control, }); if (error) { return ; } if (!user || !projects) { return ; } const create = async (data: ProjectValues) => { setSubmitted(true); localStorage.removeItem("skip_onboarding"); const result = await network.fetch< | { data: Project; success: true; } | { success: false; data: string; }, typeof ProjectSchemas.create >("POST", "/projects/create", { ...data, url: data.url.startsWith("http") ? data.url : `https://${data.url}`, }); if (result.success) { await mutate([...projects, result.data]); localStorage.setItem("project", result.data.id); setActiveProjectId(result.data.id); return router.push("/"); } setSubmitted(false); setError("error", { message: result.data }); }; return ( <>

Create a new project

Get ready to take your emails to the next level.

{errors.name?.message && ( {errors.name.message} )}
https://
{errors.url?.message && ( {errors.url.message} )}
{errors.error?.message && ( {errors.error.message} )} {submitted ? ( ) : ( Launch )}
{projects.length > 0 ? (
Back to the dashboard
) : null}
); }