"use client"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Form, FormControl, FormField, FormItem, FormMessage, } from "@/components/ui/form"; import SectionContainer from "@/components/ui/section-container"; import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; import * as z from "zod"; import { toast } from "sonner"; import { useCallback } from "react"; import { Loader2 } from "lucide-react"; import { stegaClean } from "next-sanity"; import { PAGE_QUERY_RESULT } from "@/sanity.types"; type FormNewsletterProps = Extract< NonNullable["blocks"]>[number], { _type: "form-newsletter" } >; export default function FormNewsletter({ padding, colorVariant, consentText, buttonText, successMessage, }: FormNewsletterProps) { // form validation schema const formSchema = z.object({ email: z .string() .min(1, { message: "Please enter your email", }) .pipe( z.email({ error: "Please enter a valid email", }), ), }); const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { email: "", }, }); const { isSubmitting } = form.formState; const handleSend = useCallback( async ({ email }: { email: string }) => { try { const response = await fetch("/api/newsletter", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ email, }), }); const result = await response.json(); if (response.ok) { toast(successMessage); form.reset(); } else { toast.error(result.error); } } catch (error: any) { toast.error(error.message); throw new Error(error.message); } }, [form], ); async function onSubmit(values: z.infer) { await handleSend(values); } const color = stegaClean(colorVariant); return (
( )} />
{consentText &&

{consentText}

}
); }