From a47e91e9d5d871f1b4be1e3c2d6976e7a5ed2669 Mon Sep 17 00:00:00 2001 From: Nick Szaunig Date: Wed, 7 Oct 2026 00:56:30 +0200 Subject: [PATCH] feat: Telefonnummer im Kontaktformular ist Pflicht MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Gleiche Prüfung wie bei der Buchung: mindestens 6 Zeichen, nur Ziffern, Leerzeichen und + ( ) / -. Co-Authored-By: Claude Opus 5.5 (1M context) --- src/components/sections/ContactSection.tsx | 4 ++-- src/lib/contact.ts | 8 +++++++- tests/contact.integration.test.ts | 8 ++++++-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/components/sections/ContactSection.tsx b/src/components/sections/ContactSection.tsx index 2756617..ac14373 100644 --- a/src/components/sections/ContactSection.tsx +++ b/src/components/sections/ContactSection.tsx @@ -101,8 +101,8 @@ export function ContactSection() { {error("email")}
- - + + {error("phone")}
diff --git a/src/lib/contact.ts b/src/lib/contact.ts index 23bc4a6..16ecd02 100644 --- a/src/lib/contact.ts +++ b/src/lib/contact.ts @@ -28,7 +28,13 @@ const optionalText = (max: number) => export const contactRequestSchema = z.object({ name: z.string().trim().min(2, "Bitte gib deinen Namen an.").max(120), email: z.string().trim().max(200).pipe(z.email("Bitte gib eine gültige E-Mail-Adresse an.")), - phone: optionalText(60), + // Gleiche Regel wie bei der Buchung. + phone: z + .string("Bitte gib eine Telefonnummer an.") + .trim() + .min(6, "Bitte gib eine Telefonnummer an.") + .max(40) + .regex(/^[+0-9 ()/-]+$/, "Die Telefonnummer darf nur Ziffern, Leerzeichen und + ( ) / - enthalten."), availability: optionalText(200), message: optionalText(2000), privacy: z.literal(true, { error: "Bitte bestätige die Datenschutzhinweise." }), diff --git a/tests/contact.integration.test.ts b/tests/contact.integration.test.ts index 48ec55c..221b348 100644 --- a/tests/contact.integration.test.ts +++ b/tests/contact.integration.test.ts @@ -10,7 +10,7 @@ function request(overrides: Record = {}) { return contactRequestSchema.parse({ name: "Lena Beispiel", email: "lena@example.org", - phone: "", + phone: "+49 170 1234567", availability: "abends", message: "Passt das Camp für Einsteigerinnen?", privacy: true, @@ -61,6 +61,10 @@ describe("Erstgespräch", () => { test("Pflichtangaben und Einwilligung werden serverseitig geprüft", () => { expect(contactRequestSchema.safeParse({ name: "L", email: "kein-mail", privacy: false }).success).toBe(false); expect(contactRequestSchema.safeParse({ name: "Lena", email: "lena@example.org", privacy: false }).success).toBe(false); - expect(request({ phone: " " }).phone).toBeNull(); + const base = { name: "Lena", email: "lena@example.org", privacy: true }; + expect(contactRequestSchema.safeParse(base).success).toBe(false); + expect(contactRequestSchema.safeParse({ ...base, phone: " " }).success).toBe(false); + expect(contactRequestSchema.safeParse({ ...base, phone: "abc123456" }).success).toBe(false); + expect(request({ phone: " +49 170 1234567 " }).phone).toBe("+49 170 1234567"); }); });