import type { FC } from '../../../lib/teact/teact'; import { memo, useEffect, useState } from '../../../lib/teact/teact'; import { getActions, withGlobal } from '../../../global'; import type { ApiPeer } from '../../../api/types'; import { getChatTitle, getUserFirstOrLastName, getUserFullName, isChatBasicGroup, } from '../../../global/helpers'; import { isApiPeerChat, isApiPeerUser } from '../../../global/helpers/peers'; import { selectPeer } from '../../../global/selectors'; import buildClassName from '../../../util/buildClassName'; import useCurrentOrPrev from '../../../hooks/useCurrentOrPrev'; import useFlag from '../../../hooks/useFlag'; import useLastCallback from '../../../hooks/useLastCallback'; import useOldLang from '../../../hooks/useOldLang'; import useHeaderPane, { type PaneState } from '../hooks/useHeaderPane'; import Button from '../../ui/Button'; import Checkbox from '../../ui/Checkbox'; import ConfirmDialog from '../../ui/ConfirmDialog'; import './ChatReportPane.scss'; type OwnProps = { chatId: string; className?: string; isAutoArchived?: boolean; canReportSpam?: boolean; canAddContact?: boolean; canBlockContact?: boolean; onPaneStateChange?: (state: PaneState) => void; }; type StateProps = { currentUserId?: string; peer?: ApiPeer; }; const ChatReportPane: FC = ({ chatId, className, isAutoArchived, canReportSpam, canAddContact, canBlockContact, peer, currentUserId, onPaneStateChange, }) => { const { openAddContactDialog, blockUser, reportSpam, deleteChat, leaveChannel, deleteChatUser, deleteHistory, toggleChatArchived, hidePeerSettingsBar, } = getActions(); const lang = useOldLang(); const [isBlockUserModalOpen, openBlockUserModal, closeBlockUserModal] = useFlag(); const [shouldReportSpam, setShouldReportSpam] = useState(true); const [shouldDeleteChat, setShouldDeleteChat] = useState(true); const renderingPeer = useCurrentOrPrev(peer); const chat = renderingPeer && isApiPeerChat(renderingPeer) ? renderingPeer : undefined; const user = renderingPeer && isApiPeerUser(renderingPeer) ? renderingPeer : undefined; const isBasicGroup = chat && isChatBasicGroup(chat); const renderingCanAddContact = useCurrentOrPrev(canAddContact); const renderingCanBlockContact = useCurrentOrPrev(canBlockContact); const renderingCanReportSpam = useCurrentOrPrev(canReportSpam); const renderingIsAutoArchived = useCurrentOrPrev(isAutoArchived); const handleAddContact = useLastCallback(() => { openAddContactDialog({ userId: chatId }); if (renderingIsAutoArchived) { toggleChatArchived({ id: chatId }); } }); const handleConfirmBlock = useLastCallback(() => { closeBlockUserModal(); blockUser({ userId: chatId }); if (renderingCanReportSpam && shouldReportSpam) { reportSpam({ chatId }); } if (shouldDeleteChat) { deleteChat({ chatId }); } }); const handleCloseReportPane = useLastCallback(() => { hidePeerSettingsBar({ peerId: chatId }); }); const handleChatReportSpam = useLastCallback(() => { closeBlockUserModal(); reportSpam({ chatId }); if (isBasicGroup) { deleteChatUser({ chatId, userId: currentUserId! }); deleteHistory({ chatId, shouldDeleteForAll: false }); } else { leaveChannel({ chatId }); } }); const hasAnyButton = canAddContact || canBlockContact || canReportSpam; const isRendering = Boolean(hasAnyButton && peer); useEffect(() => { if (!isRendering) { closeBlockUserModal(); } }, [isRendering]); const { ref, shouldRender } = useHeaderPane({ isOpen: isRendering, onStateChange: onPaneStateChange, }); if (!shouldRender) return undefined; return (
{renderingCanAddContact && ( )} {renderingCanBlockContact && ( )} {renderingCanReportSpam && !renderingCanBlockContact && ( )}
); }; export default memo(withGlobal( (global, { chatId }): Complete => ({ currentUserId: global.currentUserId, peer: selectPeer(global, chatId), }), )(ChatReportPane));