Newer
Older
My-Portfolio / frontend / src / components / sections / Activity.jsx
import { useState, useEffect, useRef, useContext } from "react";
import { motion } from "framer-motion";
import Heading from "../Heading";
import RightArrow from "../../assets/buttons/RightArrow.svg";
import LeftArrow from "../../assets/buttons/LeftArrow.svg";
import styles from "./Activity.module.css";
import { LoadingContext } from "../utils/LoadingContext";
import NavigationDots from "../utils/NavigationDots";

const Activity = ({ isVisible, activityData }) => {
  const [currentIndex, setCurrentIndex] = useState(0);
  const [direction, setDirection] = useState(1);
  const intervalRef = useRef(null); // Store interval reference
  const { isLoading } = useContext(LoadingContext); // Use the global loading state

  const resetTimer = () => {
    clearInterval(intervalRef.current);
    intervalRef.current = setInterval(() => {
      setDirection(1);
      setCurrentIndex((prevIndex) => (prevIndex + 1) % activityData.length);
    }, 6000);
  };

  useEffect(() => {
    if (activityData.length === 0) return;

    resetTimer(); // Start the interval when data loads

    return () => clearInterval(intervalRef.current); // Cleanup on unmount
  }, [activityData]);

  const nextCommit = () => {
    setDirection(1);
    setCurrentIndex((prevIndex) => (prevIndex + 1) % activityData.length);
    resetTimer(); // Restart the timer
  };

  const prevCommit = () => {
    setDirection(-1);
    setCurrentIndex((prevIndex) =>
      prevIndex === 0 ? activityData.length - 1 : prevIndex - 1
    );
    resetTimer(); // Restart the timer
  };

  if (isLoading) return <div>Loading...</div>; // Use global loading state
  if (!activityData.length) return <div>No recent activity found</div>;

  return (
    <motion.div
      id="activity"
      className="min-h-[80vh] pt-2 sm:pt-10"
      initial={{ opacity: 0, y: 100 }}
      animate={isVisible ? { opacity: 1, y: 0 } : { opacity: 0, y: 100 }}
      transition={{ duration: 0.2, ease: "easeOut" }}
    >
      <div className={styles["activity-container"]}>
        <Heading
          title="Development Activity"
          highlightWords={[{ word: "Activity", color: "text-orange-500" }]}
        />
        <NavigationDots currentSectionId="activity" />
        {/* Content Wrapper */}
        <div className="flex flex-col items-center justify-center min-h-[300px] w-full">
          <div className={styles["activity-card"]}>
            <motion.div
              key={currentIndex}
              initial={{ x: direction * 100, opacity: 0 }}
              animate={{ x: 0, opacity: 1 }}
              exit={{ x: -direction * 100, opacity: 0 }}
              transition={{ duration: 0.5 }}
              className={styles["activity-content"]}
            >
              <img
                src={activityData[currentIndex]?.logoUrl || "default-logo-url"}
                alt="GitBucket Logo"
                className={styles["activity-logo"]}
              />
              <div>
                <h3 className={styles["activity-title"]}>
                  {activityData[currentIndex]?.name || "No Title"}
                </h3>
                <p className={styles["activity-details"]}>
                  Author: {activityData[currentIndex]?.author} -{" "}
                  {new Date(activityData[currentIndex]?.date).toLocaleString()}
                </p>
              </div>
            </motion.div>

            <a
              href={activityData[currentIndex]?.url}
              className={styles["activity-link"]}
              target="_blank"
              rel="noopener noreferrer"
            >
              View Commit
            </a>
          </div>

          {/* Buttons */}
          <div className={styles["activity-buttons"]}>
            <button onClick={prevCommit} className={styles["activity-button"]}>
              <img src={LeftArrow} alt="Previous" />
            </button>

            <button onClick={nextCommit} className={styles["activity-button"]}>
              <img src={RightArrow} alt="Next" />
            </button>
          </div>
        </div>
      </div>
    </motion.div>
  );
};

export default Activity;