import React, { useMemo, useCallback, useState, useEffect, useRef } from 'react'; import { createPortal } from 'react-dom'; import { Button, Typography, Dropdown, Popconfirm, Tooltip, Space, Badge, Divider } from 'antd'; import { DeleteOutlined, CloseOutlined, RetweetOutlined, UserAddOutlined, InboxOutlined, TagsOutlined, UsergroupAddOutlined, FlagOutlined, BulbOutlined, MoreOutlined } from '@ant-design/icons'; import { useSelector, useDispatch } from 'react-redux'; import { RootState } from '@/app/store'; import { useAppSelector } from '@/hooks/useAppSelector'; import { selectTasks } from '@/features/projects/bulkActions/bulkActionSlice'; import { IProjectTask } from '@/types/project/projectTasksViewModel.types'; import { useBulkActionTranslations } from '@/hooks/useTranslationPreloader'; import LabelsDropdown from '@/components/taskListCommon/task-list-bulk-actions-bar/components/LabelsDropdown'; import AssigneesDropdown from '@/components/taskListCommon/task-list-bulk-actions-bar/components/AssigneesDropdown'; import { ITaskLabel } from '@/types/tasks/taskLabel.types'; import { ITeamMemberViewModel } from '@/types/teamMembers/teamMembersGetResponse.types'; import { InputRef } from 'antd/es/input'; import { CheckboxChangeEvent } from 'antd/es/checkbox'; import TaskTemplateDrawer from '@/components/task-templates/task-template-drawer'; import { useAuthService } from '@/hooks/useAuth'; const { Text } = Typography; interface OptimizedBulkActionBarProps { selectedTaskIds: string[]; totalSelected: number; projectId: string; onClearSelection?: () => void; onBulkStatusChange?: (statusId: string) => void; onBulkPriorityChange?: (priorityId: string) => void; onBulkPhaseChange?: (phaseId: string) => void; onBulkAssignToMe?: () => void; onBulkAssignMembers?: (memberIds: string[]) => void; onBulkAddLabels?: (labelIds: string[]) => void; onBulkArchive?: () => void; onBulkDelete?: () => void; onBulkDuplicate?: () => void; onBulkExport?: () => void; onBulkSetDueDate?: (date: string) => void; } // Performance-optimized memoized action button component const ActionButton = React.memo<{ icon: React.ReactNode; tooltip: string; onClick?: () => void; loading?: boolean; danger?: boolean; disabled?: boolean; isDarkMode: boolean; badge?: number; }>(({ icon, tooltip, onClick, loading = false, danger = false, disabled = false, isDarkMode, badge }) => { const buttonStyle = useMemo(() => ({ background: 'transparent', color: isDarkMode ? '#e5e7eb' : '#374151', border: 'none', display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '6px', height: '32px', width: '32px', fontSize: '14px', borderRadius: '6px', transition: 'all 0.15s cubic-bezier(0.4, 0, 0.2, 1)', cursor: disabled ? 'not-allowed' : 'pointer', opacity: disabled ? 0.5 : 1, ...(danger && { color: '#ef4444', }), }), [isDarkMode, danger, disabled]); const hoverStyle = useMemo(() => ({ backgroundColor: isDarkMode ? (danger ? 'rgba(239, 68, 68, 0.1)' : 'rgba(255, 255, 255, 0.1)') : (danger ? 'rgba(239, 68, 68, 0.1)' : 'rgba(0, 0, 0, 0.05)'), transform: 'scale(1.05)', }), [isDarkMode, danger]); const [isHovered, setIsHovered] = useState(false); const combinedStyle = useMemo(() => ({ ...buttonStyle, ...(isHovered && !disabled ? hoverStyle : {}), }), [buttonStyle, hoverStyle, isHovered, disabled]); const ButtonComponent = (