From f6513286ec0338e0be1b3f67052b5c1dfeb9becf Mon Sep 17 00:00:00 2001 From: Space-Banane Date: Fri, 23 Jan 2026 17:33:14 +0100 Subject: [PATCH] Pre-Implement last commit date display and change fetch logic for projects and mini projects --- src/App.tsx | 478 ++++++++-------------------------------------------- 1 file changed, 68 insertions(+), 410 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index ff57666..129f7e6 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from "react"; +import { useEffect, useState, useRef } from "react"; interface MiniProject { title: string; @@ -11,6 +11,7 @@ interface MiniProject { color: string; content: string; }; + last_commit?: Date; } interface Experience { @@ -322,6 +323,11 @@ function MiniProjectCard({

{project.description}

+ {project.last_commit && ( +

+ Last commit: {project.last_commit.toLocaleDateString()} +

+ )}
Click to learn more @@ -438,6 +444,11 @@ function ProjectCard({ project }: { project: Project }) {

{project.description}

+ {project.last_commit && ( +

+ Last commit: {project.last_commit.toLocaleDateString()} +

+ )}
(null); + // Replace hardcoded arrays with state + const [projects, setProjects] = useState([]); + const [miniProjects, setMiniProjects] = useState([]); + const [experiences, setExperiences] = useState([]); + const oldUsernames = [ "getspaced (ingame)", "Space² (alternative)", @@ -605,6 +633,24 @@ function App() { }; }, []); + // Fetch data from API on mount + useEffect(() => { + fetch("https://shsf-api.reversed.dev/api/exec/4/e942538c-caa1-49d1-8953-dfab1e62f8cb/projects") + .then(res => res.json()) + .then(setProjects) + .catch(() => setProjects([])); + + fetch("https://shsf-api.reversed.dev/api/exec/4/e942538c-caa1-49d1-8953-dfab1e62f8cb/mini_projects") + .then(res => res.json()) + .then(setMiniProjects) + .catch(() => setMiniProjects([])); + + fetch("https://shsf-api.reversed.dev/api/exec/4/e942538c-caa1-49d1-8953-dfab1e62f8cb/experience") + .then(res => res.json()) + .then(setExperiences) + .catch(() => setExperiences([])); + }, []); + return (
{/* Background Grid */} @@ -623,7 +669,7 @@ function App() {
{/* Hero Section */} -
+
+ + {/* Floating Island: Bottom Left (only on localhost) */} + {typeof window !== "undefined" && + (window.location.hostname === "localhost" || window.location.hostname === "127.0.0.1") && ( +
+
+ 🏝️ + Loaded +
+
+ Projects: {projects.length} + Mini Projects: {miniProjects.length} + Profile Data: 1/1 +
+
+ )}
); } @@ -1076,416 +1141,9 @@ interface Project { link: string; open_source: false | { link: string }; rounded?: boolean; + last_commit?: Date; } -const projects: Project[] = [ - { - name: "BetterNews", - description: "A news feed where you submit the news.", - image: "https://betternews.app/assets/icon.png", - open_source: false, - link: "https://betternews.app", - }, - { - name: "SHSF", - description: 'Self-hostable "Cloud Functions" on your own hardware.', - link: "https://github.com/Space-Banane/shsf", - open_source: { link: "https://github.com/Space-Banane/shsf" }, - image: "https://cdn.reversed.dev/pictures/shsf/SHSF.png", - }, - { - name: "Thoughtful", - description: "A minimalistic and privacy-focused idea-taking app.", - link: "https://github.com/Space-Banane/thoughtful", - open_source: { link: "https://github.com/Space-Banane/thoughtful" }, - image: - "https://em-content.zobj.net/source/microsoft-3D-fluent/433/thinking-face_1f914.png", - }, - { - name: "3D Print Card", - description: "Showcase Your 3D Prints Beautifully", - link: "https://card.peakprinting.top", - image: "https://card.peakprinting.top/icon.png", - open_source: { link: "https://github.com/Space-Banane/imsoprintingit" }, - }, - { - name: "Whatsapp-Chat-Analyzer", - description: - "Analyze your Whatsapp chats with ease. Get insights, stats and more.", - image: "https://cdn.reversed.dev/pictures/wca.png", - open_source: { link: "https://github.com/Space-Banane/whatsapp-stats" }, - link: "https://whatstat.reversed.dev", - }, - { - name: "Instant Replay", - description: "Instantly replay your last 30 seconds of gameplay with the help of your Voice and OBS Replay Buffers.", - link: "https://gitea.reversed.dev/space/instant-replay", - open_source: { link: "https://gitea.reversed.dev/space/instant-replay" }, - } -]; -const miniProjects: MiniProject[] = [ - { - title: "Discord Status to Website", - description: "Display your Discord status on your personal website.", - why: "I wanted to show my Discord status here on my portfolio.", - github: "https://github.com/Space-Banane/shsf-discord-status", - note: { - color: "red", - content: "Requires SHSF to run", - }, - image: - "https://github.com/Space-Banane/shsf-discord-status/blob/main/Discord%20Status%20Image.png?raw=true", - }, - { - title: "Mirror GoXLR to Discord", - description: "Muting your Mic Channel mutes you on Discord.", - why: "When i mute myself on my GoXLR, my friends don't know that, now they do.", - github: "https://github.com/Space-Banane/mirror-goxlr-to-discord", - note: { - color: "yellow", - content: - "Experimental - This might interfere with some other Hotkeys you set, or Applications that listen to those Hotkeys", - }, - image: - "https://github.com/Space-Banane/mirror-goxlr-to-discord/blob/main/Discord%20x%20GoXLR.png?raw=true", - }, - { - title: "Octo-Activity", - description: "Show your 3D Printer activity as Discord Status.", - why: "I wanted to show off my 3D Printer activity on Discord.", - github: "https://github.com/Space-Banane/discord-octo-activity", - image: - "https://github.com/Space-Banane/discord-octo-activity/blob/main/Discord%20Octo%20Activity.png?raw=true", - }, - { - title: "Fishing Rod Automation Raft", - description: "Automate fishing in Raft with this simple script.", - why: "Fishing while Shitting is kinda difficult.", - github: "https://github.com/Space-Banane/raft-fishing", - note: { - color: "yellow", - content: - "Might interfere with other Applications that use Mouse/Keyboard input. In case of trust issues, move the mouse to the bottom right corner to stop the script.", - }, - image: - "https://github.com/Space-Banane/raft-fishing/blob/main/Raft%20Fishing%20Guide%20-%20cover.jpg?raw=true", - }, - { - title: "Nvidia-SMI Server", - description: "A simple server to expose Nvidia-SMI data via HTTP.", - why: "I wanted to monitor my GPU usage remotely without installing additional software.", - github: "https://github.com/Space-Banane/nvidia-smi-server", - image: - "https://github.com/Space-Banane/nvidia-smi-server/blob/main/Nvidia%20-%20SMI.png?raw=true", - }, - { - title: "Lego Set to STL", - description: "Convert Lego set instructions to STL files for 3D printing.", - why: "A friend of mine searched for a website that does something like this, so i made one.", - github: "https://github.com/Space-Banane/lego-to-stl", - image: "https://shx.reversed.dev/u/44nekH.png", - }, - { - title: "Thoughtful Extention for Raycast", - description: "Quickly add ideas to Thoughtful from Raycast.", - why: "I use Raycast a lot, so having a quick way to add ideas to Thoughtful is super convenient.", - github: "https://gitea.reversed.dev/space/thoughtful-extention", - note: { - color: "blue", - content: "Requires Thoughtful & Raycast to use lol", - }, - image: "https://shx.reversed.dev/u/bCOaZt.png" - }, - { - title: "Big File Generator", - description: - "Generate large files filled with random data for testing purposes.", - why: "SMB performance test, i did NOT have a big file lying around.", - github: "https://gitea.reversed.dev/space/big-file-gen", - image: - "https://em-content.zobj.net/source/microsoft-3D-fluent/433/file-folder_1f4c1.png", - }, - { - title: "Active Directory Profile Picture Management", - description: "Manage and update Active Directory profile pictures easily.", - why: "I wanted a simple way to manage profile pictures in Active Directory. (home lab stuff)", - github: "https://github.com/Space-Banane/ADPPM", - image: - "https://shx.reversed.dev/u/RSqlwN.png", - note: { - color: "red", - content: - "Work in Progress + Requires Active Directory Environment + Requires Go to be installed", - }, - }, - { - title: "QrCode Generator", - description: "Vue.JS based QR Code Generator with a bit of customization.", - why: "I wanted a simple and customizable QR code generator.", - github: "https://github.com/reversed-dev/qr-code-gen", - image: "https://cdn.reversed.dev/pictures/qrcode.jpeg", - }, - { - title: "Supertonic TTS Wrapper API", - description: "A simple API wrapper for the Supertonic TTS model.", - why: "I guess nobody made one thats deployable via docker yet?", - github: "https://github.com/Space-Banane/supertonic-wrapper", - image: - "https://shx.reversed.dev/u/cc6j2r.png", - note: { - color: "yellow", - content: - "Experimental. PRs are welcome to improve stability and features.", - }, - }, - { - title: "Clipboard on the GO😉", - description: "A simple clipboard sync service written in Go,", - why: "Windows sync was unreliable as hell", - github: "https://gitea.reversed.dev/space/clipboard-on-the-go", - image: "https://shx.reversed.dev/u/fnHPKP.png", - note: { - color: "blue", - content: "Requires Go to be installed; Docs are in windows only for now. Linux is probably still supported though.", - } - }, - { - title: "Thoughtful Discord Bot", - description: "A Discord bot to quickly add ideas to Thoughtful.", - why: "Amazing idea i had while eating.", - github: "https://gitea.reversed.dev/space/thoughtful-dcbot", - image: "https://shx.reversed.dev/u/lQHAyz.png", - note: { - color: "blue", - content: "Requires Thoughtful to use lol", - } - } -]; - -const experiences: Experience[] = [ - { - name: "TypeScript", - type: "language", - description: - "My go-to language for building scalable web applications with type safety.", - image: - "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/typescript/typescript-original.svg", - learned_because: "I HATE JavaScript, this makes it minimally better", - }, - { - name: "JavaScript", - type: "language", - description: "The foundation of web development.", - image: - "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/javascript/javascript-original.svg", - }, - { - name: "Python", - type: "language", - description: - "Used for automation scripts, data processing, and backend services.", - image: - "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/python/python-original.svg", - }, - { - name: "Go", - type: "language", - description: "For building fast and efficient backend services.", - image: - "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/go/go-original.svg", - }, - { - name: "Lua", - type: "language", - description: "Scripting and embedded applications.", - image: - "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/lua/lua-original.svg", - learned_from: "Youtube & Docs", - learned_because: "Used in some Robots in a Minecraft mod called CC:Tweaked", - }, - { - name: "React", - type: "platform", - description: - "Building interactive user interfaces with modern React patterns and hooks.", - image: - "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/react/react-original.svg", - }, - { - name: "Vue.js", - type: "platform", - description: "Creating reactive web applications with Vue's elegant API.", - image: - "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/vuejs/vuejs-original.svg", - }, - { - name: "Docker", - type: "service", - description: - "Containerizing applications for consistent deployment across environments.", - image: - "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/docker/docker-original.svg", - }, - { - name: "PostgreSQL", - type: "service", - description: "Reliable relational database for complex data storage needs.", - image: - "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/postgresql/postgresql-original.svg", - }, - { - name: "Redis", - type: "service", - description: "High-performance caching and data structure store.", - image: - "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/redis/redis-original.svg", - }, - { - name: "MariaDB", - type: "service", - description: "Open-source relational database management system.", - image: - "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/mariadb/mariadb-original.svg", - }, - { - name: "Proxy Software", - type: "service", - description: - "Configuring and managing reverse proxies for web applications.", - }, - { - name: "Home Assistant", - type: "platform", - description: - "Building smart home automations and integrating various IoT devices.", - image: - "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/home-assistant.png", - }, - { - name: "ESPHome", - type: "platform", - description: - "Programming ESP32 and ESP8266 microcontrollers for custom smart home sensors.", - image: "https://esphome.io/_images/logo.svg", - }, - { - name: "Troubleshooting Hardware", - type: "real life experience", - description: - "Diagnosing and fixing hardware issues, from bricked microcontrollers to server problems.", - }, - { - name: "Node.js", - type: "platform", - description: "Building backend services and APIs with Express and Fastify.", - image: - "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/nodejs/nodejs-original.svg", - }, - { - name: "Immich", - type: "platform", - description: "Self-hosted photo and video management solution.", - image: "https://avatars.githubusercontent.com/u/109746326?v=4", - learned_because: "I hate OneDrive", - }, - { - name: "Pangolin", - type: "platform", - description: "Proxy solution for network management.", - image: - "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/pangolin.svg", - learned_because: - "My old proxy did NOT work super well with authentication.", - }, - { - name: "Nginx", - type: "platform", - description: "Proxy solution for network management. (old proxy)", - image: - "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/nginx/nginx-original.svg", - }, - { - name: "Minecraft Servers", - type: "platform", - description: "Hosting and managing multiplayer game servers.", - image: - "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/minecraft.png", - }, - { - name: "Gitea", - type: "platform", - description: "Self-hosted Git service for version control.", - image: - "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/gitea.png", - }, - { - name: "Serverless Functions", - type: "platform", - description: "Building scalable cloud functions and microservices. (SHSF)", - image: - "https://cdn.reversed.dev/pictures/shsf/SHSF%20SMALL%20TRANSPARENT.png", - }, - { - name: "Cloud Infrastructure", - type: "platform", - description: - "Managing and deploying applications on cloud platforms. (GCP, AWS, DigitalOcean)", - }, - { - name: "Git", - type: "service", - description: - "Version control for collaborative development and open-source contributions.", - image: - "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/git/git-original.svg", - }, - { - name: "ShareX", - type: "platform", - description: - "Custom uploaders and automation workflows for screenshots and file sharing.", - image: - "https://upload.wikimedia.org/wikipedia/commons/d/d1/ShareX_Logo.png", - }, - { - name: "Zipline", - type: "platform", - description: "ShareX companion for self-hosted file uploads.", - image: "https://media.sys.truenas.net/apps/zipline/icons/icon.png", - }, - { - name: "Tailwind CSS", - type: "platform", - description: "Utility-first CSS framework for rapid UI development.", - image: - "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d5/Tailwind_CSS_Logo.svg/2560px-Tailwind_CSS_Logo.svg.png", - }, - { - name: "Proxmox VE", - type: "platform", - description: - "Virtualization management platform for running VMs and containers.", - image: - "https://media.printables.com/media/prints/543748/images/4374616_04ed4585-3662-4652-a84d-04621cb9f709/thumbs/inside/1280x960/png/proxmox.webp", - }, - { - name: "MongoDB", - type: "service", - description: "NoSQL database for flexible document-based data storage.", - image: - "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/mongodb/mongodb-original.svg", - learned_because: "I didn't wanna mess around with schemas for a project.", - learned_at: "09.01.2026", - }, - { - name: "Insomnia", - type: "platform", - description: "REST API client for testing and debugging HTTP requests.", - image: - "https://s3.amazonaws.com/s3.roaringapps.com/assets/icons/1561251841927-Insomnia.png", - learned_because: "Postman is bloatware", - }, -]; export default App;