Skip to content

Commit

Permalink
[MOT DE PASSE OUBLIE] Appelle l'API patch pour enregistrer le nouveau…
Browse files Browse the repository at this point in the history
… mot de passe
  • Loading branch information
firefly33 committed Nov 13, 2024
1 parent c8d5146 commit c7aa506
Show file tree
Hide file tree
Showing 10 changed files with 441 additions and 25 deletions.
3 changes: 2 additions & 1 deletion mon-aide-cyber-ui/src/domaine/Lien.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,5 @@ export type Action =
| 'se-connecter'
| 'se-deconnecter'
| 'afficher-statistiques'
| 'reinitialisation-mot-de-passe';
| 'reinitialisation-mot-de-passe'
| 'reinitialiser-mot-de-passe';
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import { TypographieH3 } from '../../../composants/communs/typographie/Typograph
export const EcranMotDePasseOublie = () => {
return (
<main role="main" className="ecran-mot-de-passe-oublie">
<div>
<div className="fr-container formulaire-colonne-gauche">
<div className="formulaire-colonne-gauche">
<div className="fr-container">
<TypographieH3 style={{ textAlign: 'center' }}>
Réinitialisation de votre mot de passe
</TypographieH3>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@

height: 800px;


.formulaire-colonne-gauche {
grid-area: formulaire;
padding: 3rem 2.5rem;
Expand Down Expand Up @@ -52,8 +51,24 @@

.actions {
display: flex;
justify-content: flex-start;
gap: 1rem;
flex-direction: column;
align-items: center;
gap: .5rem;

@include a-partir-de(lg) {
flex-direction: row;
align-items: center;
justify-content: flex-end;
gap: 1rem;
}

button {
width: 100%;

@include a-partir-de(lg) {
width: auto;
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@ export const FormulaireMotDePasseOublie = ({
);
const soumetFormulaire = (e: FormEvent<HTMLFormElement>) => {
e.preventDefault();
console.log('soumet le formulaire', e);
surSoumission(etatFormulaire.email);
};

Expand Down Expand Up @@ -126,6 +125,11 @@ export const FormulaireMotDePasseOublie = ({
adresseElectroniqueSaisie(e.target.value)
)
}
onChange={(e) =>
declencheActionFormulaire(
adresseElectroniqueSaisie(e.target.value)
)
}
/>
{etatFormulaire.erreurs?.adresseElectronique ? (
<p className="fr-error-text">
Expand All @@ -139,7 +143,11 @@ export const FormulaireMotDePasseOublie = ({
l’adresse mail indiquée afin de créer un nouveau mot de passe.
</p>
<div className="actions">
<Button type="button" variant="secondary">
<Button
type="button"
variant="secondary"
onClick={() => window.location.replace('/')}
>
Annuler
</Button>
<Button
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,19 @@
import { TypographieH3 } from '../../../composants/communs/typographie/TypographieH3/TypographieH3.tsx';
import illustrationSecuritePostesSvg from '../../../../public/images/illustration-securite-des-postes.svg';
import { FormulaireReinitialiserMotDePasseConnecte } from './formulaire-reinitialiser-mot-de-passe/FormulaireReinitialiserMotDePasseConnecte.tsx';
import 'ecran-reinitialiser-mot-de-passe.scss';
import './ecran-reinitialiser-mot-de-passe.scss';
import { useSearchParams } from 'react-router-dom';

export const EcranReinitialiserMotDePasse = () => {
const [params] = useSearchParams();
const parametresUrl = new URLSearchParams(params);

const tokenDeReinitialisation = parametresUrl.get('token')!;

console.log('token actif', tokenDeReinitialisation);


return (
<main role="main" className="ecran-reinitialiser-mot-de-passe">
<div>
<div className="fr-container formulaire-colonne-gauche">
<div className="formulaire-colonne-gauche">
<div className="fr-container">
<TypographieH3 style={{ textAlign: 'center' }}>
Réinitialisation de votre mot de passe
</TypographieH3>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@
}

height: 800px;



.formulaire-colonne-gauche {
grid-area: formulaire;
padding: 3rem 2.5rem;
Expand All @@ -38,22 +37,37 @@
}
}

.formulaire-mot-de-passe-oublie-layout {
.formulaire-reinitialiser-mot-de-passe-layout {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 1rem;

form.formulaire-mot-de-passe-oublie {
form.formulaire-reinitialiser-mot-de-passe {
display: flex;
flex-direction: column;
gap: 1rem;

.actions {
display: flex;
justify-content: flex-start;
gap: 1rem;
flex-direction: column;
align-items: center;
gap: .5rem;

@include a-partir-de(lg) {
flex-direction: row;
justify-content: center;
align-items: center;
gap: 1rem;
}

button {
width: 100%;

@include a-partir-de(lg) {
width: auto;
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,128 @@
import React from 'react';
import { FormEvent, useReducer } from 'react';
import {
confirmationMotDePasseSaisi,
initialiseFormulaireReinitialiserMotDePasse,
motDePasseSaisi,
reducteurFormulaireReinitialiserMotDePasse,
} from './reducteurFormulaireReinitialiserMotDePasse.ts';
import Button from '../../../../composants/atomes/Button/Button.tsx';
import { PasswordInput } from '../../../../composants/atomes/Input/PasswordInput.tsx';

export const FormulaireReinitialiserMotDePasse = ({
surSoumission,
}: {
surSoumission: ({
motDePasse,
confirmationMotDePasse,
}: {
motDePasse: string;
confirmationMotDePasse: string;
}) => void;
}) => {
const [etatFormulaire, declencheActionFormulaire] = useReducer(
reducteurFormulaireReinitialiserMotDePasse,
initialiseFormulaireReinitialiserMotDePasse()
);

const soumetFormulaire = (e: FormEvent<HTMLFormElement>) => {
e.preventDefault();
surSoumission({
motDePasse: etatFormulaire.motDePasse,
confirmationMotDePasse: etatFormulaire.confirmationMotDePasse,
});
};

export const FormulaireReinitialiserMotDePasse = () => {
return (
<div>FormulaireReinitialiserMotDePasse</div>
<div className="formulaire-reinitialiser-mot-de-passe-layout">
<p style={{ textAlign: 'center' }}>
Veuillez spécifier un nouveau mot de passe pour accéder à votre compte
Aidant MonAideCyber
</p>
<p>
Le mot de passe doit comporter <b>16 caractères minimum</b>, dont au
moins :
<br />
<ul>
<li>1 majuscule</li>
<li>1 minuscule</li>
<li>1 chiffre</li>
<li>1 caractère spécial parmi #?!@$%^&*-'+_()[]</li>
</ul>
</p>
<div className="mac-callout mac-callout-information">
<i className="mac-icone-information" />
<div>
Évitez d’utiliser des mots du dictionnaire, des suites de lettres, des
suites de chiffre, des dates, des informations personnelles (ex: nom,
prénom, date de naissance).
</div>
</div>
<form
className="formulaire-reinitialiser-mot-de-passe"
onSubmit={soumetFormulaire}
>
<fieldset className="fr-col-12">
<div
className={`fr-input-group ${
etatFormulaire.erreurs?.motDePasse ? 'fr-input-group--error' : ''
}`}
>
<label className="fr-label" htmlFor="motDePasse">
<span className="asterisque">*</span>
<span> Choisissez un nouveau mot de passe</span>
</label>
<PasswordInput
id="motDePasse"
name="motDePasse"
onBlur={(e) =>
declencheActionFormulaire(motDePasseSaisi(e.target.value))
}
/>
{etatFormulaire.erreurs?.motDePasse ? (
<p className="fr-error-text">
{etatFormulaire.erreurs?.motDePasse}
</p>
) : null}
</div>
</fieldset>
<fieldset className="fr-col-12">
<div
className={`fr-input-group ${
etatFormulaire.erreurs?.confirmationMotDePasse
? 'fr-input-group--error'
: ''
}`}
>
<label className="fr-label" htmlFor="confirmationMotDePasse">
<span className="asterisque">*</span>
<span> Confirmez votre nouveau mot de passe</span>
</label>
<PasswordInput
id="confirmationMotDePasse"
name="confirmationMotDePasse"
onBlur={(e) =>
declencheActionFormulaire(
confirmationMotDePasseSaisi(e.target.value)
)
}
/>
{etatFormulaire.erreurs?.confirmationMotDePasse ? (
<p className="fr-error-text">
{etatFormulaire.erreurs?.confirmationMotDePasse}
</p>
) : null}
</div>
</fieldset>
<div className="actions">
<Button
type="submit"
variant="primary"
disabled={!etatFormulaire.pretPourEnvoi}
>
Valider
</Button>
</div>
</form>
</div>
);
};
Original file line number Diff line number Diff line change
@@ -1,9 +1,80 @@
import { FormulaireReinitialiserMotDePasse } from './FormulaireReinitialiserMotDePasse.tsx';
import { useNavigationMAC } from '../../../../fournisseurs/hooks.ts';
import { useMACAPI } from '../../../../fournisseurs/api/useMACAPI.ts';
import { useRecupereContexteNavigation } from '../../../../hooks/useRecupereContexteNavigation.ts';
import { useMutation } from '@tanstack/react-query';
import { MoteurDeLiens } from '../../../MoteurDeLiens.ts';
import { constructeurParametresAPI } from '../../../../fournisseurs/api/ConstructeurParametresAPI.ts';
import { useNavigate } from 'react-router-dom';
import { Toast } from '../../../../composants/communs/Toasts/Toast.tsx';

export type CorpsReinitialiserMotDePasse = {
token: string;
motDePasse: string;
confirmationMotDePasse: string;
};
export const FormulaireReinitialiserMotDePasseConnecte = ({
token,
}: {
token: string;
}) => {
return <FormulaireReinitialiserMotDePasse />;
const navigationMAC = useNavigationMAC();
const macAPI = useMACAPI();
const navigate = useNavigate();

useRecupereContexteNavigation(
'reinitialisation-mot-de-passe:reinitialiser-mot-de-passe'
);

const { mutate, isError } = useMutation({
mutationKey: ['changer-mot-de-passe'],
mutationFn: ({
motDePasse,
confirmationMotDePasse,
}: {
motDePasse: string;
confirmationMotDePasse: string;
}) => {
if (!token || token.length === 0 || token === '')
throw new Error(
'Une erreur est survenue lors de la demande de réinitialisation de mot de passe'
);
if (!motDePasse) Promise.reject('Aucun mot de passe renseigné !');

const actionSoumettre = new MoteurDeLiens(
navigationMAC.etat
).trouveEtRenvoie('reinitialiser-mot-de-passe');

if (!actionSoumettre)
throw new Error(
'Une erreur est survenue lors de la demande de réinitialisation de mot de passe'
);

return macAPI.execute<void, void, CorpsReinitialiserMotDePasse>(
constructeurParametresAPI<CorpsReinitialiserMotDePasse>()
.url(actionSoumettre.url)
.methode(actionSoumettre.methode!)
.corps({
token: token,
motDePasse: motDePasse,
confirmationMotDePasse: confirmationMotDePasse,
})
.construis(),
(corps) => corps
);
},
onSuccess: () => {
navigate('/aidant/tableau-de-bord');
},
});

if (isError)
return (
<Toast
message="Une erreur est survenue lors de votre modification de mot de passe. Veuillez réessayer ultérieurement."
type="ERREUR"
/>
);

return <FormulaireReinitialiserMotDePasse surSoumission={mutate} />;
};
Loading

0 comments on commit c7aa506

Please sign in to comment.