import { useRef, useState } from 'react'; import { createPortal } from 'react-dom'; import { DropResult, OnDragEndResponder, ResponderProvided, } from '@hello-pangea/dnd'; import { IconMinus, IconPlus } from '@/ui/display/icon'; import { AppTooltip } from '@/ui/display/tooltip/AppTooltip'; import { IconInfoCircle } from '@/ui/input/constants/icons'; import { DraggableItem } from '@/ui/layout/draggable-list/components/DraggableItem'; import { DraggableList } from '@/ui/layout/draggable-list/components/DraggableList'; import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; import { StyledDropdownMenuSubheader } from '@/ui/layout/dropdown/components/StyledDropdownMenuSubheader'; import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem'; import { MenuItemDraggable } from '@/ui/navigation/menu-item/components/MenuItemDraggable'; import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside'; import { isDefined } from '~/utils/isDefined'; import { ViewFieldForVisibility } from '../types/ViewFieldForVisibility'; type ViewFieldsVisibilityDropdownSectionProps = { fields: ViewFieldForVisibility[]; onVisibilityChange: (field: ViewFieldForVisibility) => void; title: string; isDraggable: boolean; onDragEnd?: OnDragEndResponder; }; export const ViewFieldsVisibilityDropdownSection = ({ fields, onVisibilityChange, title, isDraggable, onDragEnd, }: ViewFieldsVisibilityDropdownSectionProps) => { const handleOnDrag = (result: DropResult, provided: ResponderProvided) => { onDragEnd?.(result, provided); }; const [openToolTipIndex, setOpenToolTipIndex] = useState(); const handleInfoButtonClick = (index: number) => { if (index === openToolTipIndex) setOpenToolTipIndex(undefined); else setOpenToolTipIndex(index); }; const getIconButtons = (index: number, field: ViewFieldForVisibility) => { if (field.infoTooltipContent) { return [ { Icon: IconInfoCircle, onClick: () => handleInfoButtonClick(index), isActive: openToolTipIndex === index, }, { Icon: field.isVisible ? IconMinus : IconPlus, onClick: () => onVisibilityChange(field), }, ]; } if (!field.infoTooltipContent) { return [ { Icon: field.isVisible ? IconMinus : IconPlus, onClick: () => onVisibilityChange(field), }, ]; } }; const ref = useRef(null); useListenClickOutside({ refs: [ref], callback: () => { setOpenToolTipIndex(undefined); }, }); return (
{title} {isDraggable ? ( {fields .filter(({ index, size }) => index !== 0 || !size) .map((field, index) => ( } /> ))} } /> ) : ( fields.map((field, index) => ( )) )} {isDefined(openToolTipIndex) && createPortal( , document.body, )}
); };