'use client'; import { CheckCircle2, Copy, Forward, Pencil, Reply, Trash2 } from 'lucide-react'; import { ChatMessageReactions } from '@/components/chat/chat-message-reactions'; import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuSeparator, ContextMenuTrigger } from '@/components/ui/context-menu'; import type { ChatMessage } from '@/lib/api'; import { QUICK_REACTIONS, canDeleteMessage, canEditMessage, getMessageCopyText } from '@/lib/chat-message-utils'; import { cn } from '@/lib/utils'; interface ChatMessageContextMenuProps { message: ChatMessage; userId?: string; isE2E?: boolean; visibleText?: string; children: React.ReactNode; onEdit?: () => void; onDelete?: () => void; onReply?: () => void; onForward?: () => void; onSelect?: () => void; onToggleReaction?: (emoji: string) => void; onCopy?: () => void; } export function ChatMessageContextMenu({ message, userId, isE2E, visibleText, children, onEdit, onDelete, onReply, onForward, onSelect, onToggleReaction, onCopy }: ChatMessageContextMenuProps) { const editable = canEditMessage(message, userId, isE2E); const deletable = canDeleteMessage(message, userId); const copyText = getMessageCopyText(message, visibleText); const disabled = message.isDeleted; return ( {children} {!disabled ? ( <>
{QUICK_REACTIONS.map((emoji) => ( ))}
) : null} {onReply && !disabled ? ( Ответить ) : null} {editable ? ( Изменить ) : null} {copyText ? ( { void navigator.clipboard.writeText(copyText); onCopy?.(); }} > Копировать текст ) : null} {onForward && !disabled && !message.isEncrypted ? ( Переслать ) : null} {deletable ? ( Удалить ) : null} {onSelect && !disabled ? ( <> Выделить ) : null} {!disabled && message.reactions?.length ? (
) : null}
); } interface SelectableMessageWrapperProps { selected?: boolean; selectionMode?: boolean; align?: 'left' | 'right'; onClick?: () => void; className?: string; children: React.ReactNode; } export function SelectableMessageWrapper({ selected, selectionMode, align = 'left', onClick, className, children }: SelectableMessageWrapperProps) { return (
{selectionMode ? ( ) : null}
{children}
); }