From d07a5bd9a84b587bb1637746f4bc5c38252c059b Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 24 Feb 2026 21:27:24 +0100 Subject: [PATCH] quick fix --- Caddyfile | 6 +- src/Web/lan-frontend/app/register/page.tsx | 77 +++++++++++++++++----- 2 files changed, 63 insertions(+), 20 deletions(-) diff --git a/Caddyfile b/Caddyfile index 9103411..cbdbfcc 100644 --- a/Caddyfile +++ b/Caddyfile @@ -1,10 +1,6 @@ -anmalan.vbytes.se { +anmalan.vbytes.se, xn--anmlan-dua.vbytes.se { reverse_proxy localhost:5000 - log { - output file /var/log/caddy/access.log - } - encode gzip zstd header { diff --git a/src/Web/lan-frontend/app/register/page.tsx b/src/Web/lan-frontend/app/register/page.tsx index 5ebb383..991f80e 100644 --- a/src/Web/lan-frontend/app/register/page.tsx +++ b/src/Web/lan-frontend/app/register/page.tsx @@ -14,8 +14,19 @@ interface EventContent { const normalizeSsn = (value: string) => value.replace(/[\s\-+]/g, "").replace(/\D/g, ""); -const hasValidSsnLength = (value: string) => - value.length === 10 || value.length === 12; + +const isValidSsnFormat = (value: string) => { + if (!/^\d{12}$/.test(value)) return false; + const month = parseInt(value.substring(4, 6)); + const day = parseInt(value.substring(6, 8)); + return month >= 1 && month <= 12 && day >= 1 && day <= 31; +}; + +const getAgeFromSsn = (value: string) => { + const birthYear = parseInt(value.substring(0, 4)); + const currentYear = new Date().getFullYear(); + return currentYear - birthYear; +}; const isValidEmail = (value: string) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value); const normalizeMobileNumber = (value: string) => { @@ -119,8 +130,15 @@ export default function RegisterPage() { if (!normalizedSsn) { nextFieldErrors.ssn = "Personnummer krävs för registrering."; - } else if (!hasValidSsnLength(normalizedSsn)) { - nextFieldErrors.ssn = "Personnummer måste vara 10 eller 12 siffror."; + } else if (!isValidSsnFormat(normalizedSsn)) { + nextFieldErrors.ssn = "Ange ett giltigt personnummer (ÅÅÅÅMMDDXXXX)."; + } else { + const age = getAgeFromSsn(normalizedSsn); + if (age < 0) { + nextFieldErrors.ssn = "Personnummer kan inte vara i framtiden."; + } else if (age >= 100) { + nextFieldErrors.ssn = "Du är för gammal för att registrera dig."; + } } if (!trimmedFirstName) @@ -155,6 +173,10 @@ export default function RegisterPage() { nextFieldErrors.email = "Din e-postadress är ogiltig."; } + if (!formData.hasApprovedGdpr) { + nextFieldErrors.hasApprovedGdpr = "Du måste godkänna GDPR för att anmäla dig."; + } + if (Object.keys(nextFieldErrors).length > 0) { setFieldErrors(nextFieldErrors); setMessage({ @@ -275,6 +297,37 @@ export default function RegisterPage() {

+ {message.type === "success" && ( +
+
+
🎉
+

Klart!

+

{message.text}

+
+ + {showBecomeMemberCta && ( +
+

+ Du är inte medlem än +

+

+ Vi hittade dig inte i vårt medlemsregister. Genom att bli + medlem i vBytes hjälper du oss att anordna fler och bättre + LAN! +

+ + Klicka här för att bli medlem i vBytes + +
+ )} +
+ )} +
@@ -596,6 +649,11 @@ export default function RegisterPage() { Jag godkänner att mina personuppgifter sparas och hanteras i syfte för detta event.

+ {fieldErrors.hasApprovedGdpr && ( +

+ {fieldErrors.hasApprovedGdpr} +

+ )}
@@ -615,17 +673,6 @@ export default function RegisterPage() { )} - {showBecomeMemberCta && message.type === "success" && ( - - Klicka här för att bli medlem i vBytes - - )} -