"use client"; import { getAllActiveProjectsTimelineApi } from "@/app/utils/api/projectApi"; import { Card } from "ikoncomponents"; import { useEffect, useMemo, useState } from "react"; import { ResponsiveContainer, CartesianGrid, XAxis, YAxis, Tooltip, BarChart, Bar, Cell, ReferenceLine, } from "recharts"; const months = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ]; const colors = [ "#62D6B0", "#7C6AE6", "#F09B7E", "#4DA3FF", "#FFB84D", "#FF6B81", ]; export default function ProjectTimelineChart() { const [projects, setProjects] = useState([]); useEffect(() => { const fetchTimelineData = async () => { try { const response = await getAllActiveProjectsTimelineApi(); const formattedProjects = response.map((project: any, index: number) => ({ ...project, color: colors[index % colors.length], })); setProjects(formattedProjects); } catch (error) { console.error("Error fetching timeline data:", error); } }; fetchTimelineData(); }, []); // 1. Process your raw api dates into startOffsets and visual durations const chartData = useMemo(() => { return projects.map((project) => { const startDate = new Date(project.startDate); const endDate = new Date(project.endDate); const startMonth = startDate.getMonth(); const endMonth = endDate.getMonth(); // Calculate continuous month count width span const duration = Math.max(1, endMonth - startMonth + 1); return { projectName: project.projectName, startOffset: startMonth, duration: duration, color: project.color, rawStartDate: project.startDate, rawEndDate: project.endDate, }; }); }, [projects]); // 2. Dynamic Year calculations pulled safely from the project timeline data const currentYear = useMemo(() => { if (projects.length === 0) return new Date().getFullYear(); return new Date(projects[0].startDate).getFullYear(); }, [projects]); const currentMonth = new Date().getMonth(); // Custom tooltips configuration mapping to raw date text strings const CustomTooltip = ({ active, payload }: any) => { if (active && payload && payload.length) { const data = payload[0].payload; return (

{data.projectName}

{data.rawStartDate} → {data.rawEndDate}

); } return null; }; return ( {/* Chart Header & Dynamic Legends */}

Project Timeline — {currentYear}

{projects.map((project) => (
{project.projectName}
))}
Today
{/* Chart Canvas Wrap */}
months[value]} tickLine={false} axisLine={false} orientation="top" className="text-xs font-medium text-muted-foreground" /> } /> {/* "Today" Reference Line indicator */} {/* Invisible offset pushing real data blocks forward to match target calendar periods */} {/* Rendered Colored Blocks */} {chartData.map((entry, index) => ( ))}
); }