import { styled } from '@linaria/react'; import { autoUpdate, useFloating } from '@floating-ui/react'; import { motion } from 'framer-motion'; import { type MouseEvent as ReactMouseEvent } from 'react'; import { createPortal } from 'react-dom'; import { MENTION_MENU_DROPDOWN_CLICK_OUTSIDE_ID } from '@/ui/input/constants/MentionMenuDropdownClickOutsideId'; import { MentionMenuListItem } from '@/mention/components/MentionMenuListItem'; import { type CustomMentionMenuProps, type MentionItem, } from '@/blocknote-editor/types/types'; import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent'; import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; import { OverlayContainer } from '@/ui/layout/overlay/components/OverlayContainer'; import { isDefined } from 'twenty-shared/utils'; export type { MentionItem }; const MenuPixelWidth = 240; const StyledContainer = styled.div` height: 1px; width: 1px; `; export const CustomMentionMenu = ({ items, selectedIndex, onItemClick, }: CustomMentionMenuProps) => { const { refs, floatingStyles } = useFloating({ placement: 'bottom-start', whileElementsMounted: autoUpdate, }); const handleContainerClick = (e: ReactMouseEvent) => { e.stopPropagation(); }; if (!isDefined(items) || items.length === 0) { return null; } const filteredItems = items.filter( (item) => isDefined(item.recordId) && isDefined(item.objectNameSingular) && isDefined(item.objectMetadataId), ); return ( <> {createPortal( {filteredItems.map((item, index) => ( onItemClick?.(item)} /> ))} , document.body, )} ); };