import React, { useState, useRef, useEffect, useMemo, useCallback } from 'react'; import { createPortal } from 'react-dom'; import { useAppSelector } from '@/hooks/useAppSelector'; import { useSocket } from '@/socket/socketContext'; import { SocketEvents } from '@/shared/socket-events'; import { Task } from '@/types/task-management.types'; import { MinusOutlined, PauseOutlined, DoubleRightOutlined } from '@ant-design/icons'; interface TaskPriorityDropdownProps { task: Task; projectId: string; isDarkMode?: boolean; } const TaskPriorityDropdown: React.FC = ({ task, projectId, isDarkMode = false }) => { const { socket, connected } = useSocket(); const [isOpen, setIsOpen] = useState(false); const [dropdownPosition, setDropdownPosition] = useState({ top: 0, left: 0 }); const buttonRef = useRef(null); const dropdownRef = useRef(null); const priorityList = useAppSelector(state => state.priorityReducer.priorities); // Find current priority details const currentPriority = useMemo(() => { return priorityList.find(priority => priority.name?.toLowerCase() === task.priority?.toLowerCase() || priority.id === task.priority ); }, [priorityList, task.priority]); // Handle priority change const handlePriorityChange = useCallback((priorityId: string, priorityName: string) => { if (!task.id || !priorityId || !connected) return; console.log('🎯 Priority change initiated:', { taskId: task.id, priorityId, priorityName }); socket?.emit( SocketEvents.TASK_PRIORITY_CHANGE.toString(), JSON.stringify({ task_id: task.id, priority_id: priorityId, team_id: projectId, // Using projectId as teamId }) ); setIsOpen(false); }, [task.id, connected, socket, projectId]); // Calculate dropdown position and handle outside clicks useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (buttonRef.current && buttonRef.current.contains(event.target as Node)) { return; // Don't close if clicking the button } if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { setIsOpen(false); } }; if (isOpen && buttonRef.current) { // Calculate position const rect = buttonRef.current.getBoundingClientRect(); setDropdownPosition({ top: rect.bottom + window.scrollY + 4, left: rect.left + window.scrollX, }); document.addEventListener('mousedown', handleClickOutside); } return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, [isOpen]); // Get priority color const getPriorityColor = useCallback((priority: any) => { if (isDarkMode) { return priority?.color_code_dark || priority?.color_code || '#4b5563'; } return priority?.color_code || '#6b7280'; }, [isDarkMode]); // Get priority icon const getPriorityIcon = useCallback((priorityName: string) => { const name = priorityName?.toLowerCase(); switch (name) { case 'low': return ; case 'medium': return ; case 'high': return ; default: return ; } }, []); // Format priority name for display const formatPriorityName = useCallback((name: string) => { if (!name) return name; return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase(); }, []); if (!task.priority) return null; return ( <> {/* Priority Button - Simple text display like status */} {/* Dropdown Menu */} {isOpen && createPortal(
{/* Priority Options */}
{priorityList.map((priority, index) => { const isSelected = priority.name?.toLowerCase() === task.priority?.toLowerCase() || priority.id === task.priority; return ( ); })}
, document.body )} {/* CSS Animations */} {isOpen && createPortal( , document.head )} ); }; export default TaskPriorityDropdown;