import React, { useState, useEffect, useRef } from "react"; import axios from "axios"; import Slider from "react-slick"; import heroBg from "../assets/projects-hero.jpg"; import "../styles/Projects.css"; import "slick-carousel/slick/slick.css"; import "slick-carousel/slick/slick-theme.css"; /* ===================== Custom Arrows ===================== */ const NextArrow = ({ className, style, onClick }) => (
); const PrevArrow = ({ className, style, onClick }) => (
); const Projects = () => { const [selectedSector, setSelectedSector] = useState("all"); const [projects, setProjects] = useState([]); const [loading, setLoading] = useState(true); const [expandedDescriptions, setExpandedDescriptions] = useState({}); const [lightboxImage, setLightboxImage] = useState(null); const sectorRef = useRef(null); const sectors = [ { label: "All", value: "all" }, { label: "Water Supply", value: "water supply" }, { label: "Storm Water", value: "storm water" }, { label: "Electromechanical", value: "electromechanical" }, { label: "Real Estate / Buildings", value: "real estate / buildings" }, { label: "Tunnel", value: "tunnel" }, { label: "Roads", value: "roads" }, { label: "Wastewater / Sewerage", value: "wastewater / sewerage" }, { label: "Irrigation", value: "irrigation" }, { label: "Renewable Energy", value: "renewable energy" }, ]; /* ===================== Fetch Projects ===================== */ useEffect(() => { const fetchProjects = async () => { try { const res = await axios.get( `${process.env.REACT_APP_API_BASE_URL}/api/projects` ); setProjects(Array.isArray(res.data) ? res.data : []); } catch (err) { console.error("Error fetching projects:", err); } finally { setLoading(false); } }; fetchProjects(); }, []); /* ===================== Scroll to sectors ===================== */ useEffect(() => { if (window.location.hash === "#sectors" && sectorRef.current) { setTimeout(() => { sectorRef.current.scrollIntoView({ behavior: "smooth" }); }, 200); } }, []); const filteredProjects = projects.filter((p) => { if (selectedSector === "all") return true; return ( p.sector && p.sector.toLowerCase().trim() === selectedSector.toLowerCase().trim() ); }); const toggleDescription = (id) => { setExpandedDescriptions((prev) => ({ ...prev, [id]: !prev[id], })); }; /* ===================== Slider Settings ===================== */ const sliderSettings = { dots: false, infinite: true, speed: 600, slidesToShow: 3, slidesToScroll: 1, autoplay: true, autoplaySpeed: 1500, arrows: true, nextArrow: , prevArrow: , responsive: [ { breakpoint: 1024, settings: { slidesToShow: 3 } }, { breakpoint: 768, settings: { slidesToShow: 2 } }, { breakpoint: 480, settings: { slidesToShow: 1 } }, ], }; return (
{/* ===================== Hero Section ====================== */}

Our Projects

Stronger Partnerships, Greater Success

{/* ===================== Sector Buttons ====================== */}
{sectors.map((sector, index) => { const bgColors = [ "bg-gradient-to-r from-blue-500 to-indigo-500", "bg-gradient-to-r from-green-400 to-green-600", "bg-gradient-to-r from-yellow-400 to-yellow-600", "bg-gradient-to-r from-pink-400 to-pink-600", "bg-gradient-to-r from-purple-400 to-purple-600", "bg-gradient-to-r from-red-400 to-red-600", ]; const isSelected = selectedSector === sector.value; return ( ); })}
{/* ===================== Projects Slider ====================== */}
{loading ? (

Loading projects...

) : filteredProjects.length === 0 ? (

No projects available.

) : ( {filteredProjects.map((project) => (
{/* ✅ FIXED IMAGE SIZE (NO BIG / SMALL ISSUE) */} {project.image && (
{project.name} { e.stopPropagation(); setLightboxImage( `${process.env.REACT_APP_API_BASE_URL}${project.image}` ); }} />
)}

{project.name}

Sector: {project.sector}

{project.location && (

Location: {project.location}

)} {project.description && (

{expandedDescriptions[project.id] ? project.description : project.description.slice(0, 100) + "..."} {project.description.length > 100 && ( )}

)}
))}
)}
{/* ===================== Image Lightbox ====================== */} {lightboxImage && (
setLightboxImage(null)} >
e.stopPropagation()}> Project
)}
); }; export default Projects;