From c8aaf2dc3a8215aaa4d4340059d4e6bed96c4c32 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?BITARD=20Micha=C3=ABl?= <michael.bitard@beta.gouv.fr>
Date: Wed, 12 Mar 2025 14:03:39 +0000
Subject: [PATCH] =?UTF-8?q?feat(interface):=20affiche=20un=20message=20d'e?=
 =?UTF-8?q?rreur=20plus=20explicite=20quand=20un=20titre=20n'est=20pas=20t?=
 =?UTF-8?q?rouv=C3=A9=20(pub/pnm-public/camino!1669)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../activite.stories_snapshots_NotLogged.html |  2 +-
 ...tivite.stories_snapshots_Unauthorized.html |  2 +-
 ...activites.stories_snapshots_Forbidden.html |  2 +-
 ...ivites.stories_snapshots_NotConnected.html |  2 +-
 .../error.stories_snapshots_Forbidden.html    |  2 +-
 .../error.stories_snapshots_NotConnected.html |  2 +-
 packages/ui/src/components/error.tsx          |  4 +-
 packages/ui/src/components/titre.stories.tsx  | 38 +++++++++++++++++++
 ...ories_snapshots_ConnecteTitreNotFound.html |  9 +++++
 ...es_snapshots_NonConnecteTitreNotFound.html |  9 +++++
 packages/ui/src/components/titre.tsx          | 16 ++++++--
 ...lisateurs.stories_snapshots_Forbidden.html |  2 +-
 ...ateurs.stories_snapshots_NotConnected.html |  2 +-
 13 files changed, 78 insertions(+), 14 deletions(-)
 create mode 100644 packages/ui/src/components/titre.stories_snapshots_ConnecteTitreNotFound.html
 create mode 100644 packages/ui/src/components/titre.stories_snapshots_NonConnecteTitreNotFound.html

diff --git a/packages/ui/src/components/activite.stories_snapshots_NotLogged.html b/packages/ui/src/components/activite.stories_snapshots_NotLogged.html
index 089834fad..d8ba118a4 100644
--- a/packages/ui/src/components/activite.stories_snapshots_NotLogged.html
+++ b/packages/ui/src/components/activite.stories_snapshots_NotLogged.html
@@ -1,3 +1,3 @@
 <div class="fr-alert fr-alert--info fr-alert--sm">
-  <p>Vous n’avez pas accès à cette page, veuillez vous connecter</p>
+  <p>Vous n'avez pas accès à cette page, veuillez vous connecter</p>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/activite.stories_snapshots_Unauthorized.html b/packages/ui/src/components/activite.stories_snapshots_Unauthorized.html
index 3cb9a6a8f..cd58ec1b3 100644
--- a/packages/ui/src/components/activite.stories_snapshots_Unauthorized.html
+++ b/packages/ui/src/components/activite.stories_snapshots_Unauthorized.html
@@ -1,3 +1,3 @@
 <div class="fr-alert fr-alert--error fr-alert--sm">
-  <p>Erreur: vous n’avez pas le droit d’accéder à ce contenu</p>
+  <p>Erreur: vous n'avez pas le droit d’accéder à ce contenu</p>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/activites.stories_snapshots_Forbidden.html b/packages/ui/src/components/activites.stories_snapshots_Forbidden.html
index 3cb9a6a8f..cd58ec1b3 100644
--- a/packages/ui/src/components/activites.stories_snapshots_Forbidden.html
+++ b/packages/ui/src/components/activites.stories_snapshots_Forbidden.html
@@ -1,3 +1,3 @@
 <div class="fr-alert fr-alert--error fr-alert--sm">
-  <p>Erreur: vous n’avez pas le droit d’accéder à ce contenu</p>
+  <p>Erreur: vous n'avez pas le droit d’accéder à ce contenu</p>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/activites.stories_snapshots_NotConnected.html b/packages/ui/src/components/activites.stories_snapshots_NotConnected.html
index 089834fad..d8ba118a4 100644
--- a/packages/ui/src/components/activites.stories_snapshots_NotConnected.html
+++ b/packages/ui/src/components/activites.stories_snapshots_NotConnected.html
@@ -1,3 +1,3 @@
 <div class="fr-alert fr-alert--info fr-alert--sm">
-  <p>Vous n’avez pas accès à cette page, veuillez vous connecter</p>
+  <p>Vous n'avez pas accès à cette page, veuillez vous connecter</p>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/error.stories_snapshots_Forbidden.html b/packages/ui/src/components/error.stories_snapshots_Forbidden.html
index 089834fad..d8ba118a4 100644
--- a/packages/ui/src/components/error.stories_snapshots_Forbidden.html
+++ b/packages/ui/src/components/error.stories_snapshots_Forbidden.html
@@ -1,3 +1,3 @@
 <div class="fr-alert fr-alert--info fr-alert--sm">
-  <p>Vous n’avez pas accès à cette page, veuillez vous connecter</p>
+  <p>Vous n'avez pas accès à cette page, veuillez vous connecter</p>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/error.stories_snapshots_NotConnected.html b/packages/ui/src/components/error.stories_snapshots_NotConnected.html
index 3cb9a6a8f..cd58ec1b3 100644
--- a/packages/ui/src/components/error.stories_snapshots_NotConnected.html
+++ b/packages/ui/src/components/error.stories_snapshots_NotConnected.html
@@ -1,3 +1,3 @@
 <div class="fr-alert fr-alert--error fr-alert--sm">
-  <p>Erreur: vous n’avez pas le droit d’accéder à ce contenu</p>
+  <p>Erreur: vous n'avez pas le droit d’accéder à ce contenu</p>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/error.tsx b/packages/ui/src/components/error.tsx
index 57815d30c..c80596826 100644
--- a/packages/ui/src/components/error.tsx
+++ b/packages/ui/src/components/error.tsx
@@ -9,8 +9,8 @@ interface CaminoAccessErrorProps {
 
 export const CaminoAccessError: FunctionalComponent<CaminoAccessErrorProps> = props => {
   if (isNotNullNorUndefined(props.user)) {
-    return <Alert small={true} title="Erreur: vous n’avez pas le droit d’accéder à ce contenu" type="error" />
+    return <Alert small={true} title="Erreur: vous n'avez pas le droit d’accéder à ce contenu" type="error" />
   } else {
-    return <Alert small={true} title="Vous n’avez pas accès à cette page, veuillez vous connecter" type="info" />
+    return <Alert small={true} title="Vous n'avez pas accès à cette page, veuillez vous connecter" type="info" />
   }
 }
diff --git a/packages/ui/src/components/titre.stories.tsx b/packages/ui/src/components/titre.stories.tsx
index ac898ae7a..2e99ac719 100644
--- a/packages/ui/src/components/titre.stories.tsx
+++ b/packages/ui/src/components/titre.stories.tsx
@@ -14,6 +14,8 @@ import { Entreprise, entrepriseIdValidator } from 'camino-common/src/entreprise'
 import { titreIdValidator, titreSlugValidator, TitreIdOrSlug } from 'camino-common/src/validators/titres'
 import { ZERO_KM2 } from 'camino-common/src/number'
 import { CaminoRouter } from '@/typings/vue-router'
+import { CaminoHttpError } from '@/api/client-rest'
+import { HTTP_STATUS } from 'camino-common/src/http'
 
 const meta: Meta = {
   title: 'Components/Titre',
@@ -814,3 +816,39 @@ export const TitreAvecUnOctroiEnConstructionEtUnTravaux: StoryFn = () => (
     titreIdOrSlug={titre.id}
   />
 )
+
+export const NonConnecteTitreNotFound: StoryFn = () => (
+  <PureTitre
+    entreprises={entreprises}
+    currentDate={caminoDateValidator.parse('2024-03-09')}
+    currentDemarcheSlug={demarcheSlugValidator.parse('m-cx-lenoncourt-1968-exp02')}
+    initTab="points"
+    user={undefined}
+    router={routerPushMock}
+    apiClient={{
+      ...apiClient,
+      getTitreById: (_: TitreIdOrSlug) => {
+        return Promise.reject(new CaminoHttpError('Plop', HTTP_STATUS.NOT_FOUND))
+      },
+    }}
+    titreIdOrSlug={titreIdValidator.parse('s7RvqvCAgKs4DxkQBYV93cVx')}
+  />
+)
+
+export const ConnecteTitreNotFound: StoryFn = () => (
+  <PureTitre
+    entreprises={entreprises}
+    currentDate={caminoDateValidator.parse('2024-03-09')}
+    currentDemarcheSlug={demarcheSlugValidator.parse('m-cx-lenoncourt-1968-exp02')}
+    initTab="points"
+    user={{ ...testBlankUser, role: 'defaut' }}
+    router={routerPushMock}
+    apiClient={{
+      ...apiClient,
+      getTitreById: (_: TitreIdOrSlug) => {
+        return Promise.reject(new CaminoHttpError('Plop', HTTP_STATUS.NOT_FOUND))
+      },
+    }}
+    titreIdOrSlug={titreIdValidator.parse('s7RvqvCAgKs4DxkQBYV93cVx')}
+  />
+)
diff --git a/packages/ui/src/components/titre.stories_snapshots_ConnecteTitreNotFound.html b/packages/ui/src/components/titre.stories_snapshots_ConnecteTitreNotFound.html
new file mode 100644
index 000000000..b797be147
--- /dev/null
+++ b/packages/ui/src/components/titre.stories_snapshots_ConnecteTitreNotFound.html
@@ -0,0 +1,9 @@
+<div>
+  <div class="" style="display: flex; justify-content: center;">
+    <!---->
+    <div class="fr-alert fr-alert--error" role="alert">
+      <p class="fr-alert__title fr-h4">Titre non trouvé</p>Soit le titre n'existe pas, soit vous n'avez pas les droits d'y accéder
+    </div>
+    <!---->
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/titre.stories_snapshots_NonConnecteTitreNotFound.html b/packages/ui/src/components/titre.stories_snapshots_NonConnecteTitreNotFound.html
new file mode 100644
index 000000000..ce22ee69e
--- /dev/null
+++ b/packages/ui/src/components/titre.stories_snapshots_NonConnecteTitreNotFound.html
@@ -0,0 +1,9 @@
+<div>
+  <div class="" style="display: flex; justify-content: center;">
+    <!---->
+    <div class="fr-alert fr-alert--error" role="alert">
+      <p class="fr-alert__title fr-h4">Titre non trouvé</p>Connectez vous et re-essayez
+    </div>
+    <!---->
+  </div>
+</div>
\ No newline at end of file
diff --git a/packages/ui/src/components/titre.tsx b/packages/ui/src/components/titre.tsx
index 311cb2146..03355672b 100644
--- a/packages/ui/src/components/titre.tsx
+++ b/packages/ui/src/components/titre.tsx
@@ -2,7 +2,7 @@ import { computed, defineComponent, onMounted, ref, watch, inject } from 'vue'
 import { useRouter } from 'vue-router'
 import { LoadingElement } from './_ui/functional-loader'
 import { demarcheEnregistrementDemandeDateFind, DemarcheEtapeFondamentale, DemarcheSlug, demarcheSlugValidator } from 'camino-common/src/demarche'
-import { AsyncData } from '@/api/client-rest'
+import { AsyncData, CaminoHttpError } from '@/api/client-rest'
 import { User, isAdministration, isEntrepriseOrBureauDEtude, isSuper } from 'camino-common/src/roles'
 import { capitalize } from 'camino-common/src/strings'
 import { TitresTypes } from 'camino-common/src/static/titresTypes'
@@ -45,6 +45,7 @@ import { DemarchesConsentement } from './titre/demarche-consentement'
 import { useState } from '@/utils/vue-tsx-utils'
 import { isMachineWithConsentement, machineIdFind } from 'camino-common/src/machines'
 import { InitialSort } from './_ui/table'
+import { HTTP_STATUS } from 'camino-common/src/http'
 
 const activitesSort: InitialSort<string> = {
   colonne: activitesColonneIdAnnee,
@@ -177,9 +178,16 @@ export const PureTitre = defineComponent<Props>(props => {
         }
       } catch (e: any) {
         console.error('error', e)
-        titreData.value = {
-          status: 'ERROR',
-          message: e.message ?? "Une erreur s'est produite",
+        if (e instanceof CaminoHttpError && e.statusCode === HTTP_STATUS.NOT_FOUND) {
+          titreData.value = {
+            status: 'NEW_ERROR',
+            error: { message: 'Titre non trouvé', detail: isNullOrUndefined(props.user) ? 'Connectez vous et re-essayez' : "Soit le titre n'existe pas, soit vous n'avez pas les droits d'y accéder" },
+          }
+        } else {
+          titreData.value = {
+            status: 'ERROR',
+            message: e.message ?? "Une erreur s'est produite",
+          }
         }
       }
     }
diff --git a/packages/ui/src/components/utilisateurs.stories_snapshots_Forbidden.html b/packages/ui/src/components/utilisateurs.stories_snapshots_Forbidden.html
index 3cb9a6a8f..cd58ec1b3 100644
--- a/packages/ui/src/components/utilisateurs.stories_snapshots_Forbidden.html
+++ b/packages/ui/src/components/utilisateurs.stories_snapshots_Forbidden.html
@@ -1,3 +1,3 @@
 <div class="fr-alert fr-alert--error fr-alert--sm">
-  <p>Erreur: vous n’avez pas le droit d’accéder à ce contenu</p>
+  <p>Erreur: vous n'avez pas le droit d’accéder à ce contenu</p>
 </div>
\ No newline at end of file
diff --git a/packages/ui/src/components/utilisateurs.stories_snapshots_NotConnected.html b/packages/ui/src/components/utilisateurs.stories_snapshots_NotConnected.html
index 089834fad..d8ba118a4 100644
--- a/packages/ui/src/components/utilisateurs.stories_snapshots_NotConnected.html
+++ b/packages/ui/src/components/utilisateurs.stories_snapshots_NotConnected.html
@@ -1,3 +1,3 @@
 <div class="fr-alert fr-alert--info fr-alert--sm">
-  <p>Vous n’avez pas accès à cette page, veuillez vous connecter</p>
+  <p>Vous n'avez pas accès à cette page, veuillez vous connecter</p>
 </div>
\ No newline at end of file
-- 
GitLab