From 180807a0ec498b2a0270dd2601b12d983e249bb6 Mon Sep 17 00:00:00 2001 From: Ayman Date: Fri, 10 Jul 2026 20:14:21 +0100 Subject: [PATCH 1/2] fix: Show error messages on invalid form inputs --- .../common/AdministrationModal/UsersPane/AddStep.jsx | 8 ++++++++ client/src/components/common/Login/Content.jsx | 3 +++ .../users/EditUserEmailStep/EditUserEmailStep.jsx | 8 ++++++++ .../users/EditUserUsernameStep/EditUserUsernameStep.jsx | 8 ++++++++ 4 files changed, 27 insertions(+) diff --git a/client/src/components/common/AdministrationModal/UsersPane/AddStep.jsx b/client/src/components/common/AdministrationModal/UsersPane/AddStep.jsx index d73a0363..4451a438 100644 --- a/client/src/components/common/AdministrationModal/UsersPane/AddStep.jsx +++ b/client/src/components/common/AdministrationModal/UsersPane/AddStep.jsx @@ -15,6 +15,7 @@ import { Input, Popup } from '../../../../lib/custom-ui'; import selectors from '../../../../selectors'; import entryActions from '../../../../entry-actions'; +import actions from '../../../../actions'; import { useForm, useNestedRef, useSteps } from '../../../../hooks'; import { isPassword, isUsername } from '../../../../utils/validator'; import { UserRoles } from '../../../../constants/Enums'; @@ -43,6 +44,11 @@ const createMessage = (error) => { type: 'error', content: 'common.usernameAlreadyInUse', }; + case 'Invalid email or username': + return { + type: 'error', + content: 'common.invalidEmailOrUsername', + }; default: return { type: 'warning', @@ -85,6 +91,7 @@ const AddStep = React.memo(({ onClose }) => { if (!isEmail(cleanData.email)) { emailFieldRef.current.select(); + dispatch(actions.createUser.failure(new Error('Invalid email or username'))); return; } @@ -100,6 +107,7 @@ const AddStep = React.memo(({ onClose }) => { if (cleanData.username && !isUsername(cleanData.username)) { usernameFieldRef.current.select(); + dispatch(actions.createUser.failure(new Error('Invalid email or username'))); return; } diff --git a/client/src/components/common/Login/Content.jsx b/client/src/components/common/Login/Content.jsx index 03904133..34418cd3 100644 --- a/client/src/components/common/Login/Content.jsx +++ b/client/src/components/common/Login/Content.jsx @@ -15,6 +15,7 @@ import { Input } from '../../../lib/custom-ui'; import selectors from '../../../selectors'; import entryActions from '../../../entry-actions'; +import actions from '../../../actions'; import { useForm, useNestedRef } from '../../../hooks'; import { isUsername } from '../../../utils/validator'; import AccessTokenSteps from '../../../constants/AccessTokenSteps'; @@ -144,11 +145,13 @@ const Content = React.memo(() => { if (!isEmail(cleanData.emailOrUsername) && !isUsername(cleanData.emailOrUsername)) { emailOrUsernameFieldRef.current.select(); + dispatch(actions.authenticate.failure(new Error('Invalid email or username'))); return; } if (!cleanData.password) { passwordFieldRef.current.focus(); + dispatch(actions.authenticate.failure(new Error('Invalid password'))); return; } diff --git a/client/src/components/users/EditUserEmailStep/EditUserEmailStep.jsx b/client/src/components/users/EditUserEmailStep/EditUserEmailStep.jsx index 96cd85c6..532841f5 100644 --- a/client/src/components/users/EditUserEmailStep/EditUserEmailStep.jsx +++ b/client/src/components/users/EditUserEmailStep/EditUserEmailStep.jsx @@ -14,6 +14,7 @@ import { Input, Popup } from '../../../lib/custom-ui'; import selectors from '../../../selectors'; import entryActions from '../../../entry-actions'; +import actions from '../../../actions'; import { useForm, useNestedRef } from '../../../hooks'; import styles from './EditUserEmailStep.module.scss'; @@ -34,6 +35,11 @@ const createMessage = (error) => { type: 'error', content: 'common.invalidCurrentPassword', }; + case 'Invalid email or username': + return { + type: 'error', + content: 'common.invalidEmailOrUsername', + }; default: return { type: 'warning', @@ -79,6 +85,7 @@ const EditUserEmailStep = React.memo(({ id, onBack, onClose }) => { if (!isEmail(cleanData.email)) { emailFieldRef.current.select(); + dispatch(actions.updateUserEmail.failure(id, new Error('Invalid email or username'))); return; } @@ -90,6 +97,7 @@ const EditUserEmailStep = React.memo(({ id, onBack, onClose }) => { if (withPasswordConfirmation) { if (!cleanData.currentPassword) { currentPasswordFieldRef.current.focus(); + dispatch(actions.updateUserEmail.failure(id, new Error('Invalid current password'))); return; } } else { diff --git a/client/src/components/users/EditUserUsernameStep/EditUserUsernameStep.jsx b/client/src/components/users/EditUserUsernameStep/EditUserUsernameStep.jsx index 2ac2fbdb..56e62073 100644 --- a/client/src/components/users/EditUserUsernameStep/EditUserUsernameStep.jsx +++ b/client/src/components/users/EditUserUsernameStep/EditUserUsernameStep.jsx @@ -13,6 +13,7 @@ import { Input, Popup } from '../../../lib/custom-ui'; import selectors from '../../../selectors'; import entryActions from '../../../entry-actions'; +import actions from '../../../actions'; import { useForm, useNestedRef } from '../../../hooks'; import { isUsername } from '../../../utils/validator'; @@ -34,6 +35,11 @@ const createMessage = (error) => { type: 'error', content: 'common.invalidCurrentPassword', }; + case 'Invalid email or username': + return { + type: 'error', + content: 'common.invalidEmailOrUsername', + }; default: return { type: 'warning', @@ -79,6 +85,7 @@ const EditUserUsernameStep = React.memo(({ id, onBack, onClose }) => { if (!cleanData.username || !isUsername(cleanData.username)) { usernameFieldRef.current.select(); + dispatch(actions.updateUserUsername.failure(id, new Error('Invalid email or username'))); return; } @@ -90,6 +97,7 @@ const EditUserUsernameStep = React.memo(({ id, onBack, onClose }) => { if (withPasswordConfirmation) { if (!cleanData.currentPassword) { currentPasswordFieldRef.current.focus(); + dispatch(actions.updateUserUsername.failure(id, new Error('Invalid current password'))); return; } } else { From 9443b855170bc0bd2762c7208ec6e2ab7defc783 Mon Sep 17 00:00:00 2001 From: Ayman Date: Fri, 10 Jul 2026 20:38:08 +0100 Subject: [PATCH 2/2] fix: Show error messages on invalid password edit --- .../users/EditUserPasswordStep/EditUserPasswordStep.jsx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/client/src/components/users/EditUserPasswordStep/EditUserPasswordStep.jsx b/client/src/components/users/EditUserPasswordStep/EditUserPasswordStep.jsx index a7ffa2e9..32a6e13c 100644 --- a/client/src/components/users/EditUserPasswordStep/EditUserPasswordStep.jsx +++ b/client/src/components/users/EditUserPasswordStep/EditUserPasswordStep.jsx @@ -14,6 +14,7 @@ import { Input, Popup } from '../../../lib/custom-ui'; import selectors from '../../../selectors'; import entryActions from '../../../entry-actions'; +import actions from '../../../actions'; import { useForm, useNestedRef } from '../../../hooks'; import { isPassword } from '../../../utils/validator'; @@ -30,6 +31,11 @@ const createMessage = (error) => { type: 'error', content: 'common.invalidCurrentPassword', }; + case 'Invalid password': + return { + type: 'error', + content: 'common.invalidPassword', + }; default: return { type: 'warning', @@ -69,11 +75,13 @@ const EditUserPasswordStep = React.memo(({ id, onBack, onClose }) => { const handleSubmit = useCallback(() => { if (!data.password || !isPassword(data.password)) { passwordFieldRef.current.select(); + dispatch(actions.updateUserPassword.failure(id, new Error('Invalid password'))); return; } if (withPasswordConfirmation && !data.currentPassword) { currentPasswordFieldRef.current.focus(); + dispatch(actions.updateUserPassword.failure(id, new Error('Invalid current password'))); return; }