// Copyright 2020 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import React from 'react'; import { useEscapeHandling } from '../../hooks/useEscapeHandling'; export type PropsType = { conversationId: string; hasOpenModal: boolean; isSelectMode: boolean; onExitSelectMode: () => void; processAttachments: (options: { conversationId: string; files: ReadonlyArray; }) => void; renderCompositionArea: () => JSX.Element; renderConversationHeader: () => JSX.Element; renderTimeline: () => JSX.Element; renderPanel: () => JSX.Element | undefined; }; export function ConversationView({ conversationId, hasOpenModal, isSelectMode, onExitSelectMode, processAttachments, renderCompositionArea, renderConversationHeader, renderTimeline, renderPanel, }: PropsType): JSX.Element { const onDrop = React.useCallback( (event: React.DragEvent) => { if (!event.dataTransfer) { return; } if (event.dataTransfer.types[0] !== 'Files') { return; } event.stopPropagation(); event.preventDefault(); const { files } = event.dataTransfer; processAttachments({ conversationId, files: Array.from(files), }); }, [conversationId, processAttachments] ); const onPaste = React.useCallback( (event: React.ClipboardEvent) => { if (!event.clipboardData) { return; } const { items } = event.clipboardData; const anyImages = [...items].some( item => item.type.split('/')[0] === 'image' ); if (!anyImages) { return; } event.stopPropagation(); event.preventDefault(); const files: Array = []; for (let i = 0; i < items.length; i += 1) { if (items[i].type.split('/')[0] === 'image') { const file = items[i].getAsFile(); if (file) { files.push(file); } } } processAttachments({ conversationId, files, }); }, [conversationId, processAttachments] ); useEscapeHandling( isSelectMode && !hasOpenModal ? onExitSelectMode : undefined ); return (
{renderConversationHeader()}
{renderTimeline()}
{renderCompositionArea()}
{renderPanel()}
); }