}/>
diff --git a/src/components/commun/Alert.jsx b/src/components/commun/Alert.jsx
new file mode 100644
index 00000000..017e7c18
--- /dev/null
+++ b/src/components/commun/Alert.jsx
@@ -0,0 +1,17 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+
+export default function Alert({ children, titre }) {
+ return (
+
+ );
+}
+
+Alert.propTypes = {
+ children: PropTypes.node,
+ titre: PropTypes.string,
+};
+
diff --git a/src/components/commun/BoutonRadio.jsx b/src/components/commun/BoutonRadio.jsx
index e8f0894d..d6d4a105 100644
--- a/src/components/commun/BoutonRadio.jsx
+++ b/src/components/commun/BoutonRadio.jsx
@@ -5,7 +5,7 @@ export default function BoutonRadio({ children, id, nomGroupe }) {
return (
-
+
diff --git a/src/components/commun/Datepicker.jsx b/src/components/commun/Datepicker.jsx
index 38589500..58542bdd 100644
--- a/src/components/commun/Datepicker.jsx
+++ b/src/components/commun/Datepicker.jsx
@@ -7,7 +7,7 @@ export default function Datepicker({ children, id, isRequired = true, onChange,
-
+
);
}
diff --git a/src/components/commun/Input.jsx b/src/components/commun/Input.jsx
index 2b3badd6..a69a445e 100644
--- a/src/components/commun/Input.jsx
+++ b/src/components/commun/Input.jsx
@@ -6,7 +6,17 @@ export default function Input({ children, id, isRequired = true, type = 'text',
);
diff --git a/src/views/candidature-conseiller/AddressChooser.jsx b/src/views/candidature-conseiller/AddressChooser.jsx
index 32c7e7c7..8eb39f6e 100644
--- a/src/views/candidature-conseiller/AddressChooser.jsx
+++ b/src/views/candidature-conseiller/AddressChooser.jsx
@@ -4,7 +4,7 @@ import { useGeoApi } from './useGeoApi';
import { debounce } from './debounce';
export default function AddressChooser() {
- const { search, villes } = useGeoApi();
+ const { searchByName, villes } = useGeoApi();
return (
<>
@@ -12,13 +12,15 @@ export default function AddressChooser() {
id="lieuHabitation"
list="resultatsRecherche"
isRequired={false}
- onChange={debounce(event => search(event.target.value))}
+ onChange={debounce(event => searchByName(event.target.value))}
>
Votre lieu d’habitation
Saississez le nom ou le code postal de votre commune.
>
diff --git a/src/views/candidature-conseiller/CandidatureConseiller.jsx b/src/views/candidature-conseiller/CandidatureConseiller.jsx
index 70a9a723..d1c4bbe9 100644
--- a/src/views/candidature-conseiller/CandidatureConseiller.jsx
+++ b/src/views/candidature-conseiller/CandidatureConseiller.jsx
@@ -1,11 +1,14 @@
-import React, { useState } from 'react';
+import React, { useState, useEffect } from 'react';
import SommaireConseiller from './SommaireConseiller';
import InformationsDeContact from './InformationsDeContact';
import SituationEtExperience from './SituationEtExperience';
import Disponibilite from './Disponibilite';
import Motivation from './Motivation';
import EnResume from './EnResume';
+import Alert from '../../components/commun/Alert';
import { useScrollToSection } from '../../hooks/useScrollToSection';
+import { useNavigate } from 'react-router-dom';
+import { useApiAdmin } from './useApiAdmin';
import '@gouvfr/dsfr/dist/component/form/form.min.css';
import '@gouvfr/dsfr/dist/component/input/input.min.css';
@@ -14,25 +17,48 @@ import '@gouvfr/dsfr/dist/component/radio/radio.min.css';
import '@gouvfr/dsfr/dist/component/badge/badge.min.css';
import '@gouvfr/dsfr/dist/component/notice/notice.min.css';
import '@gouvfr/dsfr/dist/component/sidemenu/sidemenu.min.css';
+import '@gouvfr/dsfr/dist/component/alert/alert.min.css';
import './CandidatureConseiller.css';
export default function CandidatureConseiller() {
const [dateDisponibilite, setDateDisponibilite] = useState('');
const [isSituationValid, setIsSituationValid] = useState(true);
-
+ const [validationError, setValidationError] = useState('');
+ const { buildConseillerData, creerCandidatureConseiller } = useApiAdmin();
+ const navigate = useNavigate();
useScrollToSection();
- const validerLaCandidature = event => {
+ useEffect(() => {
+ document.title = 'Conseiller numérique - Devenir conseiller numérique';
+ }, []);
+
+ const estSituationRemplie = formData => {
+ const demandeurEmploi = formData.get('estDemandeurEmploi') === 'on';
+ const enEmploi = formData.get('estEnEmploi') === 'on';
+ const enFormation = formData.get('estEnFormation') === 'on';
+ const diplome = formData.get('estDiplomeMedNum') === 'on';
+
+ return demandeurEmploi || enEmploi || enFormation || diplome;
+ };
+
+ const validerLaCandidature = async event => {
event.preventDefault();
const formData = new FormData(event.currentTarget);
- const situations = formData.get('situations');
- if (situations === null) {
+ if (!estSituationRemplie(formData)) {
setIsSituationValid(false);
document.getElementById('situation-et-experience').scrollIntoView();
} else {
- event.currentTarget.submit();
+ const conseillerData = await buildConseillerData(formData);
+ const resultatCreation = await creerCandidatureConseiller(conseillerData);
+ if (resultatCreation.status >= 400) {
+ const error = await resultatCreation.json();
+ setValidationError(error.message);
+ window.scrollTo({ top: 0, behavior: 'smooth' });
+ } else {
+ navigate('/candidature-validee');
+ }
}
};
@@ -45,7 +71,17 @@ export default function CandidatureConseiller() {
Je veux devenir conseiller numérique
Les champs avec * sont obligatoires.
-