import React, { FC, memo, useCallback, useEffect, } from '../../lib/teact/teact'; import { getDispatch, withGlobal } from '../../lib/teact/teactn'; import { MessageListType } from '../../global/types'; import { selectCanDeleteSelectedMessages, selectCanDownloadSelectedMessages, selectCanReportSelectedMessages, selectCurrentMessageList, selectHasProtectedMessage, selectSelectedMessagesCount, } from '../../modules/selectors'; import useFlag from '../../hooks/useFlag'; import captureKeyboardListeners from '../../util/captureKeyboardListeners'; import buildClassName from '../../util/buildClassName'; import usePrevious from '../../hooks/usePrevious'; import useLang from '../../hooks/useLang'; import Button from '../ui/Button'; import DeleteSelectedMessageModal from './DeleteSelectedMessageModal'; import ReportMessageModal from '../common/ReportMessageModal'; import './MessageSelectToolbar.scss'; export type OwnProps = { isActive?: boolean; canPost?: boolean; messageListType?: MessageListType; }; type StateProps = { isSchedule: boolean; selectedMessagesCount?: number; canDeleteMessages?: boolean; canReportMessages?: boolean; canDownloadMessages?: boolean; hasProtectedMessage?: boolean; selectedMessageIds?: number[]; }; const MessageSelectToolbar: FC = ({ canPost, isActive, messageListType, isSchedule, selectedMessagesCount, canDeleteMessages, canReportMessages, canDownloadMessages, hasProtectedMessage, selectedMessageIds, }) => { const { exitMessageSelectMode, openForwardMenuForSelectedMessages, downloadSelectedMessages, } = getDispatch(); const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag(); const [isReportModalOpen, openReportModal, closeReportModal] = useFlag(); useEffect(() => { return isActive && !isDeleteModalOpen && !isReportModalOpen ? captureKeyboardListeners({ onBackspace: openDeleteModal, onDelete: openDeleteModal, onEsc: exitMessageSelectMode, }) : undefined; }, [isActive, isDeleteModalOpen, isReportModalOpen, openDeleteModal, exitMessageSelectMode]); const handleDownload = useCallback(() => { downloadSelectedMessages(); exitMessageSelectMode(); }, [downloadSelectedMessages, exitMessageSelectMode]); const prevSelectedMessagesCount = usePrevious(selectedMessagesCount || undefined, true); const renderingSelectedMessagesCount = isActive ? selectedMessagesCount : prevSelectedMessagesCount; const lang = useLang(); const formattedMessagesCount = lang('VoiceOver.Chat.MessagesSelected', renderingSelectedMessagesCount, 'i'); const className = buildClassName( 'MessageSelectToolbar', canPost && 'with-composer', isActive && 'shown', ); const renderButton = ( icon: string, label: string, onClick: AnyToVoidFunction, disabled?: boolean, destructive?: boolean, ) => { return (
); }; return (
{formattedMessagesCount} {!!selectedMessagesCount && (
{messageListType !== 'scheduled' && ( renderButton( 'forward', lang('Chat.ForwardActionHeader'), openForwardMenuForSelectedMessages, hasProtectedMessage, ) )} {canReportMessages && ( renderButton('flag', lang('Conversation.ReportMessages'), openReportModal) )} {canDownloadMessages && ( renderButton('download', lang('lng_media_download'), handleDownload, hasProtectedMessage) )} {renderButton('delete', lang('EditAdminGroupDeleteMessages'), openDeleteModal, !canDeleteMessages, true)}
)}
); }; export default memo(withGlobal( (global): StateProps => { const { type: messageListType, chatId } = selectCurrentMessageList(global) || {}; const { canDelete } = selectCanDeleteSelectedMessages(global); const canReport = selectCanReportSelectedMessages(global); const canDownload = selectCanDownloadSelectedMessages(global); const { messageIds: selectedMessageIds } = global.selectedMessages || {}; const hasProtectedMessage = chatId ? selectHasProtectedMessage(global, chatId, selectedMessageIds) : false; return { isSchedule: messageListType === 'scheduled', selectedMessagesCount: selectSelectedMessagesCount(global), canDeleteMessages: canDelete, canReportMessages: canReport, canDownloadMessages: canDownload, selectedMessageIds, hasProtectedMessage, }; }, )(MessageSelectToolbar));