import React, { useState, useRef, useEffect } from 'react'; import { createPortal } from 'react-dom'; import { ChevronDownIcon, Squares2X2Icon } from '@heroicons/react/24/outline'; import { Area } from '../../entities/Area'; import { useTranslation } from 'react-i18next'; interface AreaDropdownProps { value: number | null; onChange: (value: number | null) => void; areas: Area[]; } const AreaDropdown: React.FC = ({ value, onChange, areas, }) => { const { t } = useTranslation(); const [isOpen, setIsOpen] = useState(false); const [position, setPosition] = useState({ top: 0, left: 0, width: 0, openUpward: false, }); const dropdownRef = useRef(null); const menuRef = useRef(null); const handleToggle = () => { if (!isOpen && dropdownRef.current) { const rect = dropdownRef.current.getBoundingClientRect(); const spaceBelow = window.innerHeight - rect.bottom; const spaceAbove = rect.top; const menuHeight = Math.min(areas.length * 40 + 50, 200); // Dynamic height based on areas const openUpward = spaceAbove > spaceBelow && spaceBelow < menuHeight; setPosition({ top: openUpward ? rect.top - menuHeight - 8 : rect.bottom + 8, left: rect.left, width: rect.width, openUpward, }); } setIsOpen(!isOpen); }; const handleClickOutside = (event: MouseEvent) => { if ( dropdownRef.current && !dropdownRef.current.contains(event.target as Node) && menuRef.current && !menuRef.current.contains(event.target as Node) ) { setIsOpen(false); } }; const handleSelect = (areaId: number | null) => { onChange(areaId); setIsOpen(false); }; useEffect(() => { if (isOpen) { document.addEventListener('mousedown', handleClickOutside); } else { document.removeEventListener('mousedown', handleClickOutside); } return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, [isOpen]); const selectedArea = areas.find((area) => area.id === value); return (
{isOpen && createPortal(
{/* No Area option */} {/* Area options */} {areas.map((area) => ( ))}
, document.body )}
); }; export default AreaDropdown;