import React, { FC, useCallback } from '../../../lib/teact/teact'; import { ApiMessage } from '../../../api/types'; import { IAnchorPosition } from '../../../types'; import { getMessageCopyOptions } from './helpers/copyOptions'; import useContextMenuPosition from '../../../hooks/useContextMenuPosition'; import useLang from '../../../hooks/useLang'; import Menu from '../../ui/Menu'; import MenuItem from '../../ui/MenuItem'; import './MessageContextMenu.scss'; type OwnProps = { isOpen: boolean; anchor: IAnchorPosition; message: ApiMessage; canSendNow?: boolean; canReschedule?: boolean; canReply?: boolean; canPin?: boolean; canUnpin?: boolean; canDelete?: boolean; canEdit?: boolean; canForward?: boolean; canFaveSticker?: boolean; canUnfaveSticker?: boolean; canCopy?: boolean; canCopyLink?: boolean; canSelect?: boolean; onReply: () => void; onEdit: () => void; onPin: () => void; onUnpin: () => void; onForward: () => void; onDelete: () => void; onFaveSticker: () => void; onUnfaveSticker: () => void; onSelect: () => void; onSend: () => void; onReschedule: () => void; onClose: () => void; onCloseAnimationEnd?: () => void; onCopyLink?: () => void; }; const SCROLLBAR_WIDTH = 10; const MessageContextMenu: FC = ({ isOpen, message, anchor, canSendNow, canReschedule, canReply, canEdit, canPin, canUnpin, canDelete, canForward, canFaveSticker, canUnfaveSticker, canCopy, canCopyLink, canSelect, onReply, onEdit, onPin, onUnpin, onForward, onDelete, onFaveSticker, onUnfaveSticker, onSelect, onSend, onReschedule, onClose, onCloseAnimationEnd, onCopyLink, }) => { const copyOptions = getMessageCopyOptions(message, onClose, canCopyLink ? onCopyLink : undefined); const getTriggerElement = useCallback(() => { return document.querySelector(`.active > .MessageList div[data-message-id="${message.id}"]`); }, [message.id]); const getRootElement = useCallback( () => document.querySelector('.active > .MessageList'), [], ); const getMenuElement = useCallback( () => document.querySelector('.MessageContextMenu .bubble'), [], ); const { positionX, positionY, style } = useContextMenuPosition( anchor, getTriggerElement, getRootElement, getMenuElement, SCROLLBAR_WIDTH, (document.querySelector('.MiddleHeader') as HTMLElement).offsetHeight, ); const lang = useLang(); return ( {canSendNow && {lang('MessageScheduleSend')}} {canReschedule && ( {lang('MessageScheduleEditTime')} )} {canReply && {lang('Reply')}} {canEdit && {lang('Edit')}} {canFaveSticker && ( {lang('AddToFavorites')} )} {canUnfaveSticker && ( {lang('Stickers.RemoveFromFavorites')} )} {canCopy && copyOptions.map((options) => ( {lang(options.label)} ))} {canPin && {lang('DialogPin')}} {canUnpin && {lang('DialogUnpin')}} {canForward && {lang('Forward')}} {canSelect && {lang('Common.Select')}} {canDelete && {lang('Delete')}} ); }; export default MessageContextMenu;