diff --git a/src/App.tsx b/src/App.tsx index 1e3d8b7..7899f57 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,7 +1,7 @@ import { useEffect, useState } from "react"; import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; import UmamiAnalytics from "@danielgtmn/umami-react"; -import type { Experience, MiniProject, Project } from "./types"; +import type { Experience, MiniProject, Project, RealWork } from "./types"; import { MiniProjectModal } from "./components/MiniProjectModal"; import { ExperienceModal } from "./components/ExperienceModal"; import { Navbar } from "./components/Navbar"; @@ -29,6 +29,7 @@ function App() { const [projects, setProjects] = useState([]); const [miniProjects, setMiniProjects] = useState([]); const [experiences, setExperiences] = useState([]); + const [realWork, setRealWork] = useState([]); const oldUsernames = [ "getspaced (ingame)", @@ -143,6 +144,23 @@ function App() { // Fetch data from API on mount useEffect(() => { + const fetchRealWork = async () => { + try { + const res = await fetch( + "https://shsf-api.reversed.dev/api/exec/4/e942538c-caa1-49d1-8953-dfab1e62f8cb/real_work", + ); + + if (!res.ok) { + throw new Error("Failed to fetch real work data"); + } + + const data = (await res.json()) as RealWork[]; + setRealWork(data); + } catch { + setRealWork([]); + } + }; + fetch( "https://shsf-api.reversed.dev/api/exec/4/e942538c-caa1-49d1-8953-dfab1e62f8cb/projects", ) @@ -163,6 +181,8 @@ function App() { .then((res) => res.json()) .then(setExperiences) .catch(() => setExperiences([])); + + fetchRealWork(); }, []); return ( @@ -212,6 +232,7 @@ function App() { setSelectedMiniProject={setSelectedMiniProject} experiences={experiences} setSelectedExperience={setSelectedExperience} + realWork={realWork} /> } /> diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx index c6bd559..e177da2 100644 --- a/src/pages/Home.tsx +++ b/src/pages/Home.tsx @@ -1,5 +1,6 @@ import { Hero } from "../sections/Hero"; -import type { MiniProject, Experience, Project } from "../types"; +import { WorkExperience } from "../sections/WorkExperience"; +import type { MiniProject, Experience, Project, RealWork } from "../types"; import { ProjectCard } from "../components/ProjectCard"; import { MiniProjectCard } from "../components/MiniProjectCard"; import { ExperienceCard } from "../components/ExperienceCard"; @@ -18,6 +19,7 @@ interface HomeProps { setSelectedMiniProject: (p: MiniProject) => void; experiences: Experience[]; setSelectedExperience: (e: Experience) => void; + realWork: RealWork[]; } export function Home({ @@ -34,6 +36,7 @@ export function Home({ setSelectedMiniProject, experiences, setSelectedExperience, + realWork, }: HomeProps) { const groupedExperiences = experiences.reduce( (acc, exp) => { @@ -48,16 +51,16 @@ export function Home({ const rewriteType = (type: string) => { switch (type) { - case "language": + case "languages": return "Languages"; - case "service": - return "Services"; - case "platform": + case "software": + return "Software"; + case "plattforms": return "Platforms"; - case "real life experience": - return "Real Life Experience"; - case "roles": - return "Roles"; + case "experience": + return "Experience"; + case "other": + return "Other"; default: return type.charAt(0).toUpperCase() + type.slice(1); } @@ -76,6 +79,8 @@ export function Home({ oldUsernames={oldUsernames} /> + +

diff --git a/src/sections/WorkExperience.tsx b/src/sections/WorkExperience.tsx new file mode 100644 index 0000000..eb7c8a0 --- /dev/null +++ b/src/sections/WorkExperience.tsx @@ -0,0 +1,73 @@ +import type { RealWork } from "../types"; + +interface WorkExperienceProps { + realWork: RealWork[]; +} + +export function WorkExperience({ realWork }: WorkExperienceProps) { + return ( +
+
+

+ Work Experience +

+

+ Professional collaborations and product work I have contributed to. +

+
+ + {realWork.length === 0 ? ( +
+

No work experience entries available yet.

+
+ ) : ( +
+ {realWork.map((entry, index) => ( +
+
+

{entry.company}

+ {entry.url ? ( + + {new URL(entry.url).hostname.replace(/^www\./, "")} + + + ) : null} +
+ +

{entry.summary}

+ + {entry.tags && entry.tags.length > 0 ? ( +
+ {entry.tags.map((tag) => ( + + {tag} + + ))} +
+ ) : null} +
+ ))} +
+ )} +
+ ); +} diff --git a/src/types.ts b/src/types.ts index d9f0c7c..0fb1e1c 100644 --- a/src/types.ts +++ b/src/types.ts @@ -14,7 +14,7 @@ export interface MiniProject { export interface Experience { name: string; - type: "language" | "service" | "platform" | "real life experience" | "roles"; + type: "languages" | "software" | "plattforms" | "experience" | "other"; description: string; image?: string; learned_at?: string; @@ -31,3 +31,10 @@ export interface Project { rounded?: boolean; last_commit?: Date; } + +export interface RealWork { + company: string; + url?: string; + summary: string; + tags?: string[]; +}