diff --git a/README.md b/README.md index ca583d6..206383d 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,10 @@ # To do -## For V1 : -- Revoir les titres de section (+espace au dessus des titres) - -## For V2 : -- Mettre la base de donnée en place -- Refaire en conséquence les choses nécessaires - -## For V3 : - Faire une page pour lister tous les projets +- Rafaire l'organisation du projet - Faire une page explicative par projet +- Faire du responsive +- Refaire la section des skills ## Usefull commands diff --git a/package-lock.json b/package-lock.json index ad5d14d..2a8e3ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,8 @@ "version": "0.0.0", "dependencies": { "react": "^19.1.0", - "react-dom": "^19.1.0" + "react-dom": "^19.1.0", + "react-router-dom": "^7.8.2" }, "devDependencies": { "@eslint/js": "^9.25.0", @@ -1600,6 +1601,15 @@ "dev": true, "license": "MIT" }, + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2471,6 +2481,44 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.8.2.tgz", + "integrity": "sha512-7M2fR1JbIZ/jFWqelpvSZx+7vd7UlBTfdZqf6OSdF9g6+sfdqJDAWcak6ervbHph200ePlu+7G8LdoiC3ReyAQ==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.8.2.tgz", + "integrity": "sha512-Z4VM5mKDipal2jQ385H6UBhiiEDlnJPx6jyWsTYoZQdl5TrjxEV2a9yl3Fi60NBJxYzOTGTTHXPi0pdizvTwow==", + "license": "MIT", + "dependencies": { + "react-router": "7.8.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -2544,6 +2592,12 @@ "semver": "bin/semver.js" } }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", diff --git a/package.json b/package.json index 385876e..00752b0 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,8 @@ }, "dependencies": { "react": "^19.1.0", - "react-dom": "^19.1.0" + "react-dom": "^19.1.0", + "react-router-dom": "^7.8.2" }, "devDependencies": { "@eslint/js": "^9.25.0", diff --git a/src/App.jsx b/src/App.jsx index fff1480..1161c03 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,20 +1,15 @@ import './App.css' -import Home from './components/Home.jsx' -import Experiences from './components/Experiences.jsx' -import Projects from './components/Projects.jsx' -import Skills from './components/Skills.jsx' -import Footer from './components/Footer.jsx' +import { Routes, Route, Link } from 'react-router-dom'; +import HomePage from './pages/HomePage.jsx'; +import ProjectsPage from './pages/ProjectsPage'; function App() { return ( -
- - - - -
+ + } /> + } /> + ) } diff --git a/src/components/Experiences.jsx b/src/components/Experiences.jsx index ee5f922..be29a31 100644 --- a/src/components/Experiences.jsx +++ b/src/components/Experiences.jsx @@ -10,14 +10,14 @@ function Experiences() { useEffect(() => { const fetchExperiencesAndTasks = async () => { try { - let response = await fetch('/api/experiences'); + let response = await fetch('/api/experiences/'); if (!response.ok) { throw new Error(`Erreur HTTP: ${response.status}`); } let data = await response.json(); setExperiences(data.data); - response = await fetch('/api/experienceTasks'); + response = await fetch('/api/experienceTasks/'); if (!response.ok) { throw new Error(`Erreur HTTP: ${response.status}`); } diff --git a/src/components/Projects.jsx b/src/components/Projects.jsx index 70b66da..cb44ad0 100644 --- a/src/components/Projects.jsx +++ b/src/components/Projects.jsx @@ -1,6 +1,7 @@ import SingleProject from "./SingleProject.jsx"; import "../styles/Projects.css" import React, {useEffect, useState} from "react"; +import {Link} from "react-router-dom"; function Projects() { const [projects, setProjects] = useState([]); const [error, setError] = useState(null); @@ -8,7 +9,7 @@ function Projects() { useEffect(() => { const fetchProjects = async () => { try { - const response = await fetch('/api/projects'); + const response = await fetch('/api/projects/'); if (!response.ok) { throw new Error(`Erreur HTTP: ${response.status}`); } @@ -35,9 +36,7 @@ function Projects() { ))}
-

- Show more -

+ Show more
) diff --git a/src/components/Skills.jsx b/src/components/Skills.jsx index 2d7dfdf..249a737 100644 --- a/src/components/Skills.jsx +++ b/src/components/Skills.jsx @@ -9,7 +9,7 @@ function Skills() { useEffect(() => { const fetchSkills = async () => { try { - const response = await fetch('/api/skills'); + const response = await fetch('/api/skills/'); if (!response.ok) { throw new Error(`Erreur HTTP: ${response.status}`); } diff --git a/src/main.jsx b/src/main.jsx index b9a1a6d..a85b321 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -2,9 +2,12 @@ import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' import './index.css' import App from './App.jsx' +import { BrowserRouter } from 'react-router-dom'; createRoot(document.getElementById('root')).render( - + + + , ) diff --git a/src/pages/HomePage.jsx b/src/pages/HomePage.jsx new file mode 100644 index 0000000..297d006 --- /dev/null +++ b/src/pages/HomePage.jsx @@ -0,0 +1,17 @@ +import Home from '../components/Home.jsx' +import Experiences from '../components/Experiences.jsx' +import Projects from '../components/Projects.jsx' +import Skills from '../components/Skills.jsx' +import Footer from '../components/Footer.jsx' +function HomePage() { + return ( +
+ + + + +
+ ); +} +export default HomePage; \ No newline at end of file diff --git a/src/pages/ProjectsPage.jsx b/src/pages/ProjectsPage.jsx new file mode 100644 index 0000000..81bd214 --- /dev/null +++ b/src/pages/ProjectsPage.jsx @@ -0,0 +1,38 @@ +import React, {useEffect, useState} from "react"; +import SingleProject from "../components/SingleProject.jsx"; +function ProjectsPage() { + const [projects, setProjects] = useState([]); + const [error, setError] = useState(null); + + useEffect(() => { + const fetchProjects = async () => { + try { + const response = await fetch('/api/projects/'); + if (!response.ok) { + throw new Error(`Erreur HTTP: ${response.status}`); + } + const data = await response.json(); + setProjects(data.data); + } catch (err) { + setError(err.message); + } + }; + fetchProjects(); + }, []); + + if (error) { + return
Erreur lors de la récupération des données : {error}
; + } + + + + return ( +
+

Voici mes projets

; + {projects.map(project => ( + + ))} +
+ ) +} +export default ProjectsPage; \ No newline at end of file