Compare commits
36 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2ab10c7803 | |||
| f5441f038c | |||
| e92c4227d8 | |||
| 6640136fd9 | |||
| 285daa7d54 | |||
| 56f475839d | |||
| cc8d3c78cd | |||
| 1b675fdd3e | |||
| 37a113fbf6 | |||
| 5401774e0e | |||
| b142112ce0 | |||
| 75d4f5d166 | |||
| dfbe3123d5 | |||
| a875e1dfb7 | |||
| 41dc079844 | |||
| 6847f7d2c6 | |||
| d415d1ca38 | |||
| 65060c6875 | |||
| 34869f0611 | |||
| a08689086c | |||
| 1127a608bd | |||
| 45e78dd11c | |||
| 1a26e0d2d8 | |||
| 59538b6f17 | |||
| fdc39d3928 | |||
| 9f7592ace2 | |||
| 743160af3c | |||
| 9b17d23901 | |||
| c41760c313 | |||
| 540bf7efec | |||
| fe2abff5e5 | |||
| 40d8c49908 | |||
| 3728385ebc | |||
| cc7c586d4a | |||
| 1ec3121bc1 | |||
| 9700ae889e |
@@ -7,26 +7,12 @@
|
||||
width="1822"
|
||||
height="2051"
|
||||
viewBox="0 0 1822 2051"
|
||||
sodipodi:docname="C++.png"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1" />
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Image"
|
||||
id="g1">
|
||||
<image
|
||||
width="1822"
|
||||
|
||||
|
Before Width: | Height: | Size: 157 KiB After Width: | Height: | Size: 157 KiB |
@@ -7,26 +7,12 @@
|
||||
width="1200"
|
||||
height="1200"
|
||||
viewBox="0 0 1200 1200"
|
||||
sodipodi:docname="CSS.png"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1" />
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Image"
|
||||
id="g1">
|
||||
<image
|
||||
width="1200"
|
||||
|
||||
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 56 KiB |
@@ -7,26 +7,12 @@
|
||||
width="2048"
|
||||
height="2048"
|
||||
viewBox="0 0 2048 2048"
|
||||
sodipodi:docname="Git.png"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1" />
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Image"
|
||||
id="g1">
|
||||
<image
|
||||
width="2048"
|
||||
|
||||
|
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 86 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
@@ -7,26 +7,12 @@
|
||||
width="169"
|
||||
height="169"
|
||||
viewBox="0 0 169 169"
|
||||
sodipodi:docname="image-removebg-preview.png"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1" />
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Image"
|
||||
id="g1">
|
||||
<image
|
||||
width="169"
|
||||
|
||||
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 45 KiB |
@@ -7,26 +7,12 @@
|
||||
width="973"
|
||||
height="973"
|
||||
viewBox="0 0 973 973"
|
||||
sodipodi:docname="JavaScript.png"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1" />
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Image"
|
||||
id="g1">
|
||||
<image
|
||||
width="973"
|
||||
|
||||
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 173 KiB |
@@ -7,26 +7,12 @@
|
||||
width="2560"
|
||||
height="1381"
|
||||
viewBox="0 0 2560 1381"
|
||||
sodipodi:docname="PHP.png"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1" />
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Image"
|
||||
id="g1">
|
||||
<image
|
||||
width="2560"
|
||||
|
||||
|
Before Width: | Height: | Size: 247 KiB After Width: | Height: | Size: 246 KiB |
@@ -7,26 +7,12 @@
|
||||
width="110"
|
||||
height="110"
|
||||
viewBox="0 0 110 110"
|
||||
sodipodi:docname="Pyhton.png"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1" />
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Image"
|
||||
id="g1">
|
||||
<image
|
||||
width="110"
|
||||
|
||||
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 5.9 KiB |
|
After Width: | Height: | Size: 109 KiB |
@@ -7,26 +7,12 @@
|
||||
width="301"
|
||||
height="299"
|
||||
viewBox="0 0 301 299"
|
||||
sodipodi:docname="SQL.png"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1" />
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Image"
|
||||
id="g1">
|
||||
<image
|
||||
width="301"
|
||||
|
||||
|
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 56 KiB |
@@ -20,12 +20,12 @@ function Projects() {
|
||||
useEffect(() => {
|
||||
const fetchProjects = async () => {
|
||||
try {
|
||||
const response = await fetch('/api/shortProjects/');
|
||||
const response = await fetch('/api/projects/');
|
||||
if (!response.ok) {
|
||||
throw new Error(`Erreur HTTP: ${response.status}`);
|
||||
}
|
||||
const data = await response.json();
|
||||
setProjects(data.data);
|
||||
setProjects(data);
|
||||
} catch (err) {
|
||||
setError(err.message);
|
||||
}
|
||||
@@ -88,7 +88,7 @@ function Projects() {
|
||||
}
|
||||
|
||||
if (filters.technology.length > 0) {
|
||||
const isSkill = filters.technology.every(tech => project.skills.includes(tech));
|
||||
const isSkill = filters.technology.every(tech => project.skills.some(skill => skill.name === tech));
|
||||
if(!isSkill){
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -45,8 +45,8 @@ function SingleProject({ image, title, description, skills, id, school, beginnin
|
||||
|
||||
<ul className="single-project-skills-list">
|
||||
{skills.map((skill) => (
|
||||
<li key={skill}>
|
||||
<SkillCard text={skill} />
|
||||
<li key={skill.id}>
|
||||
<SkillCard text={skill.name} />
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
|
||||
@@ -4,30 +4,22 @@ import React, {useEffect, useState} from "react";
|
||||
|
||||
function Experiences() {
|
||||
const [experiences, setExperiences] = useState([]);
|
||||
const [experienceTasks, setExperienceTasks] = useState([]);
|
||||
const [error, setError] = useState(null);
|
||||
|
||||
useEffect(() => {
|
||||
const fetchExperiencesAndTasks = async () => {
|
||||
const fetchExperiences = async () => {
|
||||
try {
|
||||
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/');
|
||||
if (!response.ok) {
|
||||
throw new Error(`Erreur HTTP: ${response.status}`);
|
||||
}
|
||||
data = await response.json();
|
||||
setExperienceTasks(data.data);
|
||||
setExperiences(data);
|
||||
} catch (err) {
|
||||
setError(err.message);
|
||||
}
|
||||
};
|
||||
fetchExperiencesAndTasks();
|
||||
fetchExperiences();
|
||||
}, []);
|
||||
|
||||
if (error) {
|
||||
@@ -39,7 +31,7 @@ function Experiences() {
|
||||
<h1 className="section-title">Experiences</h1>
|
||||
<div className="experiences-container">
|
||||
{experiences.map((exp) => (
|
||||
<SingleExperience experience={exp} tasks={experienceTasks.filter(task => task.experience_id === exp.id)}/>
|
||||
<SingleExperience experience={exp}/>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -13,7 +13,7 @@ function Home() {
|
||||
Passionate about development, I am currently looking
|
||||
for an opportunity to put my skills into practice and continue learning.
|
||||
</p>
|
||||
<a href="/assets/documents/CV.pdf" target="_blank" className="btn">Download my CV</a>
|
||||
<a href="/assets/documents/josserand_giovanni_cv.pdf" target="_blank" className="btn">See my CV</a>
|
||||
|
||||
</section>
|
||||
);
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
.experience-card {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
width: 90%;
|
||||
margin-bottom: 3rem;
|
||||
padding: 1.5rem;
|
||||
padding: 1.5em;
|
||||
display: flex;
|
||||
gap: 6rem;
|
||||
justify-content: center;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import './SingleExperience.css';
|
||||
|
||||
function SingleExperience({ experience, tasks }) {
|
||||
function SingleExperience({ experience }) {
|
||||
return (
|
||||
<div className="experience-card">
|
||||
<div className="experience-card-left">
|
||||
@@ -11,7 +11,7 @@ function SingleExperience({ experience, tasks }) {
|
||||
<div className="experience-card-right">
|
||||
<h3 className="experience-role">{experience.role}</h3>
|
||||
<ul className="experience-tasks">
|
||||
{tasks.map((task) => (
|
||||
{experience.tasks.map((task) => (
|
||||
<li>{task.description}</li>
|
||||
))}
|
||||
</ul>
|
||||
|
||||
@@ -14,7 +14,7 @@ function Skills() {
|
||||
throw new Error(`Erreur HTTP: ${response.status}`);
|
||||
}
|
||||
const data = await response.json();
|
||||
setSkills(data.data);
|
||||
setSkills(data);
|
||||
} catch (err) {
|
||||
setError(err.message);
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ function ProjectDetailsPage() {
|
||||
useEffect(() => {
|
||||
const fetchProject = async () => {
|
||||
try {
|
||||
const response = await fetch(`/api/longProjects/${id}`);
|
||||
const response = await fetch(`/api/projects/${id}`);
|
||||
if (!response.ok) {
|
||||
throw new Error(`Erreur HTTP: ${response.status}`);
|
||||
}
|
||||
|
||||
@@ -73,7 +73,7 @@ function ProjectDetails({project}) {
|
||||
<ul>
|
||||
{project.skills && project.skills.map((skill) => (
|
||||
<li>
|
||||
<SkillCard text={skill} />
|
||||
<SkillCard text={skill.name} />
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
|
||||
@@ -73,7 +73,7 @@ function Filter({ filters, setFilters }) {
|
||||
throw new Error(`Erreur HTTP: ${response.status}`);
|
||||
}
|
||||
const data = await response.json();
|
||||
setSkills(data.data);
|
||||
setSkills(data);
|
||||
} catch (err) {
|
||||
setError(err.message);
|
||||
}
|
||||
|
||||