import React, { useState, useEffect, useRef } from 'react'; import { Box, useMediaQuery, useTheme } from '@mui/material'; import { TimelineProps, TimelineOrientation } from './types'; import TimelineItem from './TimelineItem'; const Timeline: React.FC = ({ items, orientation = 'vertical', className }) => { const theme = useTheme(); const isMobile = useMediaQuery(theme.breakpoints.down('sm')); const timelineRef = useRef(null); // Force vertical orientation on mobile const effectiveOrientation: TimelineOrientation = isMobile ? 'vertical' : orientation; // Track which items are visible based on scroll position const [visibleItems, setVisibleItems] = useState( Array(items.length).fill(false) ); // Handle scroll-based animations useEffect(() => { const handleScroll = () => { if (timelineRef.current) { const timelineRect = timelineRef.current.getBoundingClientRect(); const timelineItems = timelineRef.current.querySelectorAll('[data-timeline-item]'); timelineItems.forEach((item, index) => { const rect = item.getBoundingClientRect(); const isVisible = rect.top <= window.innerHeight * 0.8 && rect.bottom >= window.innerHeight * 0.2; setVisibleItems(prev => { if (prev[index] !== isVisible) { const newState = [...prev]; newState[index] = isVisible; return newState; } return prev; }); }); } }; // Initial check handleScroll(); // Add scroll listener window.addEventListener('scroll', handleScroll); return () => window.removeEventListener('scroll', handleScroll); }, [items.length]); return ( {items.map((item, index) => ( ))} ); }; export default Timeline;