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:Stronger Partnerships, Greater Success
Loading projects...
) : filteredProjects.length === 0 ? (No projects available.
) : (Sector: {project.sector}
{project.location && (Location: {project.location}
)} {project.description && ({expandedDescriptions[project.id] ? project.description : project.description.slice(0, 100) + "..."} {project.description.length > 100 && ( )}
)}