refactor: Affichage des notifications dans la partie "Users"

(login/new/reset)
This commit is contained in:
N3WT DE COMPET
2025-05-31 09:22:35 +02:00
parent 3a2455f918
commit e509625811
5 changed files with 49 additions and 88 deletions

View File

@ -437,7 +437,7 @@ class NewPasswordView(APIView):
} }
) )
def post(self, request): def post(self, request):
retourErreur = error.returnMessage[error.BAD_URL] retourErreur = ''
retour = '' retour = ''
newProfilConnection = JSONParser().parse(request) newProfilConnection = JSONParser().parse(request)

View File

@ -14,20 +14,18 @@ import { useCsrfToken } from '@/context/CsrfContext'; // Importez le hook useCsr
import logger from '@/utils/logger'; import logger from '@/utils/logger';
import { useEstablishment } from '@/context/EstablishmentContext'; import { useEstablishment } from '@/context/EstablishmentContext';
import { useNotification } from '@/context/NotificationContext';
export default function Page() { export default function Page() {
const [errorMessage, setErrorMessage] = useState('');
const [userFieldError, setUserFieldError] = useState('');
const [passwordFieldError, setPasswordFieldError] = useState('');
const { initializeContextWithSession } = useEstablishment(); const { initializeContextWithSession } = useEstablishment();
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
const router = useRouter(); const router = useRouter();
const csrfToken = useCsrfToken(); // Utilisez le hook useCsrfToken const csrfToken = useCsrfToken(); // Utilisez le hook useCsrfToken
const { showNotification } = useNotification();
function handleFormLogin(formData) { function handleFormLogin(formData) {
setIsLoading(true); setIsLoading(true);
setErrorMessage('');
login({ login({
email: formData.get('login'), email: formData.get('login'),
@ -37,7 +35,11 @@ export default function Page() {
logger.debug('Sign In Result', result); logger.debug('Sign In Result', result);
if (result.error) { if (result.error) {
setErrorMessage(result.error); showNotification(
result.error,
'error',
'Erreur'
);
setIsLoading(false); setIsLoading(false);
} else { } else {
// On initialise le contexte establishement avec la session // On initialise le contexte establishement avec la session
@ -48,7 +50,11 @@ export default function Page() {
if (url) { if (url) {
router.push(url); router.push(url);
} else { } else {
setErrorMessage('Type de rôle non géré'); showNotification(
'Type de rôle non géré',
'error',
'Erreur'
);
} }
}); });
setIsLoading(false); setIsLoading(false);
@ -59,8 +65,10 @@ export default function Page() {
error error
); );
setIsLoading(false); setIsLoading(false);
setErrorMessage( showNotification(
'Une erreur est survenue lors de la récupération de la session.' 'Une erreur est survenue lors de la récupération de la session.',
'error',
'Erreur'
); );
}); });
} }
@ -68,7 +76,11 @@ export default function Page() {
.catch((error) => { .catch((error) => {
logger.error('Erreur lors de la connexion:', error); logger.error('Erreur lors de la connexion:', error);
setIsLoading(false); setIsLoading(false);
setErrorMessage('Une erreur est survenue lors de la connexion.'); showNotification(
'Une erreur est survenue lors de la connexion.',
'error',
'Erreur'
);
}); });
} }
@ -98,7 +110,6 @@ export default function Page() {
IconItem={User} IconItem={User}
label="Identifiant" label="Identifiant"
placeholder="Identifiant" placeholder="Identifiant"
errorMsg={userFieldError}
className="w-full mb-5" className="w-full mb-5"
/> />
<InputTextIcon <InputTextIcon
@ -107,11 +118,9 @@ export default function Page() {
IconItem={KeySquare} IconItem={KeySquare}
label="Mot de passe" label="Mot de passe"
placeholder="Mot de passe" placeholder="Mot de passe"
errorMsg={passwordFieldError}
className="w-full mb-5" className="w-full mb-5"
/> />
<div className="input-group mb-4"></div> <div className="input-group mb-4"></div>
<label className="text-red-500">{errorMessage}</label>
<label> <label>
<a <a
className="float-right mb-4" className="float-right mb-4"

View File

@ -3,11 +3,10 @@
import React, { useState } from 'react'; import React, { useState } from 'react';
import DjangoCSRFToken from '@/components/DjangoCSRFToken'; import DjangoCSRFToken from '@/components/DjangoCSRFToken';
import Logo from '@/components/Logo'; import Logo from '@/components/Logo';
import { useSearchParams } from 'next/navigation';
import InputTextIcon from '@/components/InputTextIcon'; import InputTextIcon from '@/components/InputTextIcon';
import Loader from '@/components/Loader'; // Importez le composant Loader import Loader from '@/components/Loader';
import Button from '@/components/Button'; // Importez le composant Button import Button from '@/components/Button';
import { User } from 'lucide-react'; // Importez directement les icônes nécessaires import { User } from 'lucide-react';
import { FE_USERS_LOGIN_URL } from '@/utils/Url'; import { FE_USERS_LOGIN_URL } from '@/utils/Url';
import { useCsrfToken } from '@/context/CsrfContext'; import { useCsrfToken } from '@/context/CsrfContext';
import { sendNewPassword } from '@/app/actions/authAction'; import { sendNewPassword } from '@/app/actions/authAction';
@ -15,21 +14,16 @@ import logger from '@/utils/logger';
import { useNotification } from '@/context/NotificationContext'; import { useNotification } from '@/context/NotificationContext';
export default function Page() { export default function Page() {
const searchParams = useSearchParams();
const { showNotification } = useNotification(); const { showNotification } = useNotification();
const [errorMessage, setErrorMessage] = useState('');
const [userFieldError, setUserFieldError] = useState('');
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
const [popupConfirmAction, setPopupConfirmAction] = useState(null);
const csrfToken = useCsrfToken(); const csrfToken = useCsrfToken();
function validate(formData) { function validate(formData) {
const data = { email: formData.get('email') }; const data = { email: formData.get('email') };
setIsLoading(true);
sendNewPassword(data, csrfToken) sendNewPassword(data, csrfToken)
.then((data) => { .then((data) => {
logger.debug('Success:', data); logger.debug('Success:', data);
setUserFieldError('');
setErrorMessage('');
if (data.message !== '') { if (data.message !== '') {
showNotification( showNotification(
data.message, data.message,
@ -38,32 +32,32 @@ export default function Page() {
); );
router.push(`${FE_USERS_LOGIN_URL}`); router.push(`${FE_USERS_LOGIN_URL}`);
} else { } else {
if (data.errorFields) {
setUserFieldError(data.errorFields.email);
showNotification(
data.errorMessage,
'error',
'Erreur'
);
}
if (data.errorMessage) { if (data.errorMessage) {
showNotification( showNotification(
data.errorMessage, data.errorMessage,
'error', 'error',
'Erreur' 'Erreur'
); );
} else if (data.errorFields) {
showNotification(
data.errorFields.email,
'error',
'Erreur'
);
} }
} }
setIsLoading(false);
}) })
.catch((error) => { .catch((error) => {
logger.error('Error fetching data:', error); logger.error('Error fetching data:', error);
setIsLoading(false);
error = error.errorMessage; error = error.errorMessage;
logger.debug(error); logger.debug(error);
}); });
} }
if (isLoading === true) { if (isLoading === true) {
return <Loader />; // Affichez le composant Loader return <Loader />;
} else { } else {
return ( return (
<> <>
@ -88,10 +82,8 @@ export default function Page() {
IconItem={User} IconItem={User}
label="Identifiant" label="Identifiant"
placeholder="Identifiant" placeholder="Identifiant"
errorMsg={userFieldError}
className="w-full" className="w-full"
/> />
<p className="text-red-500">{errorMessage}</p>
<div className="form-group-submit mt-4"> <div className="form-group-submit mt-4">
<Button <Button
text="Réinitialiser" text="Réinitialiser"

View File

@ -6,12 +6,12 @@ import DjangoCSRFToken from '@/components/DjangoCSRFToken';
import Logo from '@/components/Logo'; import Logo from '@/components/Logo';
import { useSearchParams, useRouter } from 'next/navigation'; import { useSearchParams, useRouter } from 'next/navigation';
import InputTextIcon from '@/components/InputTextIcon'; import InputTextIcon from '@/components/InputTextIcon';
import Loader from '@/components/Loader'; // Importez le composant Loader import Loader from '@/components/Loader';
import Button from '@/components/Button'; // Importez le composant Button import Button from '@/components/Button';
import { FE_USERS_LOGIN_URL } from '@/utils/Url'; import { FE_USERS_LOGIN_URL } from '@/utils/Url';
import { KeySquare } from 'lucide-react'; // Importez directement les icônes nécessaires import { KeySquare } from 'lucide-react';
import { useCsrfToken } from '@/context/CsrfContext'; import { useCsrfToken } from '@/context/CsrfContext';
import { getResetPassword, resetPassword } from '@/app/actions/authAction'; import { resetPassword } from '@/app/actions/authAction';
import logger from '@/utils/logger'; import logger from '@/utils/logger';
import { useNotification } from '@/context/NotificationContext'; import { useNotification } from '@/context/NotificationContext';
@ -19,44 +19,20 @@ export default function Page() {
const searchParams = useSearchParams(); const searchParams = useSearchParams();
const { showNotification } = useNotification(); const { showNotification } = useNotification();
const uuid = searchParams.get('uuid'); const uuid = searchParams.get('uuid');
const [errorMessage, setErrorMessage] = useState('');
const [password1FieldError, setPassword1FieldError] = useState('');
const [password2FieldError, setPassword2FieldError] = useState('');
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
const router = useRouter(); const router = useRouter();
const csrfToken = useCsrfToken(); const csrfToken = useCsrfToken();
useEffect(() => {
getResetPassword(uuid)
.then((data) => {
logger.debug('Success:', data);
setIsLoading(true);
if (data.errorFields) {
setPassword1FieldError(data.errorFields.password1);
setPassword2FieldError(data.errorFields.password2);
}
if (data.errorMessage) {
setErrorMessage(data.errorMessage);
}
setIsLoading(false);
})
.catch((error) => {
logger.error('Error fetching data:', error);
});
}, []);
function validate(formData) { function validate(formData) {
const data = { const data = {
password1: formData.get('password1'), password1: formData.get('password1'),
password2: formData.get('password2'), password2: formData.get('password2'),
}; };
setIsLoading(true);
resetPassword(uuid, data, csrfToken) resetPassword(uuid, data, csrfToken)
.then((data) => { .then((data) => {
if (data.message !== '') { if (data.message !== '') {
setPassword1FieldError('');
setPassword2FieldError('');
setErrorMessage('');
logger.debug('Success:', data); logger.debug('Success:', data);
showNotification( showNotification(
@ -66,34 +42,32 @@ export default function Page() {
); );
router.push(`${FE_USERS_LOGIN_URL}`); router.push(`${FE_USERS_LOGIN_URL}`);
} else { } else {
if (data.errorMessage) { if (data.errorMessage) {
showNotification( showNotification(
data.errorMessage, data.errorMessage,
'error', 'error',
'Erreur' 'Erreur'
); );
} } else if (data.errorFields) {
if (data.errorFields) {
showNotification( showNotification(
data.errorFields.password1, data.errorFields.password1,
'error', 'error',
'Erreur' 'Erreur'
); );
setPassword1FieldError(data.errorFields.password1);
setPassword2FieldError(data.errorFields.password2);
} }
} }
setIsLoading(false);
}) })
.catch((error) => { .catch((error) => {
logger.error('Error fetching data:', error); logger.error('Error fetching data:', error);
error = error.errorMessage; error = error.errorMessage;
logger.debug(error); logger.debug(error);
setIsLoading(false);
}); });
} }
if (isLoading === true) { if (isLoading === true) {
return <Loader />; // Affichez le composant Loader return <Loader />;
} else { } else {
return ( return (
<> <>
@ -118,7 +92,6 @@ export default function Page() {
IconItem={KeySquare} IconItem={KeySquare}
label="Mot de passe" label="Mot de passe"
placeholder="Mot de passe" placeholder="Mot de passe"
errorMsg={password1FieldError}
className="w-full mb-5" className="w-full mb-5"
/> />
<InputTextIcon <InputTextIcon
@ -127,10 +100,8 @@ export default function Page() {
IconItem={KeySquare} IconItem={KeySquare}
label="Confirmation mot de passe" label="Confirmation mot de passe"
placeholder="Confirmation mot de passe" placeholder="Confirmation mot de passe"
errorMsg={password2FieldError}
className="w-full" className="w-full"
/> />
<label className="text-red-500">{errorMessage}</label>
<div className="form-group-submit mt-4"> <div className="form-group-submit mt-4">
<Button <Button
text="Enregistrer" text="Enregistrer"

View File

@ -199,14 +199,3 @@ export const resetPassword = (uuid, data, csrfToken) => {
}); });
return fetch(request).then(requestResponseHandler).catch(errorHandler); return fetch(request).then(requestResponseHandler).catch(errorHandler);
}; };
export const getResetPassword = (uuid) => {
const url = `${BE_AUTH_RESET_PASSWORD_URL}/${uuid}`;
return fetch(url, {
headers: {
'Content-Type': 'application/json',
},
})
.then(requestResponseHandler)
.catch(errorHandler);
};