"use client"; import React, { useEffect, useState } from "react"; import Skeleton from "react-loading-skeleton"; import "react-loading-skeleton/dist/skeleton.css"; type Category = { label: string; active: boolean; }; type Project = { id: number; title: string; category: string; images: { src: string; position: string; zIndex: number }[]; created_at: string; updated_at: string; }; export default function MyProjects() { const [categories, setCategories] = useState([]); const [projects, setProjects] = useState([]); const [selectedCategory, setSelectedCategory] = useState("Newest"); useEffect(() => { const fetchProjects = async () => { const res = await fetch("/api/projects?sort=desc&per_page=20"); const data = await res.json(); const resProjects = data.projects.data; const resCategories = data.categories; // Convert JSON string to array const updatedData = resProjects.map((project: { images: string }) => ({ ...project, images: JSON.parse(project.images), })); setProjects(updatedData); // Extract unique categories const uniqueCategories: Category[] = [{ label: "Newest", active: false }]; const onlyFiveCategoris: Category[] = [ ...resCategories.map((category: string) => ({ label: category, active: false, })), ].slice(0, 5); uniqueCategories.push(...onlyFiveCategoris); setCategories(uniqueCategories); }; fetchProjects(); }, []); // Group projects by category const groupProjectsByCategory = (projects: Project[]) => { return projects.reduce>((acc, project) => { const category = project.category; if (!acc[category]) { acc[category] = []; } acc[category].push(project); return acc; }, {}); }; const groupedProjects = groupProjectsByCategory(projects); // Filter projects by selected category const filteredProjects: Project[] = selectedCategory === "Newest" ? projects.slice(0, 6) // Get first 6 projects for "Newest" : groupedProjects[selectedCategory]?.slice(0, 6) || []; // Get first 6 projects from selected category return (

My Projects

Lorem ipsum dolor sit amet consectetur. Mollis erat duis aliquam mauris est risus lectus. Phasellus consequat urna tellus

    {categories.length > 0 ? ( categories.map((category, index) => (
  • setSelectedCategory(category.label)} className={`select-none whitespace-nowrap rounded-md border border-[#545454] bg-[#F8F8F8] px-[20px] py-[10px] text-[18px] font-[600] hover:cursor-pointer hover:border-[#FD6F00] ${ selectedCategory === category.label ? "bg-[#FD6F00] text-[#FFFFFF]" : "text-[#000]" }`} > {category.label}
  • )) ) : (
    )}
{filteredProjects.length > 0 ? ( filteredProjects.map((project, index) => (
{project.images.map((image, idx) => ( UI/UX Vector ))}
{project.category}

{project.title}

)) ) : (
)}
); }