diff --git a/apps/web/.env.development b/apps/web/.env.development index 99bb9a23b..03afb0b1b 100644 --- a/apps/web/.env.development +++ b/apps/web/.env.development @@ -4,10 +4,12 @@ # SUPABASE NEXT_PUBLIC_SUPABASE_URL=http://127.0.0.1:54321 NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0 +SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImV4cCI6MTk4MzgxMjk5Nn0.EGIM96RAZx35lJzdJsyH-qQwv8Hdp7fsn3W0YpN81IU ## THIS IS FOR DEVELOPMENT ONLY - DO NOT USE IN PRODUCTION SUPABASE_DB_WEBHOOK_SECRET=WEBHOOKSECRET +# EMAILS EMAIL_SENDER=test@makerkit.dev EMAIL_PORT=54325 EMAIL_HOST=localhost @@ -15,6 +17,9 @@ EMAIL_TLS=false EMAIL_USER=user EMAIL_PASSWORD=password +# CONTACT FORM +CONTACT_EMAIL=test@makerkit.dev + # STRIPE NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY= diff --git a/apps/web/app/(marketing)/contact/_components/contact-form.tsx b/apps/web/app/(marketing)/contact/_components/contact-form.tsx new file mode 100644 index 000000000..106cf0ffa --- /dev/null +++ b/apps/web/app/(marketing)/contact/_components/contact-form.tsx @@ -0,0 +1,161 @@ +'use client'; + +import { useState, useTransition } from 'react'; + +import { zodResolver } from '@hookform/resolvers/zod'; +import { useForm } from 'react-hook-form'; + +import { Alert, AlertDescription, AlertTitle } from '@kit/ui/alert'; +import { Button } from '@kit/ui/button'; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '@kit/ui/form'; +import { Input } from '@kit/ui/input'; +import { Textarea } from '@kit/ui/textarea'; +import { Trans } from '@kit/ui/trans'; + +import { ContactEmailSchema } from '~/(marketing)/contact/_lib/contact-email.schema'; +import { sendContactEmail } from '~/(marketing)/contact/_lib/server/server-actions'; + +export function ContactForm() { + const [pending, startTransition] = useTransition(); + + const [state, setState] = useState({ + success: false, + error: false, + }); + + const form = useForm({ + resolver: zodResolver(ContactEmailSchema), + defaultValues: { + name: '', + email: '', + message: '', + }, + }); + + if (state.success) { + return ; + } + + if (state.error) { + return ; + } + + return ( +
+ { + startTransition(async () => { + try { + await sendContactEmail(data); + + setState({ success: true, error: false }); + } catch (error) { + setState({ error: true, success: false }); + } + }); + })} + > + { + return ( + + + + + + + + + + + + ); + }} + /> + + { + return ( + + + + + + + + + + + + ); + }} + /> + + { + return ( + + + + + + +