import React, { FC, memo, useEffect } from '../../lib/teact/teact'; import { withGlobal } from '../../lib/teact/teactn'; import { GlobalActions, MessageListType } from '../../global/types'; import { selectCanDeleteSelectedMessages, selectCanReportSelectedMessages, selectCurrentMessageList, selectSelectedMessagesCount, } from '../../modules/selectors'; import { pick } from '../../util/iteratees'; 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 MenuItem from '../ui/MenuItem'; 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; selectedMessageIds?: number[]; }; type DispatchProps = Pick; const MessageSelectToolbar: FC = ({ canPost, isActive, messageListType, isSchedule, selectedMessagesCount, canDeleteMessages, canReportMessages, selectedMessageIds, exitMessageSelectMode, openForwardMenuForSelectedMessages, }) => { 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 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', ); return (
{formattedMessagesCount} {!!selectedMessagesCount && (
{messageListType !== 'scheduled' && ( {lang('Forward')} )} {canReportMessages && ( {lang('Report')} )} {lang('Delete')}
)}
); }; export default memo(withGlobal( (global): StateProps => { const { type: messageListType } = selectCurrentMessageList(global) || {}; const { canDelete } = selectCanDeleteSelectedMessages(global); const canReport = selectCanReportSelectedMessages(global); const { messageIds: selectedMessageIds } = global.selectedMessages || {}; return { isSchedule: messageListType === 'scheduled', selectedMessagesCount: selectSelectedMessagesCount(global), canDeleteMessages: canDelete, canReportMessages: canReport, selectedMessageIds, }; }, (setGlobal, actions): DispatchProps => pick(actions, ['exitMessageSelectMode', 'openForwardMenuForSelectedMessages']), )(MessageSelectToolbar));