import './AddButton.scss'; import ArrowsButton from './ArrowsButton/ArrowsButton'; import Icon from '../Icon'; import { useRef, useState } from 'react'; import { createPortal } from 'react-dom'; import { AddResourceButtonProps, DirectionalArrow, validateArrows, } from './type'; import usePortalPosition from '../../hooks/usePortalPosition'; const AddButton = ({ id = 'AddModule', variant = 'primary', directionalArrow = [ { direction: 'right', menuOptions: [ { label: 'Sub Module', value: 'sub_module', icon: '', disable: false }, ], }, ], zIndex = 99, }: AddResourceButtonProps) => { const [isHovered, setIsHovered] = useState(false); const [positionArrowContainer, setPositionArrowContainer] = useState<{ left: number; top: number; }>({ left: 0, top: 0 }); const [activeArrow, setActiveArrow] = useState(''); const arrowContainerRef = useRef(null); const validArrows = validateArrows(directionalArrow); const portalPosition = usePortalPosition(arrowContainerRef, isHovered); const handleHover = () => { if (!activeArrow) { setIsHovered(true); } const { positionX, positionY } = portalPosition(arrowContainerRef); setPositionArrowContainer({ left: positionX, top: positionY }); }; const handleLeave = () => { setIsHovered(false); setActiveArrow(''); }; const handleArrowClick = (direction: string) => { if (activeArrow === direction) { setActiveArrow(''); setIsHovered(false); } else { setActiveArrow(direction); setIsHovered(true); } }; const getArrowButtonClass = () => { const directions = validArrows .map((arrow: { direction: string }) => arrow.direction) .sort() .join('-'); return `ff-${directions}`; }; return (
{isHovered && createPortal(
{directionalArrow.map( ({ direction, menuOptions }: DirectionalArrow, index: number) => ( handleArrowClick(direction)} menuOptions={menuOptions} isActive={activeArrow === direction} variant={variant} /> ) )}
, document.body )}
); }; export default AddButton;