diff --git a/src/pages/PageNotFound/PageNotFound.jsx b/src/pages/PageNotFound/PageNotFound.jsx new file mode 100644 index 0000000..27b8630 --- /dev/null +++ b/src/pages/PageNotFound/PageNotFound.jsx @@ -0,0 +1,24 @@ +import Background from "../../components/background/background.jsx"; +import styles from "./PageNotFound.module.css" +import { useNavigate } from "react-router"; + +export default function PageNotFound() { + + const navigate = useNavigate(); + + return +
+

Page non trouvée

+
+

+ Désolé, la page que vous recherchez n’existe pas ou n’est plus disponible.
+ Vous pouvez :
+ - Vérifier l’URL pour une éventuelle erreur de saisie.
+ - Revenir à l’accueil navigate("/")} className={styles.redirectSpan}>ici.
+ +

+

Contact : contact@example.com

+
+
+
+} \ No newline at end of file diff --git a/src/pages/PageNotFound/PageNotFound.module.css b/src/pages/PageNotFound/PageNotFound.module.css new file mode 100644 index 0000000..70e36f9 --- /dev/null +++ b/src/pages/PageNotFound/PageNotFound.module.css @@ -0,0 +1,33 @@ +.title { + color: white; + font-size: xx-large; + margin-bottom: 20px; +} + +.content { + display: flex; + flex-direction: column; + z-index: 2; + padding: 10px; +} + +.container { + padding: 20px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 15px; + + p { + font-size: large; + } +} +.redirectSpan { + color: blue; + text-decoration: underline; +} + +.redirectSpan:hover { + cursor: pointer; +} \ No newline at end of file diff --git a/src/pages/VolunteerProfile/VolunteerProfilePage.jsx b/src/pages/VolunteerProfile/VolunteerProfilePage.jsx index 06b4ee3..1f18805 100644 --- a/src/pages/VolunteerProfile/VolunteerProfilePage.jsx +++ b/src/pages/VolunteerProfile/VolunteerProfilePage.jsx @@ -4,20 +4,28 @@ import { useEffect, useState } from "react"; import getUserById from "../../utils/users/getUserById.js"; import formatDate from "../../utils/date/formatDate.js"; import Task from "../../components/Task/Task.jsx"; +import { useNavigate } from "react-router"; export default function VolunteerProfilePage() { const params = useParams(); const id = params.id; + const navigate = useNavigate(); + const [user, setUser] = useState({}); useEffect(() => { (async () => { - const data = await getUserById(id); - setUser(data); - }) () - }, []); + const result = await getUserById(id); + if (result?.error === 'not_found') { + navigate("/404"); + } else { + setUser(result); + } + })(); + }, [id]); + return
diff --git a/src/router.js b/src/router.js index 25c91b9..e9b0c56 100644 --- a/src/router.js +++ b/src/router.js @@ -9,6 +9,7 @@ import ProfilePage from "./pages/Profile/ProfilePage"; import EventsPage from "./pages/Events/EventsPage.jsx"; import ValidationErrorPage from "./pages/waitValidationPage/ValidationErrorPage.jsx"; import VolunteerProfilePage from "./pages/VolunteerProfile/VolunteerProfilePage.jsx"; +import PageNotFound from "./pages/PageNotFound/PageNotFound.jsx"; const router = createBrowserRouter([ { @@ -23,6 +24,14 @@ const router = createBrowserRouter([ path: "/error/validation", Component: ValidationErrorPage }, + { + path: "/*", + Component: PageNotFound, + }, + { + path: "/404", + Component: PageNotFound, + }, { path: "/", Component: Layout, diff --git a/src/utils/users/getUserById.js b/src/utils/users/getUserById.js index 59af94a..1fad659 100644 --- a/src/utils/users/getUserById.js +++ b/src/utils/users/getUserById.js @@ -1,4 +1,4 @@ -export default async function getUserById (id) { +export default async function getUserById(id) { try { const res = await fetch(`http://${import.meta.env.VITE_API_URL}/api/users/${id}`, { method: 'GET', @@ -9,12 +9,15 @@ export default async function getUserById (id) { }); if (!res.ok) { + if (res.status === 404) { + return { error: 'not_found' }; + } throw new Error(`Erreur serveur : ${res.status}`); } return await res.json(); } catch (err) { console.error('Erreur :', err); - return null; + return { error: 'server_error' }; } -} \ No newline at end of file +}