From 60a44b2ed17caba7146dfaf52fe9a10c2fe1f136 Mon Sep 17 00:00:00 2001 From: MartinBraquet Date: Tue, 17 Feb 2026 19:35:57 +0100 Subject: [PATCH] Add age validation and error messages to optional profile form --- web/components/optional-profile-form.tsx | 54 +++++++++++++++++++++++- web/messages/de.json | 3 ++ web/messages/fr.json | 3 ++ web/pages/signup.tsx | 5 +++ 4 files changed, 64 insertions(+), 1 deletion(-) diff --git a/web/components/optional-profile-form.tsx b/web/components/optional-profile-form.tsx index 0292d2e..31125e5 100644 --- a/web/components/optional-profile-form.tsx +++ b/web/components/optional-profile-form.tsx @@ -64,6 +64,7 @@ export const OptionalProfileUserForm = (props: { const [isSubmitting, setIsSubmitting] = useState(false) const [lookingRelationship, setLookingRelationship] = useState((profile.pref_relation_styles || []).includes('relationship')) + const [ageError, setAgeError] = useState(null) const router = useRouter() const t = useT() const [heightFeet, setHeightFeet] = useState( @@ -108,7 +109,39 @@ export const OptionalProfileUserForm = (props: { fetchChoices('work', locale).then(setWorkChoices) }, [db]) + const errorToast = () => { + toast.error( + t( + 'profile.optional.error.invalid_fields', + 'Some fields are incorrect...' + ) + ) + } + const handleSubmit = async () => { + // Validate age before submitting + if (profile['age'] !== null && profile['age'] !== undefined) { + if (profile['age'] < 18) { + setAgeError( + t( + 'profile.optional.age.error_min', + 'You must be at least 18 years old' + ) + ) + setIsSubmitting(false) + errorToast() + return + } + if (profile['age'] > 100) { + setAgeError( + t('profile.optional.age.error_max', 'Please enter a valid age') + ) + setIsSubmitting(false) + errorToast() + return + } + } + setIsSubmitting(true) const { // bio: _bio, @@ -301,8 +334,27 @@ export const OptionalProfileUserForm = (props: { value={profile['age'] ?? undefined} min={18} max={100} - onChange={(e) => setProfile('age', e.target.value ? Number(e.target.value) : null)} + error={!!ageError} + onChange={(e) => { + const value = e.target.value ? Number(e.target.value) : null + if (value !== null && value < 18) { + setAgeError( + t( + 'profile.optional.age.error_min', + 'You must be at least 18 years old' + ) + ) + } else if (value !== null && value > 100) { + setAgeError( + t('profile.optional.age.error_max', 'Please enter a valid age') + ) + } else { + setAgeError(null) + } + setProfile('age', value) + }} /> + {ageError &&

{ageError}

} diff --git a/web/messages/de.json b/web/messages/de.json index bc3ffee..1d4bf14 100644 --- a/web/messages/de.json +++ b/web/messages/de.json @@ -404,6 +404,9 @@ "profile.age_exact": "genau {min} Jahre", "profile.age_older_than": "älter als {min} Jahre", "profile.age_younger_than": "jünger als {max} Jahre", + "profile.optional.error.invalid_fields": "Einige Felder sind nicht korrekt...", + "profile.optional.age.error_min": "Du musst mindestens 18 Jahre alt sein", + "profile.optional.age.error_max": "Bitte gib ein gültiges Alter ein", "profile.at": "in", "profile.basics.bio": "Biografie", "profile.basics.display_name": "Anzeigename", diff --git a/web/messages/fr.json b/web/messages/fr.json index c168ebd..b3a71fb 100644 --- a/web/messages/fr.json +++ b/web/messages/fr.json @@ -404,6 +404,9 @@ "profile.age_exact": "exactement {min} ans", "profile.age_older_than": "plus de {min} ans", "profile.age_younger_than": "moins de {max} ans", + "profile.optional.error.invalid_fields": "Certains champs sont incorrects...", + "profile.optional.age.error_min": "Vous devez avoir au moins 18 ans", + "profile.optional.age.error_max": "Veuillez entrer un âge valide", "profile.at": "à", "profile.basics.bio": "Biographie", "profile.basics.display_name": "Nom d'affichage", diff --git a/web/pages/signup.tsx b/web/pages/signup.tsx index dd1b912..e731c2a 100644 --- a/web/pages/signup.tsx +++ b/web/pages/signup.tsx @@ -14,6 +14,7 @@ import {removeNullOrUndefinedProps} from 'common/util/object' import {useProfileByUserId} from 'web/hooks/use-profile' import {ProfileWithoutUser} from 'common/profiles/profile' import {useLocale} from 'web/lib/locale' +import {Toaster} from "react-hot-toast"; export default function SignupPage() { const [step, setStep] = useState(0) @@ -99,6 +100,10 @@ export default function SignupPage() { return ( + {!user ? ( ) : (