"use client"; import { useState } from "react"; interface OeffnungsZeit { tag: string; von: string; bis: string } interface ContactProps { telefon?: string; email?: string; adresseZeile1?: string; adresseZeile2?: string; oeffnungszeiten?: OeffnungsZeit[]; } type Status = "idle" | "loading" | "success" | "error"; export default function Contact({ telefon = "+49 171 9345193", email = "kontakt@mbo-tech-it.de", adresseZeile1 = "Mörikestr. 2", adresseZeile2 = "74564 Crailsheim", oeffnungszeiten, }: ContactProps = {}) { const contactItems = [ { icon: ( ), label: "Telefon", value: telefon, href: `tel:${telefon.replace(/\s/g, "")}`, }, { icon: ( ), label: "E-Mail", value: email, href: `mailto:${email}`, }, { icon: ( ), label: "Standort", value: `${adresseZeile1}, ${adresseZeile2}`, href: `https://maps.google.com/?q=${encodeURIComponent(adresseZeile1 + " " + adresseZeile2)}`, }, ]; const [name, setName] = useState(""); const [emailInput, setEmailInput] = 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: emailInput, 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 ( {/* Header */} Kontakt Projekt anfragen Sie haben ein IT-Projekt oder eine Frage? Schreiben Sie uns — wir melden uns schnellstmöglich bei Ihnen. {status === "success" ? ( Anfrage gesendet! Wir haben Ihre Nachricht erhalten und melden uns schnellstmöglich bei Ihnen. { setStatus("idle"); setName(""); setEmailInput(""); setBetreff(""); setNachricht(""); }} className="btn-secondary px-6 py-2" > Neue Anfrage ) : ( Name setName(e.target.value)} placeholder="Max Mustermann" className="w-full px-4 py-3 rounded-xl bg-slate-50 dark:bg-[#111925] border border-slate-300 dark:border-gray-700 text-slate-900 dark:text-white placeholder-slate-400 dark:placeholder-slate-600 focus:outline-none focus:border-orange-500/60 focus:ring-1 focus:ring-orange-500/20 transition-colors" /> E-Mail setEmailInput(e.target.value)} placeholder="max@beispiel.de" className="w-full px-4 py-3 rounded-xl bg-slate-50 dark:bg-[#111925] border border-slate-300 dark:border-gray-700 text-slate-900 dark:text-white placeholder-slate-400 dark:placeholder-slate-600 focus:outline-none focus:border-orange-500/60 focus:ring-1 focus:ring-orange-500/20 transition-colors" /> Betreff setBetreff(e.target.value)} className="w-full px-4 py-3 rounded-xl bg-slate-50 dark:bg-[#111925] border border-slate-300 dark:border-gray-700 text-slate-900 dark:text-white focus:outline-none focus:border-orange-500/60 focus:ring-1 focus:ring-orange-500/20 transition-colors appearance-none" > Thema auswählen... Hard- & Software Netzwerk & WLAN Datensicherung & Backup Docker Installation Fernwartung & Support Hetzner Cloud Infrastruktur IT-Beratung IT-Sicherheit & Datenschutz Proxmox Virtualisierung Server & Hosting Webseiten & Webanwendungen Sonstiges Nachricht setNachricht(e.target.value)} placeholder="Beschreiben Sie Ihr Projekt oder Ihre Anfrage..." className="w-full px-4 py-3 rounded-xl bg-slate-50 dark:bg-[#111925] border border-slate-300 dark:border-gray-700 text-slate-900 dark:text-white placeholder-slate-400 dark:placeholder-slate-600 focus:outline-none focus:border-orange-500/60 focus:ring-1 focus:ring-orange-500/20 transition-colors resize-none" /> {status === "error" && ( Nachricht konnte nicht gesendet werden. Bitte versuchen Sie es erneut oder kontaktieren Sie uns direkt. {errorMsg && {errorMsg}} )} {status === "loading" ? ( <> Wird gesendet... > ) : ( "Nachricht senden" )} )} {/* Divider */} oder direkt {/* Contact info */} {contactItems.map((item) => ( {item.icon} {item.label} {item.value} ))} {oeffnungszeiten && oeffnungszeiten.length > 0 && ( Öffnungszeiten {oeffnungszeiten.map((oz) => ( {oz.tag} {oz.von} – {oz.bis} ))} )} ); }
Sie haben ein IT-Projekt oder eine Frage? Schreiben Sie uns — wir melden uns schnellstmöglich bei Ihnen.
Wir haben Ihre Nachricht erhalten und melden uns schnellstmöglich bei Ihnen.