diff --git a/app/api/contact/route.ts b/app/api/contact/route.ts new file mode 100644 index 0000000..6153063 --- /dev/null +++ b/app/api/contact/route.ts @@ -0,0 +1,33 @@ +import { NextResponse } from "next/server"; +import { sendeKontaktEmail } from "@/lib/mailer"; + +export async function POST(request: Request) { + let body: Record; + try { + body = await request.json(); + } catch { + return NextResponse.json({ ok: false, error: "Ungültige Anfrage" }, { status: 400 }); + } + + const { name, email, betreff, nachricht, telefon } = body; + if (!name?.trim() || !email?.trim() || !betreff?.trim()) { + return NextResponse.json({ ok: false, error: "Pflichtfelder fehlen" }, { status: 400 }); + } + + const result = await sendeKontaktEmail({ name, email, betreff, nachricht, telefon }); + + if (!result.sent && !result.queued) { + console.error( + `[Contact] UNZUSTELLBAR – Anfrage konnte weder gesendet noch in Queue gespeichert werden:\n` + + ` Zeit: ${new Date().toISOString()}\n` + + ` Name: ${name}\n` + + ` E-Mail: ${email}\n` + + ` Telefon: ${telefon ?? "(nicht angegeben)"}\n` + + ` Betreff: ${betreff}\n` + + ` Nachricht: ${nachricht ?? "(keine)"}` + ); + return NextResponse.json({ ok: false, error: "Mail konnte nicht gesendet werden" }, { status: 500 }); + } + + return NextResponse.json({ ok: true, queued: result.queued }); +} diff --git a/components/Contact.tsx b/components/Contact.tsx index 1f37602..d031829 100644 --- a/components/Contact.tsx +++ b/components/Contact.tsx @@ -1,3 +1,7 @@ +"use client"; + +import { useState } from "react"; + const contactItems = [ { icon: ( @@ -21,7 +25,41 @@ const contactItems = [ }, ]; +type Status = "idle" | "loading" | "success" | "error"; + export default function Contact() { + const [name, setName] = useState(""); + const [email, setEmail] = useState(""); + const [betreff, setBetreff] = useState(""); + const [nachricht, setNachricht] = useState(""); + const [status, setStatus] = useState("idle"); + const [errorMsg, setErrorMsg] = useState(""); + + async function handleSubmit(e: React.FormEvent) { + e.preventDefault(); + setStatus("loading"); + setErrorMsg(""); + + try { + const res = await fetch("/api/contact", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ name, email, betreff, nachricht }), + }); + const data = await res.json(); + + if (!res.ok || !data.ok) { + setErrorMsg(data.error ?? "Unbekannter Fehler"); + setStatus("error"); + } else { + setStatus("success"); + } + } catch { + setErrorMsg("Netzwerkfehler – bitte versuchen Sie es erneut."); + setStatus("error"); + } + } + return (
@@ -43,54 +81,119 @@ export default function Contact() {

- {/* Contact form */}
-
-
+ {status === "success" ? ( +
+
+ + + +
+

Anfrage gesendet!

+

+ Wir haben Ihre Nachricht erhalten und melden uns schnellstmöglich bei Ihnen. +

+ +
+ ) : ( + +
+
+ + setName(e.target.value)} + placeholder="Max Mustermann" + className="w-full px-4 py-3 rounded-xl bg-[#111925] border border-gray-700 text-white placeholder-slate-600 focus:outline-none focus:border-orange-500/60 focus:ring-1 focus:ring-orange-500/20 transition-colors" + /> +
+
+ + setEmail(e.target.value)} + placeholder="max@beispiel.de" + className="w-full px-4 py-3 rounded-xl bg-[#111925] border border-gray-700 text-white placeholder-slate-600 focus:outline-none focus:border-orange-500/60 focus:ring-1 focus:ring-orange-500/20 transition-colors" + /> +
+
+
- - Betreff + +
+ +
+ +