Compare commits
44 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2ab10c7803 | |||
| f5441f038c | |||
| e92c4227d8 | |||
| 6640136fd9 | |||
| 285daa7d54 | |||
| 56f475839d | |||
| cc8d3c78cd | |||
| 1b675fdd3e | |||
| 37a113fbf6 | |||
| 5401774e0e | |||
| b142112ce0 | |||
| 75d4f5d166 | |||
| dfbe3123d5 | |||
| a875e1dfb7 | |||
| 83390d802a | |||
| cab338c2b3 | |||
| d34eb5714f | |||
| 41dc079844 | |||
| 6847f7d2c6 | |||
| d415d1ca38 | |||
| 65060c6875 | |||
| 34869f0611 | |||
| a08689086c | |||
| 1127a608bd | |||
| 45e78dd11c | |||
| 1a26e0d2d8 | |||
| 59538b6f17 | |||
| fdc39d3928 | |||
| 743160af3c | |||
| 23233d4be6 | |||
| b9b349b706 | |||
| 287329e2c5 | |||
| ed05bee64d | |||
| 7708889e28 | |||
| 9b17d23901 | |||
| 425b96e9c6 | |||
| c41760c313 | |||
| 540bf7efec | |||
| fe2abff5e5 | |||
| 40d8c49908 | |||
| 3728385ebc | |||
| cc7c586d4a | |||
| 1ec3121bc1 | |||
| 9700ae889e |
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<link rel="icon" type="image/svg+xml" href="/public/assets/images/logo.svg" />
|
<link rel="icon" type="image/svg+xml" href="/assets/images/logo.svg" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -1,6 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
<svg
|
<svg
|
||||||
version="1.1"
|
version="1.1"
|
||||||
id="svg1"
|
id="svg1"
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 109 KiB After Width: | Height: | Size: 109 KiB |
+4
-4
@@ -1,8 +1,8 @@
|
|||||||
import './App.css'
|
import './App.css'
|
||||||
import { Routes, Route, Link } from 'react-router-dom';
|
import { Routes, Route } from 'react-router-dom';
|
||||||
import HomePage from './pages/HomePage.jsx';
|
import HomePage from './pages/Home/HomePage.jsx';
|
||||||
import ProjectsPage from './pages/ProjectsPage';
|
import ProjectsPage from './pages/Projects/ProjectsPage.jsx';
|
||||||
import ProjectDetailsPage from "./pages/ProjectDetailsPage.jsx";
|
import ProjectDetailsPage from "./pages/ProjectDetails/ProjectDetailsPage.jsx";
|
||||||
|
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import "./Projects.css"
|
|||||||
import React, {useEffect, useState} from "react";
|
import React, {useEffect, useState} from "react";
|
||||||
import {Link, useLocation} from "react-router-dom";
|
import {Link, useLocation} from "react-router-dom";
|
||||||
import NavBar from "../NavBar/NavBar.jsx";
|
import NavBar from "../NavBar/NavBar.jsx";
|
||||||
import Filter from "../Filter/Filter.jsx";
|
import Filter from "../../pages/Projects/components/Filter/Filter.jsx";
|
||||||
|
|
||||||
function Projects() {
|
function Projects() {
|
||||||
const [projects, setProjects] = useState([]);
|
const [projects, setProjects] = useState([]);
|
||||||
@@ -20,12 +20,12 @@ function Projects() {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const fetchProjects = async () => {
|
const fetchProjects = async () => {
|
||||||
try {
|
try {
|
||||||
const response = await fetch('/api/shortProjects/');
|
const response = await fetch('/api/projects/');
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error(`Erreur HTTP: ${response.status}`);
|
throw new Error(`Erreur HTTP: ${response.status}`);
|
||||||
}
|
}
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
setProjects(data.data);
|
setProjects(data);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
setError(err.message);
|
setError(err.message);
|
||||||
}
|
}
|
||||||
@@ -88,7 +88,7 @@ function Projects() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (filters.technology.length > 0) {
|
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){
|
if(!isSkill){
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,8 +45,8 @@ function SingleProject({ image, title, description, skills, id, school, beginnin
|
|||||||
|
|
||||||
<ul className="single-project-skills-list">
|
<ul className="single-project-skills-list">
|
||||||
{skills.map((skill) => (
|
{skills.map((skill) => (
|
||||||
<li key={skill}>
|
<li key={skill.id}>
|
||||||
<SkillCard text={skill} />
|
<SkillCard text={skill.name} />
|
||||||
</li>
|
</li>
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
html{
|
html{
|
||||||
scroll-behavior: smooth;
|
scroll-behavior: smooth;
|
||||||
overflow-x: hidden;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -17,7 +16,6 @@ body {
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
display: flex;
|
display: flex;
|
||||||
place-items: center;
|
place-items: center;
|
||||||
overflow-x: hidden;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.section-title {
|
.section-title {
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import {useEffect, useState} from 'react'; // 1. Import useEffect
|
import {useEffect} from 'react';
|
||||||
import { useLocation } from 'react-router-dom'; // 2. Import useLocation
|
import { useLocation } from 'react-router-dom';
|
||||||
import Home from '../components/Home/Home.jsx';
|
import Home from './components/Home/Home.jsx';
|
||||||
import Experiences from '../components/Experiences/Experiences.jsx';
|
import Experiences from './components/Experiences/Experiences.jsx';
|
||||||
import Projects from '../components/Projects/Projects.jsx';
|
import Projects from '../../components/Projects/Projects.jsx';
|
||||||
import Skills from '../components/Skills/Skills.jsx';
|
import Skills from './components/Skills/Skills.jsx';
|
||||||
import Footer from '../components/Footer/Footer.jsx';
|
import Footer from '../../components/Footer/Footer.jsx';
|
||||||
|
|
||||||
function HomePage() {
|
function HomePage() {
|
||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
+4
-12
@@ -4,30 +4,22 @@ import React, {useEffect, useState} from "react";
|
|||||||
|
|
||||||
function Experiences() {
|
function Experiences() {
|
||||||
const [experiences, setExperiences] = useState([]);
|
const [experiences, setExperiences] = useState([]);
|
||||||
const [experienceTasks, setExperienceTasks] = useState([]);
|
|
||||||
const [error, setError] = useState(null);
|
const [error, setError] = useState(null);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const fetchExperiencesAndTasks = async () => {
|
const fetchExperiences = async () => {
|
||||||
try {
|
try {
|
||||||
let response = await fetch('/api/experiences/');
|
let response = await fetch('/api/experiences/');
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error(`Erreur HTTP: ${response.status}`);
|
throw new Error(`Erreur HTTP: ${response.status}`);
|
||||||
}
|
}
|
||||||
let data = await response.json();
|
let data = await response.json();
|
||||||
setExperiences(data.data);
|
setExperiences(data);
|
||||||
|
|
||||||
response = await fetch('/api/experienceTasks/');
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error(`Erreur HTTP: ${response.status}`);
|
|
||||||
}
|
|
||||||
data = await response.json();
|
|
||||||
setExperienceTasks(data.data);
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
setError(err.message);
|
setError(err.message);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
fetchExperiencesAndTasks();
|
fetchExperiences();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
@@ -39,7 +31,7 @@ function Experiences() {
|
|||||||
<h1 className="section-title">Experiences</h1>
|
<h1 className="section-title">Experiences</h1>
|
||||||
<div className="experiences-container">
|
<div className="experiences-container">
|
||||||
{experiences.map((exp) => (
|
{experiences.map((exp) => (
|
||||||
<SingleExperience experience={exp} tasks={experienceTasks.filter(task => task.experience_id === exp.id)}/>
|
<SingleExperience experience={exp}/>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import './Home.css';
|
import './Home.css';
|
||||||
import Background from "../thirdParty/Background/Background.jsx";
|
import Background from "../../../../components/thirdParty/Background/Background.jsx";
|
||||||
import NavBar from "../NavBar/NavBar.jsx";
|
import NavBar from "../../../../components/NavBar/NavBar.jsx";
|
||||||
function Home() {
|
function Home() {
|
||||||
return (
|
return (
|
||||||
|
|
||||||
@@ -13,7 +13,7 @@ function Home() {
|
|||||||
Passionate about development, I am currently looking
|
Passionate about development, I am currently looking
|
||||||
for an opportunity to put my skills into practice and continue learning.
|
for an opportunity to put my skills into practice and continue learning.
|
||||||
</p>
|
</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>
|
</section>
|
||||||
);
|
);
|
||||||
+2
-2
@@ -1,8 +1,8 @@
|
|||||||
.experience-card {
|
.experience-card {
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 100%;
|
width: 90%;
|
||||||
margin-bottom: 3rem;
|
margin-bottom: 3rem;
|
||||||
padding: 1.5rem;
|
padding: 1.5em;
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 6rem;
|
gap: 6rem;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
import './SingleExperience.css';
|
import './SingleExperience.css';
|
||||||
|
|
||||||
function SingleExperience({ experience, tasks }) {
|
function SingleExperience({ experience }) {
|
||||||
return (
|
return (
|
||||||
<div className="experience-card">
|
<div className="experience-card">
|
||||||
<div className="experience-card-left">
|
<div className="experience-card-left">
|
||||||
@@ -11,7 +11,7 @@ function SingleExperience({ experience, tasks }) {
|
|||||||
<div className="experience-card-right">
|
<div className="experience-card-right">
|
||||||
<h3 className="experience-role">{experience.role}</h3>
|
<h3 className="experience-role">{experience.role}</h3>
|
||||||
<ul className="experience-tasks">
|
<ul className="experience-tasks">
|
||||||
{tasks.map((task) => (
|
{experience.tasks.map((task) => (
|
||||||
<li>{task.description}</li>
|
<li>{task.description}</li>
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import SkillCard from "../SkillCard/SkillCard.jsx";
|
import SkillCard from "../../../../components/SkillCard/SkillCard.jsx";
|
||||||
import "./Skills.css";
|
import "./Skills.css";
|
||||||
|
|
||||||
function Skills() {
|
function Skills() {
|
||||||
@@ -14,7 +14,7 @@ function Skills() {
|
|||||||
throw new Error(`Erreur HTTP: ${response.status}`);
|
throw new Error(`Erreur HTTP: ${response.status}`);
|
||||||
}
|
}
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
setSkills(data.data);
|
setSkills(data);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
setError(err.message);
|
setError(err.message);
|
||||||
}
|
}
|
||||||
@@ -1,8 +1,7 @@
|
|||||||
import { useParams } from "react-router-dom";
|
import { useParams } from "react-router-dom";
|
||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
import NavBar from "../components/NavBar/NavBar.jsx";
|
import ProjectDetails from "./components/ProjectDetails/ProjectDetails.jsx";
|
||||||
import ProjectDetails from "../components/ProjectDetails/ProjectDetails.jsx";
|
import Footer from "../../components/Footer/Footer.jsx";
|
||||||
import Footer from "../components/Footer/Footer.jsx";
|
|
||||||
|
|
||||||
function ProjectDetailsPage() {
|
function ProjectDetailsPage() {
|
||||||
const { id } = useParams();
|
const { id } = useParams();
|
||||||
@@ -12,7 +11,7 @@ function ProjectDetailsPage() {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const fetchProject = async () => {
|
const fetchProject = async () => {
|
||||||
try {
|
try {
|
||||||
const response = await fetch(`/api/longProjects/${id}`);
|
const response = await fetch(`/api/projects/${id}`);
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error(`Erreur HTTP: ${response.status}`);
|
throw new Error(`Erreur HTTP: ${response.status}`);
|
||||||
}
|
}
|
||||||
+6
@@ -183,5 +183,11 @@ aside ul li a:hover {
|
|||||||
.return-button {
|
.return-button {
|
||||||
top: 7em;
|
top: 7em;
|
||||||
}
|
}
|
||||||
|
aside {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.project-details-content{
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
+3
-3
@@ -1,7 +1,7 @@
|
|||||||
import "./ProjectDetails.css"
|
import "./ProjectDetails.css"
|
||||||
import SkillCard from "../SkillCard/SkillCard.jsx";
|
import SkillCard from "../../../../components/SkillCard/SkillCard.jsx";
|
||||||
import React, {useEffect, useState} from "react";
|
import React, {useEffect, useState} from "react";
|
||||||
import NavBar from "../NavBar/NavBar.jsx";
|
import NavBar from "../../../../components/NavBar/NavBar.jsx";
|
||||||
import ReactMarkdown from 'react-markdown';
|
import ReactMarkdown from 'react-markdown';
|
||||||
import remarkGfm from 'remark-gfm';
|
import remarkGfm from 'remark-gfm';
|
||||||
import {useNavigate} from "react-router-dom";
|
import {useNavigate} from "react-router-dom";
|
||||||
@@ -73,7 +73,7 @@ function ProjectDetails({project}) {
|
|||||||
<ul>
|
<ul>
|
||||||
{project.skills && project.skills.map((skill) => (
|
{project.skills && project.skills.map((skill) => (
|
||||||
<li>
|
<li>
|
||||||
<SkillCard text={skill} />
|
<SkillCard text={skill.name} />
|
||||||
</li>
|
</li>
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import Projects from "../components/Projects/Projects.jsx";
|
import Projects from "../../components/Projects/Projects.jsx";
|
||||||
import Footer from "../components/Footer/Footer.jsx";
|
import Footer from "../../components/Footer/Footer.jsx";
|
||||||
|
|
||||||
function ProjectsPage() {
|
function ProjectsPage() {
|
||||||
return (
|
return (
|
||||||
@@ -73,7 +73,7 @@ function Filter({ filters, setFilters }) {
|
|||||||
throw new Error(`Erreur HTTP: ${response.status}`);
|
throw new Error(`Erreur HTTP: ${response.status}`);
|
||||||
}
|
}
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
setSkills(data.data);
|
setSkills(data);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
setError(err.message);
|
setError(err.message);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user