import React, { useState, useRef, useEffect } from 'react'; import { createPortal } from 'react-dom'; import { ChevronDownIcon, ArrowDownIcon, ArrowUpIcon, FireIcon, } from '@heroicons/react/24/outline'; import { PriorityType } from '../../entities/Task'; import { useTranslation } from 'react-i18next'; interface PriorityDropdownProps { value: PriorityType; onChange: (value: PriorityType) => void; } const PriorityDropdown: React.FC = ({ value, onChange, }) => { const { t } = useTranslation(); const priorities = [ { value: 'low', label: t('priority.low', 'Low'), icon: ( ), }, { value: 'medium', label: t('priority.medium', 'Medium'), icon: ( ), }, { value: 'high', label: t('priority.high', 'High'), icon: ( ), }, ]; 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 = 120; 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 = (priority: PriorityType) => { onChange(priority); setIsOpen(false); }; useEffect(() => { if (isOpen) { document.addEventListener('mousedown', handleClickOutside); } else { document.removeEventListener('mousedown', handleClickOutside); } return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, [isOpen]); // Convert numeric priority to string if needed const normalizedValue = typeof value === 'number' ? ['low', 'medium', 'high'][value] || 'medium' : value; const selectedPriority = priorities.find( (p) => p.value === normalizedValue ); return (
{isOpen && createPortal(
{priorities.map((priority) => ( ))}
, document.body )}
); }; export default PriorityDropdown;