import { useEffect, useRef, useState } from "react"; // ui import { Tooltip } from "@plane/ui"; // helpers import { renderDateFormat, renderShortDateWithYearFormat } from "helpers/date-time.helper"; // types import { IUserActivity } from "types"; // constants import { DAYS, MONTHS } from "constants/project"; type Props = { activities: IUserActivity[] | undefined; }; export const ActivityGraph: React.FC = ({ activities }) => { const ref = useRef(null); const [width, setWidth] = useState(0); const today = new Date(); const lastMonth = new Date(today.getFullYear(), today.getMonth() - 1, 1); const twoMonthsAgo = new Date(today.getFullYear(), today.getMonth() - 2, 1); const threeMonthsAgo = new Date(today.getFullYear(), today.getMonth() - 3, 1); const fourMonthsAgo = new Date(today.getFullYear(), today.getMonth() - 4, 1); const fiveMonthsAgo = new Date(today.getFullYear(), today.getMonth() - 5, 1); const recentMonths = [fiveMonthsAgo, fourMonthsAgo, threeMonthsAgo, twoMonthsAgo, lastMonth, today]; const getDatesOfMonth = (dateOfMonth: Date) => { const month = dateOfMonth.getMonth(); const year = dateOfMonth.getFullYear(); const dates = []; const date = new Date(year, month, 1); while (date.getMonth() === month && date < new Date()) { dates.push(renderDateFormat(new Date(date))); date.setDate(date.getDate() + 1); } return dates; }; const recentDates = [ ...getDatesOfMonth(recentMonths[0]), ...getDatesOfMonth(recentMonths[1]), ...getDatesOfMonth(recentMonths[2]), ...getDatesOfMonth(recentMonths[3]), ...getDatesOfMonth(recentMonths[4]), ...getDatesOfMonth(recentMonths[5]), ]; const activitiesIntensity = (activityCount: number) => { if (activityCount <= 3) return "opacity-20"; else if (activityCount > 3 && activityCount <= 6) return "opacity-40"; else if (activityCount > 6 && activityCount <= 9) return "opacity-80"; else return ""; }; const addPaddingTiles = () => { const firstDateDay = new Date(recentDates[0]).getDay(); for (let i = 0; i < firstDateDay; i++) recentDates.unshift(""); }; addPaddingTiles(); useEffect(() => { if (!ref.current) return; setWidth(ref.current.offsetWidth); }, [ref]); return (
{DAYS.map((day, index) => (
{index % 2 === 0 && day.substring(0, 3)}
))}
{recentMonths.map((month, index) => (
{MONTHS[month.getMonth()].substring(0, 3)}
))}
{recentDates.map((date, index) => { const isActive = activities?.find((a) => a.created_date === date); return (
); })}
Less More
); };