import React, { useState, useRef, useEffect, memo } from 'react'; import { motion } from 'framer-motion'; import type { TabbedContainerProps } from '../types/TabbedContainerProps'; const TabbedContainer: React.FC = ({ tabs }) => { const [activeTab, setActiveTab] = useState(0); const [hoveredTab, setHoveredTab] = useState(null); const [tabWidth, setTabWidth] = useState(0); const [position, setPosition] = useState(0); const positionRef = useRef(position); // Function to handle message const handleMessage = (event: MessageEvent) => { if (event.data === "popupClosed") { setActiveTab(0); } }; useEffect(() => { // Add event listener for 'message' event window.addEventListener("message", handleMessage); // Cleanup return () => { window.removeEventListener("message", handleMessage); }; }, []); useEffect(() => { const newPosition = -activeTab * 100; setPosition(newPosition); positionRef.current = newPosition; }, [activeTab]); const containerRef = useRef(null); const springTransition = { type: 'spring', stiffness: 250, damping: 25 }; useEffect(() => { if (containerRef.current) { // @ts-expect-error for some reason its giving an error in TS but it works... const width = containerRef.current.getBoundingClientRect().width; setTabWidth(width / tabs.length); } }, [tabs.length]); const calcXPos = (index: number | null) => { if (index !== null) { return tabWidth * index; } return tabWidth * activeTab; }; return ( <>
{tabs.map((tab, index) => ( ))}
{tabs.map((tab, index) => (
{tab.content}
))}
); }; export default memo(TabbedContainer);