diff --git a/src/app/admin/actions/content.ts b/src/app/admin/actions/content.ts index 33f36a7..7e251b8 100644 --- a/src/app/admin/actions/content.ts +++ b/src/app/admin/actions/content.ts @@ -7,7 +7,7 @@ import { CONTENT_REGISTRY } from "@/lib/content-registry"; import { isValidUploadPath, isValidVideoUploadPath } from "@/lib/uploads"; import { requireAdmin } from "./_shared"; import { fail, succeed } from "@/lib/flash"; -import { z } from "zod"; +import { normalizeContactEmail } from "@/lib/contact-email"; const COMPANY_EMAIL_KEY = "company.email"; @@ -51,13 +51,17 @@ export async function updateSiteContentAction(formData: FormData): Promise if (def.type === "video" && valueDe !== "" && !isValidVideoUploadPath(valueDe)) { continue; } - // Die Firmen-E-Mail steht im Impressum (§ 5 Abs. 1 Nr. 2 DDG verlangt - // eine direkt nutzbare Adresse), in der Widerrufsbelehrung und in - // mailto-Links. Eine verschleierte Schreibweise ("info [at] …") waere - // dort rechtlich angreifbar und technisch unbrauchbar — daher wird der - // ganze Speichervorgang abgelehnt statt still uebernommen. - if (def.key === COMPANY_EMAIL_KEY && !z.string().trim().email().safeParse(valueDe).success) { - return fail("/admin/inhalte", "Bitte gib als Firmen-E-Mail eine vollständige, gültige Adresse an (z. B. info@wabenhain.com). Sie steht im Impressum und muss direkt nutzbar sein."); + // Die Firmen-E-Mail darf so eingetragen werden, wie sie gemeint ist — + // auch verschleiert ("info [at] …", "info [á] …"). Gespeichert wird der + // Eintrag unveraendert; die Website rechnet ihn in die echte Adresse um + // und zeigt sie geschuetzt an (lib/contact-email.ts). Abgelehnt wird nur, + // was sich in keine gueltige Adresse umrechnen laesst — sonst stuende im + // Impressum ein Kontaktweg, der ins Leere fuehrt. + if (def.key === COMPANY_EMAIL_KEY && normalizeContactEmail(valueDe) === null) { + return fail( + "/admin/inhalte", + "Die Firmen-E-Mail ergibt keine gültige Adresse. Möglich sind z. B. info@wabenhain.com, info [at] wabenhain.com oder info [á] wabenhain.com." + ); } updates.push({ key: def.key, valueDe: def.key === COMPANY_EMAIL_KEY ? valueDe.trim() : valueDe, valueEn: null }); } diff --git a/src/app/kontakt/page.tsx b/src/app/kontakt/page.tsx index 0073c05..c57b7d4 100644 --- a/src/app/kontakt/page.tsx +++ b/src/app/kontakt/page.tsx @@ -3,6 +3,7 @@ import { Container, SectionHeading } from "@/components/ui"; import { HoneycombPattern, HexMark } from "@/components/honeycomb"; import { ScrollReveal } from "@/components/scroll-reveal"; import { getCompanyInfo } from "@/lib/company-info"; +import { ContactEmail } from "@/components/contact-email"; import { getLocale } from "@/i18n/locale"; import { getDictionary } from "@/i18n/get-dictionary"; @@ -32,22 +33,25 @@ export default async function KontaktPage() {
- - {company.email} - - + {/* Vor Adress-Sammlern geschuetzt: im HTML steht nur + "info [at] …", den mailto-Link baut erst der Browser. */} +